From ba0b2be42e1fb5c307007cc8fdb3fb57101822c1 Mon Sep 17 00:00:00 2001 From: jnthn Date: Wed, 20 May 2009 21:28:23 +0200 Subject: [PATCH] Some tweaks to handle has &!foo and has &.foo. Resolves RT#64650 and RT#64270. --- src/builtins/guts.pir | 14 ++++++++++---- src/parser/actions.pm | 8 ++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/builtins/guts.pir b/src/builtins/guts.pir index 70291ed3312..21df3106938 100644 --- a/src/builtins/guts.pir +++ b/src/builtins/guts.pir @@ -802,15 +802,21 @@ and C. .param int has_itype :opt_flag .param pmc attr :slurpy :named - # twigil handling + # twigil handling (for has &!foo, we just get name as !foo) + .local int offset .local string twigil - twigil = substr name, 1, 1 + offset = 1 + $S0 = substr name, 0, 1 + if $S0 != '!' goto offset_done + offset = 0 + offset_done: + twigil = substr name, offset, 1 if twigil == '.' goto twigil_public if twigil == '!' goto twigil_done - substr name, 1, 0, '!' + substr name, offset, 0, '!' goto twigil_done twigil_public: - substr name, 1, 1, '!' + substr name, offset, 1, '!' twigil_done: $P0 = metaclass.'attributes'() diff --git a/src/parser/actions.pm b/src/parser/actions.pm index 6d22afbca04..03bf37589b3 100644 --- a/src/parser/actions.pm +++ b/src/parser/actions.pm @@ -1654,7 +1654,11 @@ method scope_declarator($/) { # accessor method for it in the block (class/grammar/role) if $var eq '.' { my $method := PAST::Block.new( :blocktype('method') ); - $method.name( substr($var.name(), 2) ); + if $var eq '&' { + $method.name( substr($var.name(), 1) ); + } else { + $method.name( substr($var.name(), 2) ); + } my $value := PAST::Var.new( :name($var.name()) ); my $readtype := trait_readtype( $var ) || 'readonly'; if $readtype eq 'CONFLICT' { @@ -1977,7 +1981,7 @@ method variable($/, $key) { } $var := PAST::Var.new( :name($varname), :node($/) ); - $var := $sigil; + $var := ~$; if $twigil { $var := $twigil; } # If namespace qualified or has a '*' twigil, it's a package var.