Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[dotnet] Fix package declarations with multiple namespace parts.
  • Loading branch information
jnthn committed Nov 21, 2010
1 parent 05db157 commit 50b66ab
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 9 deletions.
16 changes: 10 additions & 6 deletions dotnet/compiler/Actions.pm
Expand Up @@ -385,22 +385,24 @@ method package_declarator:sym<class>($/) { make package($/); }
method package_declarator:sym<role>($/) { make package($/); }

sub package($/) {
my $name := ~$<package_def><name>;
# Sort out name.
my $long_name := ~$<package_def><name>;
my @ns := pir::clone__PP($<package_def><name><identifier>);
my $name := @ns.pop;

# Prefix the class initialization with initial setup. Also install it
# in the symbol table right away, and also into $?CLASS.
my @empty;
$*PACKAGE-SETUP.unshift(PAST::Stmts.new(
PAST::Op.new( :pasttype('bind'),
PAST::Var.new( :name('type_obj'), :scope('register'), :isdecl(1) ),
PAST::Op.new(
:pasttype('callmethod'), :name('new_type'),
PAST::Var.new( :name(%*HOW{~$<sym>}), :scope('lexical') ),
PAST::Val.new( :value($name), :named('name') )
PAST::Val.new( :value($long_name), :named('name') )
)
),
PAST::Op.new( :pasttype('bind'),
PAST::Var.new( :name($name), :scope($*SCOPE eq 'my' ?? 'lexical' !! 'package'), :namespace(@empty) ),
PAST::Var.new( :name($name), :scope($*SCOPE eq 'my' ?? 'lexical' !! 'package'), :namespace(@ns) ),
PAST::Var.new( :name('type_obj'), :scope('register') )
),
PAST::Op.new( :pasttype('bind'),
Expand All @@ -415,16 +417,18 @@ sub package($/) {
}

# Parent class, if any. (XXX need to handle package vs lexical scope
# properly, nested packages, etc).
# properly).
if $<package_def><parent> {
my @parent_ns := pir::clone__PP($<package_def><parent>[0]<identifier>);
my $parent_name := @parent_ns.pop;
$*PACKAGE-SETUP.push(PAST::Op.new(
:pasttype('callmethod'), :name('add_parent'),
PAST::Op.new(
:pasttype('nqpop'), :name('get_how'),
PAST::Var.new( :name('type_obj'), :scope('register') )
),
PAST::Var.new( :name('type_obj'), :scope('register') ),
PAST::Var.new( :name(~$<package_def><parent>[0]), :namespace(@empty), :scope('package') )
PAST::Var.new( :name($parent_name), :namespace(@parent_ns), :scope('package') )
));
}

Expand Down
6 changes: 3 additions & 3 deletions dotnet/runtime/Runtime/Ops/P6list.cs
Expand Up @@ -145,13 +145,13 @@ public static RakudoObject lllist_truncate_to(ThreadContext TC, RakudoObject LLL
{
List<RakudoObject> store = ((P6list.Instance)LLList).Storage;
int count = store.Count;
int length = Ops.unbox_int(TC, Length);
if (length < count)
int length = Ops.unbox_int(TC, Length);
if (length < count)
store.RemoveRange(length - 1, count - length);
return LLList;
}
else
{
{
throw new Exception("Cannot use lllist_truncate_to if representation is not P6list");
}
}
Expand Down

0 comments on commit 50b66ab

Please sign in to comment.