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
)
);
}