Skip to content

Commit

Permalink
Handle type objects as true-readonlies
Browse files Browse the repository at this point in the history
-36K testsuite (and 13s -> 9s)
  • Loading branch information
sorear committed Aug 17, 2010
1 parent a6dcd31 commit 2fa3d4e
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 10 deletions.
2 changes: 1 addition & 1 deletion CodeGen.pm
Expand Up @@ -623,7 +623,7 @@ use 5.010;
if ($kind == 3) {
$self->clr_sfield_set($data);
$self->clr_sfield_get($data . ":f,IP6");
$self->newscalar;
$self->clr_call_direct('Kernel.NewROScalar', 1);
$self->clr_sfield_set($data . "_var");
return;
}
Expand Down
14 changes: 7 additions & 7 deletions Decl.pm
Expand Up @@ -259,7 +259,7 @@ use CgOp;

sub used_slots {
my ($self) = @_;
[$self->var, 'Variable', 1], [$self->stashvar, 'Variable', 1],
[$self->var, 'Variable', 3], [$self->stashvar, 'Variable', 3],
(!$self->stub ? [$self->bodyvar, 'Variable', $_[1] ? 1 : 0] : ());
}

Expand All @@ -272,19 +272,19 @@ use CgOp;

if ($self->stub) {
return CgOp::prog(
CgOp::proto_var($self->var, CgOp::newscalar(CgOp::null('IP6'))),
CgOp::proto_var($self->stashvar,
CgOp::proto_var($self->var, CgOp::null('IP6')),
CgOp::proto_var($self->stashvar, CgOp::fetch(
($self->ourpkg ? $self->stash($body, '::') :
CgOp::wrap(CgOp::rawnew('Dictionary<string,Variable>')))));
CgOp::wrap(CgOp::rawnew('Dictionary<string,Variable>'))))));
}

CgOp::letn("pkg",
($self->ourpkg ? $self->stash($body, '::') :
CgOp::wrap(CgOp::rawnew('Dictionary<string,Variable>'))),
CgOp::letn("how", $self->make_how,
# catch usages before the closing brace
CgOp::proto_var($self->var, CgOp::newscalar(CgOp::null('IP6'))),
CgOp::proto_var($self->var . "::", CgOp::letvar("pkg")),
CgOp::proto_var($self->var, CgOp::null('IP6')),
CgOp::proto_var($self->stashvar, CgOp::fetch(CgOp::letvar("pkg"))),

CgOp::protosub($self->body),
CgOp::proto_var($self->bodyvar, CgOp::sub_var($self->body)),
Expand Down Expand Up @@ -488,7 +488,7 @@ use CgOp;
map {
my ($head, @path) = @{ $self->symbols->{$_} };
CodeGen->know_sfield($scope->{$head}[2], $scope->{$head}[0]);
my $first = CgOp::rawsget($scope->{$head}[2]);
my $first = CgOp::newscalar(CgOp::rawsget($scope->{$head}[2]));
for (@path) {
$first = CgOp::rawscall('Kernel.PackageLookup',
CgOp::fetch($first), CgOp::clr_string($_));
Expand Down
7 changes: 5 additions & 2 deletions ResolveLex.pm
Expand Up @@ -42,7 +42,7 @@ sub run_cgop {
push @$btree, $arg;
} elsif ($opc eq 'close_sub') {
pop @$btree;
} elsif ($opc eq 'fetch' &&
} elsif ($opc eq 'clr_call_direct' && $arg eq 'Kernel.Fetch' &&
$op->zyg->[0]->isa('CgOp::Primitive') &&
$op->zyg->[0]->op->[0] eq 'clr_sfield_get' &&
$op->zyg->[0]->op->[1] =~ /(.*)_var:f,Variable/) {
Expand Down Expand Up @@ -77,7 +77,10 @@ sub resolve_lex {

if ($kind == 3) {
if ($set_to) {
die "panic: Assigning to a kind3";
return CgOp::let($set_to, sub { my $x = $_[0];
CgOp::prog( CgOp::rawsset($data, CgOp::fetch($x)),
CgOp::rawsset($data . "_var", CgOp::newscalar(
CgOp::rawsget($data . ":f,IP6")))) });
} else {
return CgOp::rawsget($data . "_var:f,Variable");
}
Expand Down

0 comments on commit 2fa3d4e

Please sign in to comment.