When an lvalue method-as-variable is compiled, the method
op has a sibling that is an rv2cv:
a <2> sassign vKS/2 ->b
3 <$> const[IV 1] s ->4
9 <1> entersub[t3] sKRMS*/NO(),TARG ->a
4 <0> pushmark s ->5
- <1> ex-rv2sv sKM/1 ->6
5 <#> gvsv[*obj] s ->6
7 <1> method sK/1 ->8
- <1> ex-rv2sv sK/1 ->7
6 <#> gvsv[*meth] s ->7
8 <1> rv2cv /NO() ->9
Deparse didn’t know about it, and was iterating through the
children of entersub, thinking the last one was the method,
stopping at any item named ‘method_named’. So I modified it
to stop at ‘method’ as well.
} else {
$obj = $kid;
$kid = $kid->sibling;
- for (; !null ($kid->sibling) && $kid->name ne "method_named";
+ for (; !null ($kid->sibling) && $kid->name!~/^method(?:_named)?\z/;
$kid = $kid->sibling) {
push @exprs, $kid
}
# variables as method names
my $bar;
'Foo'->$bar('orz');
+'Foo'->$bar('orz') = 'a stranger stranger than before';
####
# constants as method names
'Foo'->bar('orz');