Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Mergeback, start on is copy
  • Loading branch information
sorear committed May 27, 2011
1 parent 7745f0d commit 673862f
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 268 deletions.
32 changes: 18 additions & 14 deletions src/NieczaActions.pm6
Expand Up @@ -607,7 +607,7 @@ method metachar:sym< » > ($/) { make ::RxOp::ZeroWidth.new(type => '>>') }

method metachar:qw ($/) {
my $cif = $<circumfix>.ast;
my @words = $cif.^isa(::Op::SimpleParcel) ?? @( $cif.items ) !! $cif;
my @words = $cif.^isa(::Op::Paren) ?? @( $cif.inside.items ) !! $cif;
@words = map *.text, @words;

make ::RxOp::Alt.new(zyg => [ map { ::RxOp::String.new(text => $_,
Expand Down Expand Up @@ -977,8 +977,8 @@ method process_nibble($/, @bits, $prefix?) {
my @tok = $sl.text.words;
@tok = map { ::Op::StringLiteral.new(|node($/), text => $_) }, @tok;

make ((@tok == 1) ?? @tok[0] !!
::Op::SimpleParcel.new(|node($/), items => @tok));
make ((@tok == 1) ?? @tok[0] !! ::Op::Paren.new(|node($/),
inside => ::Op::SimpleParcel.new(|node($/), items => @tok)));
}
}
elsif $post eq 'path' {
Expand Down Expand Up @@ -1403,13 +1403,13 @@ method dotty:sym<.*> ($/) {
make $<dottyop>.ast.meta_assign;
return;
}
if !$<dottyop>.ast.^isa(::Operator::Method) {
if !$<dottyop>.ast.^isa(::Operator::Method) || $<dottyop>.ast.meta {
$/.CURSOR.sorry("Modified method calls can only be used with actual methods");
make Operator.funop('&postfix:<++>', 1);
return Nil;
}
if $<sym> eq '.^' {
make $<dottyop>.ast.clone(:meta);
if $<sym> eq '.^' || $<sym> eq '.?' {
make $<dottyop>.ast.clone(:meta(substr($<sym>,1)));
} else {
$/.CURSOR.sorry("NYI dottyop form $<sym>");
make Operator.funop('&postfix:<++>', 1);
Expand All @@ -1423,6 +1423,8 @@ sub qpvalue($ast) {
join " ", map &qpvalue, @( $ast.items )
} elsif $ast.^isa(::Op::StringLiteral) {
$ast.text;
} elsif $ast.^isa(::Op::Paren) {
qpvalue($ast.inside);
} else {
"XXX"
}
Expand Down Expand Up @@ -2340,27 +2342,29 @@ method statement_control:if ($/) {
}

method statement_control:unless ($/) {
make ::Op::Conditional.new(|node($/), check => $<xblock>.ast[0],
false => self.block_to_immediate($/, 'cond', $<xblock>.ast[1]));
make mklet($<xblock>.ast[0], -> $cond {
::Op::Conditional.new(|node($/), check => $cond,
false => self.if_block($/, $cond, $<xblock><pblock>)) });
}

# Hack - Op::WhileLoop binds the condition to "!cond"
method statement_control:while ($/) {
make ::Op::WhileLoop.new(|node($/), check => $<xblock>.ast[0],
body => self.block_to_immediate($/, 'loop', $<xblock>.ast[1]),
:!until, :!once);
body => self.if_block($/, ::Op::LetVar.new(name => '!cond'),
$<xblock><pblock>), :!until, :!once);
}

method statement_control:until ($/) {
make ::Op::WhileLoop.new(|node($/), check => $<xblock>.ast[0],
body => self.block_to_immediate($/, 'loop', $<xblock>.ast[1]),
:until, :!once);
body => self.if_block($/, ::Op::LetVar.new(name => '!cond'),
$<xblock><pblock>), :until, :!once);
}

method statement_control:repeat ($/) {
my $until = $<wu> eq 'until';
my $check = $<xblock> ?? $<xblock>.ast[0] !! $<EXPR>.ast;
my $body = self.block_to_immediate($/, 'loop',
$<xblock> ?? $<xblock>.ast[1] !! $<pblock>.ast);
my $body = self.if_block($/, ::Op::LetVar.new(name => '!cond'),
$<xblock> ?? $<xblock><pblock> !! $<pblock>);
make ::Op::WhileLoop.new(|node($/), :$check, :$until, :$body, :once);
}

Expand Down
28 changes: 19 additions & 9 deletions src/Op.pm6
Expand Up @@ -146,7 +146,7 @@ class CallMethod is CallLike {
has $.private = False; # Bool
has $.ppath; # Array of Str
has $.pclass; # Xref, is rw
has $.ismeta = False; # Bool
has $.ismeta = ''; # Str

method adverb($adv) {
Op::CallMethod.new(receiver => $.receiver, name => $.name,
Expand All @@ -164,10 +164,18 @@ class CallMethod is CallLike {
CgOp.subcall(CgOp.stab_privatemethod(
CgOp.class_ref('mo', @( $.pclass )), $name),
$.receiver.cgop($body), self.argblock($body));
} elsif $.ismeta {
} elsif $.ismeta eq '^' {
CgOp.let($.receiver.cgop($body), -> $r {
CgOp.methodcall(CgOp.newscalar(CgOp.how(CgOp.fetch($r))),
$name, $r, self.argblock($body))});
} elsif $.ismeta eq '?' {
# TODO maybe use a lower-level check
CgOp.let($.receiver.cgop($body), -> $r { CgOp.let($name, -> $n {
CgOp.ternary(
CgOp.obj_getbool(CgOp.methodcall(CgOp.newscalar(CgOp.how(
CgOp.fetch($r))), "can", $r, CgOp.box('Str',$n))),
CgOp.methodcall($r, $n, self.argblock($body)),
CgOp.scopedlex('Nil'))})});
} else {
CgOp.methodcall($.receiver.cgop($body),
$name, self.argblock($body));
Expand Down Expand Up @@ -367,9 +375,10 @@ class WhileLoop is Op {
method code_labelled($body, $l) {
my $id = ::GLOBAL::NieczaActions.genid;

CgOp.prog(
CgOp.letn('!cond', CgOp.scopedlex('Any'),
CgOp.whileloop(+$.until, +$.once,
CgOp.obj_getbool($.check.cgop($body)),
CgOp.prog(CgOp.letvar('!cond', $.check.cgop($body)),
CgOp.obj_getbool(CgOp.letvar('!cond'))),
CgOp.sink(CgOp.xspan("redo$id", "next$id", 0, $.body.cgop($body),
1, $l, "next$id", 2, $l, "last$id", 3, $l, "redo$id"))),
CgOp.label("last$id"),
Expand Down Expand Up @@ -422,11 +431,12 @@ class ForLoop is Op {
}

method statement_level() {
my $var = ::GLOBAL::NieczaActions.gensym;
my $var = [ map { ::GLOBAL::NieczaActions.gensym },
0 ..^ +$.sink.body.signature.params ];
$.sink.once = True;
::Op::ImmedForLoop.new(source => $.source, var => $var,
sink => ::Op::CallSub.new(invocant => $.sink,
positionals => [ ::Op::LetVar.new(name => $var) ]));
positionals => [ map { ::Op::LetVar.new(name => $_) }, @$var]));
}
}

Expand All @@ -448,14 +458,14 @@ class ImmedForLoop is Op {

CgOp.rnull(CgOp.letn(
"!iter$id", CgOp.vvarlist_new_empty,
$.var, CgOp.null('var'),
(map { $_, CgOp.null('var') }, @$.var),
CgOp.vvarlist_push(CgOp.letvar("!iter$id"),
$.source.cgop($body)),
CgOp.whileloop(0, 0,
CgOp.iter_hasflat(CgOp.letvar("!iter$id")),
CgOp.prog(
CgOp.letvar($.var,
CgOp.vvarlist_shift(CgOp.letvar("!iter$id"))),
(map { CgOp.letvar($_,
CgOp.vvarlist_shift(CgOp.letvar("!iter$id")))},@$.var),
CgOp.sink(CgOp.xspan("redo$id", "next$id", 0,
$.sink.cgop($body),
1, $l, "next$id",
Expand Down
11 changes: 11 additions & 0 deletions src/Sig.pm6
Expand Up @@ -10,6 +10,7 @@ class Parameter {
has Bool $.slurpycap = False;
# does not vivify; rw
has Bool $.rwtrans = False;
has Bool $.is_copy = False;
has Bool $.full_parcel = False;
has Bool $.optional = False;
has Bool $.defouter = False;
Expand Down Expand Up @@ -46,6 +47,15 @@ class Parameter {
}
}

method do_copy($val) {
CgOp.prog(
CgOp.scopedlex($!slot, ($!hash ?? CgOp._cgop("newhash") !!
$!list ?? CgOp._cgop("newarray") !!
CgOp._cgop("newtypedscalar",
CgOp.class_ref("mo", @( $!tclass // 'Any' ))))),
CgOp.assign(CgOp.scopedlex($!slot), $val))
}

method bind_inline($body, @posr) {
my $get = $!full_parcel ?? self.parcel_get_inline(@posr) !!
$!slurpycap ?? self.slurpycap_get_inline(@posr) !!
Expand All @@ -54,6 +64,7 @@ class Parameter {

if (defined $!slot) {
CgOp.scopedlex($!slot, $!rwtrans ?? $get !!
$!is_copy ?? self.do_copy($get) !!
CgOp.newboundvar(+(!$!rw), +$!list, $get));
} else {
CgOp.sink($get);
Expand Down

0 comments on commit 673862f

Please sign in to comment.