diff --git a/CodeGen.pm b/CodeGen.pm index 90866418..7a54e5a3 100644 --- a/CodeGen.pm +++ b/CodeGen.pm @@ -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; } diff --git a/Decl.pm b/Decl.pm index f93acce1..66ebaf11 100644 --- a/Decl.pm +++ b/Decl.pm @@ -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] : ()); } @@ -272,10 +272,10 @@ 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'))))); + CgOp::wrap(CgOp::rawnew('Dictionary')))))); } CgOp::letn("pkg", @@ -283,8 +283,8 @@ use CgOp; CgOp::wrap(CgOp::rawnew('Dictionary'))), 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)), @@ -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($_)); diff --git a/ResolveLex.pm b/ResolveLex.pm index f8755fc3..6002ccad 100644 --- a/ResolveLex.pm +++ b/ResolveLex.pm @@ -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/) { @@ -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"); }