cvs-parrot  

[svn:parrot] r33215 - in trunk/languages/perl6/src: builtins parser

jonathan
Wed, 26 Nov 2008 05:03:53 -0800

Author: jonathan
Date: Wed Nov 26 05:03:40 2008
New Revision: 33215

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

Log:
[rakudo] Fix declaration and doing of roles in multi-jointed namespaces. Patch 
partly courtesy of Chris Dolan.

Modified: trunk/languages/perl6/src/builtins/guts.pir
==============================================================================
--- trunk/languages/perl6/src/builtins/guts.pir (original)
+++ trunk/languages/perl6/src/builtins/guts.pir Wed Nov 26 05:03:40 2008
@@ -401,20 +401,22 @@
     .param string name
     .local pmc info, role
 
-    # Need to make sure it ends up attached to the right
-    # namespace.
+    # Need to make sure it ends up attached to the right namespace.
+    .local pmc ns
+    ns = split '::', name
+    name = ns[-1]
     info = new 'Hash'
     info['name'] = name
-    $P0 = new 'ResizablePMCArray'
-    $P0[0] = name
-    info['namespace'] = $P0
+    info['namespace'] = ns
 
     # Create role.
     role = new 'Role', info
 
     # Stash in namespace.
-    $P0 = new 'ResizableStringArray'
-    set_hll_global $P0, name, role
+    $I0 = elements ns
+    dec $I0
+    ns = $I0
+    set_hll_global ns, name, role
 
     .return(role)
 .end

Modified: trunk/languages/perl6/src/parser/actions.pm
==============================================================================
--- trunk/languages/perl6/src/parser/actions.pm (original)
+++ trunk/languages/perl6/src/parser/actions.pm Wed Nov 26 05:03:40 2008
@@ -1594,6 +1594,13 @@
         }
         elsif $aux<sym> eq 'does' {
             # Role.
+            my @identifier := Perl6::Compiler.parse_name(~$aux<name>);
+            my $name := @identifier.pop();
+            my $role_name := PAST::Var.new(
+                                 :name($name),
+                                 :namespace(@identifier),
+                                 :scope('package'),
+                             );
             $package.push(
                 PAST::Op.new(
                     :pasttype('call'),
@@ -1602,10 +1609,7 @@
                         :name('$def'),
                         :scope('lexical')
                     ),
-                    PAST::Var.new(
-                        :name(~$aux<name>),
-                        :scope('package')
-                    )
+                    $role_name
                 )
             );
         }
  • [svn:parrot] r33215 - in trunk/languages/perl6/src: builtins parser jonathan