Skip to content

Commit d8ba4b9

Browse files
committed
Reuse method name
1 parent 640856d commit d8ba4b9

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

src/vm/moar/QAST/QASTCompilerMAST.nqp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,7 +1843,6 @@ my class MASTCompilerInstance {
18431843
$!regalloc.release_register($name_reg, nqp::const::MVM_reg_str);
18441844
}
18451845
elsif $scope eq 'contextual' {
1846-
my $name_const := self.const_s($name);
18471846
my $lex := $*BLOCK.lexical($name);
18481847
if $lex {
18491848
# In current frame; do as lexical does.
@@ -1864,6 +1863,7 @@ my class MASTCompilerInstance {
18641863
}
18651864
}
18661865
else {
1866+
my $name_const := self.const_s($name);
18671867
# Need lookup.
18681868
if $*BINDVAL {
18691869
my $valmast := self.as_mast_clear_bindval($*BINDVAL, :want(nqp::const::MVM_reg_obj));
@@ -1874,8 +1874,8 @@ my class MASTCompilerInstance {
18741874
$res_reg := $!regalloc.fresh_register(nqp::const::MVM_reg_obj);
18751875
%core_op_generators{'getdynlex'}($!mast_frame, $res_reg, $name_const.result_reg);
18761876
}
1877+
$!regalloc.release_register($name_const.result_reg, nqp::const::MVM_reg_str);
18771878
}
1878-
$!regalloc.release_register($name_const.result_reg, nqp::const::MVM_reg_str);
18791879
$res_kind := nqp::const::MVM_reg_obj;
18801880
}
18811881
elsif $scope eq 'attribute' {

src/vm/moar/QAST/QASTRegexCompilerMAST.nqp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,27 @@ class QAST::MASTRegexCompiler {
170170

171171
my $FAKE-POS-NODE := QAST::Op.new( :op('null') );
172172
method call-meth(str $name, $invocant-reg, :@arg-regs, :@arg-types, :@arg-qasts,
173-
:$result-reg, :$int-result) {
173+
:$result-reg, :$int-result, :$has-method-name) {
174174
# Form pieces to generate callsite and dispatch op.
175-
my $name-reg := $!regalloc.fresh_s();
176175
my $frame := $!qastcomp.mast_frame;
177-
op($frame, 'const_s', $name-reg, $name);
176+
my $name-reg;
177+
178+
if ($has-method-name) {
179+
$name-reg := nqp::shift(@arg-regs);
180+
} else {
181+
$name-reg := $!regalloc.fresh_s();
182+
op($frame, 'const_s', $name-reg, $name);
183+
$!regalloc.release_register($name-reg, nqp::const::MVM_reg_str);
184+
}
185+
178186
my @all-arg-regs := [$invocant-reg, $name-reg, $invocant-reg];
179187
my @all-arg-masts := [
180188
MAST::InstructionList.new($invocant-reg, nqp::const::MVM_reg_obj),
181189
MAST::InstructionList.new($name-reg, nqp::const::MVM_reg_str),
182190
MAST::InstructionList.new($invocant-reg, nqp::const::MVM_reg_obj)
183191
];
192+
193+
184194
my @all-arg-qasts := [$FAKE-POS-NODE, $FAKE-POS-NODE, $FAKE-POS-NODE];
185195
if @arg-regs {
186196
my int $i;
@@ -1226,11 +1236,12 @@ class QAST::MASTRegexCompiler {
12261236
if nqp::istype($node[0][0], QAST::SVal) {
12271237
# Method call. Shift the method name from the compiled bits
12281238
# before doing the call.
1229-
nqp::shift(@arg-regs);
1239+
# nqp::shift(@arg-regs);
12301240
nqp::shift(@arg-types);
12311241
nqp::shift(@arg-qasts);
1242+
12321243
self.call-meth($node[0][0].value, %!reg<cur>, :result-reg($p11),
1233-
:@arg-regs, :@arg-types, :@arg-qasts);
1244+
:@arg-regs, :@arg-types, :@arg-qasts, :has-method-name);
12341245
for @arg-masts {
12351246
$!regalloc.release_register($_.result_reg, $_.result_kind);
12361247
}
@@ -1337,7 +1348,6 @@ class QAST::MASTRegexCompiler {
13371348
my $caps := $!regalloc.fresh_i();
13381349
my $haselemslabel := label();
13391350
my $haselemsendlabel := label();
1340-
op($frame, 'const_i64', $mark, $label_index);
13411351
op($frame, 'elems', $elems, $bstack);
13421352
op($frame, 'gt_i', $caps, $elems, %!reg<zero>);
13431353
op($frame, 'if_i', $caps, $haselemslabel);
@@ -1347,6 +1357,7 @@ class QAST::MASTRegexCompiler {
13471357
op($frame, 'dec_i', $elems);
13481358
op($frame, 'atpos_i', $caps, $bstack, $elems);
13491359
$frame.add-label($haselemsendlabel);
1360+
op($frame, 'const_i64', $mark, $label_index);
13501361
op($frame, 'push_i', $bstack, $mark);
13511362
op($frame, 'push_i', $bstack, $pos);
13521363
op($frame, 'push_i', $bstack, $rep);

0 commit comments

Comments
 (0)