Skip to content

Commit

Permalink
Use a uniform representation for CgOp
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Oct 2, 2010
1 parent 2be14a1 commit 4b870fa
Show file tree
Hide file tree
Showing 9 changed files with 206 additions and 334 deletions.
12 changes: 6 additions & 6 deletions lib/SAFE.setting
Expand Up @@ -571,7 +571,7 @@ my class GatherIterator is Iterator {
my $*nextframe;
$!reify // ($!reify = (
Q:CgOp {
(letn getv (rawsccall Kernel.CoTake (cast clr:Frame
(letn getv (rawscall Kernel.CoTake (cast clr:Frame
(@ {$!frame})))
(box Parcel (ternary (== (@ {EMPTY}) (@ (l getv)))
(rawnewarr var)
Expand All @@ -588,7 +588,7 @@ sub _gather($fr) {
}
sub take($p) { # should be \|$p
Q:CgOp { (rawsccall Kernel.Take (l $p)) }
Q:CgOp { (rawscall Kernel.Take (l $p)) }
}
sub infix:<< => >>($k, $v) { Pair.RAWCREATE("key", $k, "value", $v) }
Expand Down Expand Up @@ -630,16 +630,16 @@ sub die($msg) { Q:CgOp { (die (@ {$msg})) } }
# XXX multi dispatch
sub next {
Q:CgOp { (rawsccall Kernel.SearchForHandler (int 1) (null clr:Frame) (int -1) (null str) (null var)) }
Q:CgOp { (rawscall Kernel.SearchForHandler (int 1) (null clr:Frame) (int -1) (null str) (null var)) }
}
sub last {
Q:CgOp { (rawsccall Kernel.SearchForHandler (int 2) (null clr:Frame) (int -1) (null str) (null var)) }
Q:CgOp { (rawscall Kernel.SearchForHandler (int 2) (null clr:Frame) (int -1) (null str) (null var)) }
}
sub redo {
Q:CgOp { (rawsccall Kernel.SearchForHandler (int 3) (null clr:Frame) (int -1) (null str) (null var)) }
Q:CgOp { (rawscall Kernel.SearchForHandler (int 3) (null clr:Frame) (int -1) (null str) (null var)) }
}
sub return is rawcall {
Q:CgOp { (rawsccall Kernel.SearchForHandler (int 4) (null clr:Frame) (int -1) (null str) (pos 0)) }
Q:CgOp { (rawscall Kernel.SearchForHandler (int 4) (null clr:Frame) (int -1) (null str) (pos 0)) }
}
sub assignop($fn) {
Expand Down
2 changes: 1 addition & 1 deletion lib/Threads.pm6
Expand Up @@ -24,7 +24,7 @@ sub lock($m,$f) is export { $m.lock($f); }
my class Thread is export {
has $!value;
method new($func) {
Q:CgOp { (box Thread (rawsccall
Q:CgOp { (box Thread (rawscall
Kernel.StartP6Thread:c,System.Threading.Thread (@ {$func}))) }
}

Expand Down
31 changes: 15 additions & 16 deletions src/CSharpBackend.pm
Expand Up @@ -278,14 +278,14 @@ sub access_lex {
CgOp::rawsget($lex->{peer});
} elsif ((my $ix = $lex->{peer}) >= 0) {
return $set_to ?
CgOp::Primitive->new(op => [ rtpadputi => $order, $ix ],
CgOp->new(op => [ rtpadputi => $order, $ix ],
zyg => [ $set_to ]) :
CgOp::Primitive->new(op => [ rtpadgeti => 'Variable',$order,$ix ]);
CgOp->new(op => [ rtpadgeti => 'Variable', $order, $ix ]);
} else {
return $set_to ?
CgOp::Primitive->new(op => [ rtpadput => $order, $name ],
CgOp->new(op => [ rtpadput => $order, $name ],
zyg => [ $set_to ]) :
CgOp::Primitive->new(op => [ rtpadget => 'Variable',$order,$name ]);
CgOp->new(op => [ rtpadget => 'Variable', $order, $name ]);
}
} elsif ($lex->isa('Metamodel::Lexical::Stash')) {
die "cannot rebind stashes" if $set_to;
Expand All @@ -308,18 +308,17 @@ sub access_lex {
sub resolve_lex {
my ($body, $op) = @_;

if ($op->isa('CgOp::Primitive')) {
my ($opc, $arg, @rest) = @{ $op->op };
if ($opc eq 'scopelex') {
my $nn = access_lex($body, $arg, $op->zyg->[0]);
#XXX
%$op = %$nn;
bless $op, ref($nn);
}
}
my ($opc, $arg, @rest) = @{ $op->op };
if ($opc eq 'scopelex') {
my $nn = access_lex($body, $arg, $op->zyg->[0]);
#XXX
%$op = %$nn;
bless $op, ref($nn);

resolve_lex($body, $_) for @{ $op->zyg };
} elsif ($opc eq 'let') {
local $haslet{$arg} = 1;

if ($op->isa('CgOp::Let')) {
local $haslet{$op->name} = 1;
resolve_lex($body, $_) for @{ $op->zyg };
} else {
resolve_lex($body, $_) for @{ $op->zyg };
Expand All @@ -332,7 +331,7 @@ sub codegen_sub {
# TODO: Bind a return value here to catch non-ro sub use
if ($_->gather_hack) {
$ops = CgOp::prog(@enter, CgOp::sink($_->code->cgop($_)),
CgOp::rawsccall('Kernel.Take', CgOp::scopedlex('EMPTY')));
CgOp::rawscall('Kernel.Take', CgOp::scopedlex('EMPTY')));
} elsif ($_->returnable && defined($_->signature)) {
$ops = CgOp::prog(@enter,
CgOp::return(CgOp::span("rstart", "rend",
Expand Down

0 comments on commit 4b870fa

Please sign in to comment.