From: Father Chrysostomos Date: Thu, 2 Jun 2011 13:01:57 +0000 (-0700) Subject: Deparse $obj->$meth=... [perl #62498] X-Git-Tag: accepted/trunk/20130322.191538~3969 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=35a99a0826369f896a38d2665db827253fc91e46;p=platform%2Fupstream%2Fperl.git Deparse $obj->$meth=... [perl #62498] 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. --- diff --git a/dist/B-Deparse/Deparse.pm b/dist/B-Deparse/Deparse.pm index 335b3c0..e3079ad 100644 --- a/dist/B-Deparse/Deparse.pm +++ b/dist/B-Deparse/Deparse.pm @@ -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 } diff --git a/dist/B-Deparse/t/deparse.t b/dist/B-Deparse/t/deparse.t index b1bd1e2..cb0faad 100644 --- a/dist/B-Deparse/t/deparse.t +++ b/dist/B-Deparse/t/deparse.t @@ -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');