Author: pmichaud
Date: Sat Jan  3 06:53:45 2009
New Revision: 34882

Modified:
   branches/rvar/languages/perl6/src/builtins/guts.pir
   branches/rvar/languages/perl6/src/parser/actions.pm

Log:
[rakudo]:  Refactor public accessor handling.


Modified: branches/rvar/languages/perl6/src/builtins/guts.pir
==============================================================================
--- branches/rvar/languages/perl6/src/builtins/guts.pir (original)
+++ branches/rvar/languages/perl6/src/builtins/guts.pir Sat Jan  3 06:53:45 2009
@@ -450,12 +450,6 @@
     goto twigil_done
   twigil_public:
     substr name, 1, 1, '!'
-    .const 'Sub' accessor = '!default_accessor'
-    $P0 = clone accessor
-    $P1 = box name
-    setprop $P0, 'name', $P1
-    $S0 = substr name, 2
-    metaclass.'add_method'($S0, $P0)
   twigil_done:
 
     # Add the attribute to the metaclass.
@@ -479,17 +473,6 @@
 .end
 
 
-.sub '!default_accessor' :anon :method
-    .local pmc interp, accessor
-    interp = getinterp
-    accessor = interp['sub']
-    $P0 = getprop 'name', accessor
-    $S0 = $P0
-    $P1 = getattribute self, $S0
-    .return ($P1)
-.end
-
-
 =item !keyword_class(name)
 
 Internal helper method to create a class.

Modified: branches/rvar/languages/perl6/src/parser/actions.pm
==============================================================================
--- branches/rvar/languages/perl6/src/parser/actions.pm (original)
+++ branches/rvar/languages/perl6/src/parser/actions.pm Sat Jan  3 06:53:45 2009
@@ -1410,6 +1410,8 @@
 
 
 method scope_declarator($/) {
+    our @?BLOCK;
+    my $block := @?BLOCK[0];
     my $sym   := ~$<sym>;
     my $past  := $( $<scoped> );
     my $scope := 'lexical';
@@ -1425,22 +1427,29 @@
         if $_.isa(PAST::Var) {
             my $var := $_;
 
-            my $type;
-            if +@($var<type>) { $type := $var<type>[0]; }  # FIXME
-
             # This is a variable declaration, so we set the scope in
-            # the block.  The symbol entry also tells us the
-            # implementation type of the variable (itype), any
-            # initial value for the variable (viviself), and
-            # any type constraints (type).
-            our @?BLOCK;
-            @?BLOCK[0].symbol( $var.name(), :scope($scope) );
+            # the block's symbol table as well as the variable itself.
+            $block.symbol( $var.name(), :scope($scope) );
             $var.scope($scope);
             $var.isdecl(1);
             if $scope eq 'package' { $var.lvalue(1); }
             my $init_value := $var.viviself(); 
+            my $type;
+            if +@($var<type>) { $type := $var<type>[0]; }  # FIXME
 
+            # If the var has a '.' twigil, we need to create an
+            # accessor method for it in the block (class/grammar/role)
+            if $var<twigil> eq '.' {
+                my $method := PAST::Block.new( :blocktype('method') );
+                $method.name( substr($var.name(), 2) );
+                $method.push( PAST::Var.new( :name($var.name()) ) );
+                $block[0].push($method);
+            }
+            
             if $scope eq 'attribute' {
+                # Attribute declaration.  Add code to the beginning
+                # of the block (really class/grammar/role) to
+                # create the attribute.
                 our $?METACLASS;
                 my $has := PAST::Op.new( :name('!meta_attribute'), 
                                $?METACLASS, $var.name(), $var<itype> );
@@ -1449,7 +1458,7 @@
                     $init_value.named('init_value');
                     $has.push($init_value);
                 }
-                @?BLOCK[0].push( $has );
+                $block[0].push( $has );
             }
             else { 
                 # $scope eq 'package' | 'lexical'
@@ -1542,7 +1551,7 @@
         my $varname  := $sigil ~ $twigil ~ $name;
 
         # If no twigil, but varname is 'attribute' in outer scope,
-        # it's really a private attribute and needs a '!' twigil
+        # it's really a private attribute and implies a '!' twigil
         if !$twigil {
             my $sym := outer_symbol($varname);
             if $sym && $sym<scope> eq 'attribute' { 
@@ -1613,6 +1622,7 @@
         # retrieved by <variable_declarator> if we're called from there.
         if $twigil eq '.' {
             my $vardecl := $var;
+            $vardecl.name( $sigil ~ '!' ~ $name );
             $var := PAST::Op.new( :node($/), :pasttype('callmethod'),
                 :name($name),
                 PAST::Var.new( :name('self'), :scope('lexical') )

Reply via email to