Deparse $obj->$meth=... [perl #62498]
authorFather Chrysostomos <sprout@cpan.org>
Thu, 2 Jun 2011 13:01:57 +0000 (06:01 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 2 Jun 2011 13:05:29 +0000 (06:05 -0700)
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.

dist/B-Deparse/Deparse.pm
dist/B-Deparse/t/deparse.t

index 335b3c0..e3079ad 100644 (file)
@@ -3222,7 +3222,7 @@ sub _method {
     } 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
        }
index b1bd1e2..cb0faad 100644 (file)
@@ -392,6 +392,7 @@ my $f = sub {
 # variables as method names
 my $bar;
 'Foo'->$bar('orz');
+'Foo'->$bar('orz') = 'a stranger stranger than before';
 ####
 # constants as method names
 'Foo'->bar('orz');