Skip to content

Commit

Permalink
Upward type inference for let
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Jul 21, 2010
1 parent 3aa3ff8 commit f4addf6
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 17 deletions.
14 changes: 7 additions & 7 deletions CgOp.pm
Expand Up @@ -249,7 +249,7 @@ use warnings;

sub methodcall {
my ($obj, $name, @args) = @_;
let($obj, 'Variable', sub {
let($obj, sub {
CgOp::Primitive->new(op => [ 'call_method', 1, $name, scalar @args ],
zyg => [ fetch($_[0]), $_[0], @args ])});
}
Expand All @@ -272,7 +272,7 @@ use warnings;
} else {
my $n = shift;
my $t = shift;
letn($n, $t, null($t), withtypes(@_));
letn($n, null($t), withtypes(@_));
}
}

Expand Down Expand Up @@ -337,9 +337,9 @@ use warnings;
}

sub letn {
my ($name, $type, $value, @stuff) = @_;
my ($name, $value, @stuff) = @_;
prog(
CgOp::Primitive->new(op => [ 'push_let', $name, $type ],
CgOp::Primitive->new(op => [ 'push_let', $name ],
zyg => [ $value ]),
@stuff,
sink(CgOp::Primitive->new(op => [ 'pop_let', $name ])));
Expand All @@ -362,9 +362,9 @@ use warnings;

my $nextlet = 0;
sub let {
my ($head, $type, $bodyf) = @_;
my ($head, $bodyf) = @_;
my $v = ($nextlet++);
letn($v, $type, $head, $bodyf->(letvar($v)));
letn($v, $head, $bodyf->(letvar($v)));
}
}

Expand Down Expand Up @@ -408,7 +408,7 @@ use warnings;
if (_okdelay($op->zyg->[scalar @sofar])) {
$_recurse->(@sofar, $op->zyg->[scalar @sofar]);
} else {
let($op->zyg->[scalar @sofar], 'XXX',
let($op->zyg->[scalar @sofar],
sub { $_recurse->(@sofar, $_[0]) });
}
};
Expand Down
6 changes: 3 additions & 3 deletions CodeGen.pm
Expand Up @@ -208,9 +208,9 @@ use 5.010;
}

sub push_let {
my ($self, $which, $ty) = @_;
my ($self, $which) = @_;
my $var = "let!${which}!" . ($self->letdepths->{$which}++);
$self->lex2type->{$var} = $ty;
$self->lex2type->{$var} = $self->stacktype->[-1];
$self->rawlexput($var);
}

Expand Down Expand Up @@ -558,7 +558,7 @@ use 5.010;
my ($self, $body) = @_;
$self->peek_let('protopad');
$self->clr_new('Frame', 1);
$self->push_let('protopad', 'Frame');
$self->push_let('protopad');
push @{ $self->bodies }, $body;
}

Expand Down
2 changes: 1 addition & 1 deletion Decl.pm
Expand Up @@ -221,7 +221,7 @@ use CgOp;

$self->body->outer($body);

CgOp::letn("how", "Variable",
CgOp::letn("how",
CgOp::methodcall(CgOp::scopedlex("ClassHOW"), "new",
CgOp::wrap(CgOp::clr_string($self->name // 'ANON'))),

Expand Down
5 changes: 2 additions & 3 deletions Op.pm
Expand Up @@ -141,7 +141,7 @@ use CgOp;

sub code {
my ($self, $body) = @_;
CgOp::let($self->receiver->code($body), 'Variable', sub {
CgOp::let($self->receiver->code($body), sub {
CgOp::methodcall(CgOp::newscalar(CgOp::how(CgOp::fetch($_[0]))),
$self->name, $_[0], map { $_->code($body) }
@{ $self->positionals })});
Expand Down Expand Up @@ -243,8 +243,7 @@ use CgOp;
my $acc = (shift @r)->code($body);

for (@r) {
$acc = CgOp::let($_->code($body), 'Variable',
sub { $self->red2($_[0], $acc) });
$acc = CgOp::let($_->code($body), sub { $self->red2($_[0], $acc) });
}

$acc;
Expand Down
3 changes: 1 addition & 2 deletions Sig.pm
Expand Up @@ -42,8 +42,7 @@ use 5.010;
if ($self->slurpy) {
$self->target->binder(
CgOp::let(CgOp::rawnew('DynObject', CgOp::getfield('klass',
CgOp::cast('DynObject', CgOp::fetch(CgOp::scopedlex('List'))))),
'DynObject', sub {
CgOp::cast('DynObject', CgOp::fetch(CgOp::scopedlex('List'))))), sub {
my $do = shift;
CgOp::prog(
CgOp::setindex('flat', CgOp::getfield('slots', $do),
Expand Down
2 changes: 1 addition & 1 deletion Unit.pm
Expand Up @@ -20,7 +20,7 @@ use 5.010;
my ($self) = @_;
$self->mainline->outer($self->setting) if $self->setting;
CodeGen->new(name => 'BOOT', entry => 1,
ops => CgOp::letn('protopad', 'Frame',
ops => CgOp::letn('protopad',
CgOp::cast('Frame', CgOp::fetch(CgOp::pos(0))),
CgOp::return(
CgOp::newscalar(
Expand Down

0 comments on commit f4addf6

Please sign in to comment.