diff --git a/CgOp.pm b/CgOp.pm index 751b1e58..c9c7d617 100644 --- a/CgOp.pm +++ b/CgOp.pm @@ -203,7 +203,8 @@ use warnings; } sub scopedlex { - CgOp::NIL->new(ops => [[ scopelexget => $_[0] ]]); + my $n = shift; + CgOp::NIL->new(ops => [ @_, [ scopelex => $n, scalar @_ ]]); } sub lexput { diff --git a/CodeGen.pm b/CodeGen.pm index f33d8f01..d5f14b7f 100644 --- a/CodeGen.pm +++ b/CodeGen.pm @@ -572,8 +572,8 @@ use 5.010; # These are completely derived. - sub scopelexget { - my ($self, $name) = @_; + sub scopelex { + my ($self, $name, $set) = @_; my $body = $self->body // $self->bodies->[-1]; my ($order, $scope) = (0, $body); while ($scope && !$scope->lexical->{$name}) { @@ -583,7 +583,11 @@ use 5.010; if (!$scope) { die "Failed to resolve lexical $name in " . $body->name; } - $self->lexget($order, $name); + if ($set) { + $self->lexput($order, $name); + } else { + $self->lexget($order, $name); + } } sub string_var { @@ -611,7 +615,7 @@ use 5.010; sub box { my ($self, $ty) = @_; - $self->scopelexget($ty); + $self->scopelex($ty); $self->fetch; $self->clr_call_direct('Kernel.BoxAny', 2); } diff --git a/Decl.pm b/Decl.pm index b34dcdf3..af3f4cdb 100644 --- a/Decl.pm +++ b/Decl.pm @@ -248,7 +248,7 @@ use CgOp; CgOp::sink( CgOp::methodcall(CgOp::aux('how'), "add-super", - CgOp::scopedlex($self->name . "!HOW", $body))); + CgOp::scopedlex($self->name . "!HOW"))); } __PACKAGE__->meta->make_immutable;