Author: jonathan
Date: Thu Jan  8 10:17:26 2009
New Revision: 35216

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

Log:
[rakudo] Mostly fix anonymous classes; only problem now is that .WHAT doesn't 
hand back the empty string, but should be easily fixable. 9/10 tests pass.

Modified: branches/rvar2/languages/perl6/src/builtins/guts.pir
==============================================================================
--- branches/rvar2/languages/perl6/src/builtins/guts.pir        (original)
+++ branches/rvar2/languages/perl6/src/builtins/guts.pir        Thu Jan  8 
10:17:26 2009
@@ -446,7 +446,7 @@
     if $P0 != 'grammar' goto register
     $S0 = 'Grammar'
   register:
-    p6meta.'register'(metaclass, 'parent'=>$S0)
+    .tailcall p6meta.'register'(metaclass, 'parent'=>$S0)
   no_pkgtype:
 .end
 

Modified: branches/rvar2/languages/perl6/src/parser/actions.pm
==============================================================================
--- branches/rvar2/languages/perl6/src/parser/actions.pm        (original)
+++ branches/rvar2/languages/perl6/src/parser/actions.pm        Thu Jan  8 
10:17:26 2009
@@ -1394,8 +1394,23 @@
     );
 
     #  ...and at the end of the block's initializer (after any other
-    #  items added by the block), we finalize the composition
-    $block[0].push( PAST::Op.new( :name('!meta_compose'), $?METACLASS) );
+    #  items added by the block), we finalize the composition. This
+    # returns a proto, which we need to keep around and also return at
+    # the end of initialization for anonymous classes.
+    if $<module_name> eq "" && ($?PKGDECL eq 'class' || $?PKGDECL eq 'role'
+            || $?PKGDECL eq 'grammar') {
+        $block[0].push(PAST::Op.new(
+            :pasttype('bind'),
+            PAST::Var.new(:name('proto_store'), :scope('register'), 
:isdecl(1)),
+            PAST::Op.new( :name('!meta_compose'), $?METACLASS)
+        ));
+        $block.push(PAST::Var.new(:name('proto_store'), :scope('register')));
+        $block.blocktype('immediate');
+        $block.pirflags('');
+    }
+    else {
+        $block[0].push( PAST::Op.new( :name('!meta_compose'), $?METACLASS) );
+    }
 
     make $block;
 }

Reply via email to