Author: pmichaud Date: Thu Jan 8 15:12:42 2009 New Revision: 35231 Modified: branches/rvar2/languages/perl6/src/builtins/guts.pir branches/rvar2/languages/perl6/src/parser/actions.pm Log: [rakudo]: Add more complete 'is export' handling. S11-modules/export.t passes. 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 15:12:42 2009 @@ -366,6 +366,32 @@ .end +=item !capture + +Combine slurpy positional and slurpy named args into a list. +Note that original order may be lost -- that's the nature +of captures. + +=cut + +.sub '!capture' + .param pmc args :slurpy + .param pmc options :slurpy :named + unless options goto done + .local pmc it + it = iter options + iter_loop: + unless it goto done + $S0 = shift it + $P0 = options[$S0] + $P0 = 'infix:=>'($S0, $P0) + push args, $P0 + goto iter_loop + done: + .tailcall args.'list'() +.end + + =item !meta_create(type, name, also) Create a metaclass object for C<type> with the given C<name>. @@ -652,12 +678,28 @@ .param pmc block .param pmc arg + .local string blockname + blockname = block .local pmc blockns, exportns blockns = block.'get_namespace'() - $P0 = split '::', 'EXPORT::ALL' - exportns = blockns.'make_namespace'($P0) - $S0 = block - exportns[$S0] = block + exportns = blockns.'make_namespace'('EXPORT') + if null arg goto arg_done + .local pmc it + arg = arg.'list'() + it = iter arg + arg_loop: + unless it goto arg_done + .local pmc tag, ns + tag = shift it + $I0 = isa tag, ['Perl6Pair'] + unless $I0 goto arg_loop + $S0 = tag.'key'() + ns = exportns.'make_namespace'($S0) + ns[blockname] = block + goto arg_loop + arg_done: + ns = exportns.'make_namespace'('ALL') + ns[blockname] = block .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 15:12:42 2009 @@ -940,13 +940,22 @@ make $past; } + method trait_auxiliary($/) { - my $sym := ~$<sym>; - my $trait; - if $sym eq 'is' || $sym eq 'does' { - $trait := ~$<name>; + my $sym := ~$<sym>; + my $trait := PAST::Op.new( :name('infix:,'), 'trait_auxiliary:' ~ $sym); + if $sym eq 'is' { + $trait.push( ~$<name> ); + if $<postcircumfix> { + my $arg := $( $<postcircumfix>[0] ); + $arg.name('!capture'); + $trait.push($arg); + } + } + elsif $sym eq 'does' { + $trait.push( ~$<name> ); } - make PAST::Op.new( :name('infix:,'), 'trait_auxiliary:' ~ $sym, $trait ); + make $trait; }