From 35a99a0826369f896a38d2665db827253fc91e46 Mon Sep 17 00:00:00 2001 From: Father Chrysostomos Date: Thu, 2 Jun 2011 06:01:57 -0700 Subject: [PATCH] Deparse $obj->$meth=... [perl #62498] MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 2 +- dist/B-Deparse/t/deparse.t | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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'); -- 2.7.4