@@ -170,17 +170,27 @@ class QAST::MASTRegexCompiler {
170
170
171
171
my $ FAKE-POS-NODE := QAST ::Op. new ( : op(' null' ) );
172
172
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 ) {
174
174
# Form pieces to generate callsite and dispatch op.
175
- my $ name-reg := $ ! regalloc . fresh_s();
176
175
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
+
178
186
my @ all-arg-regs := [$ invocant-reg , $ name-reg , $ invocant-reg ];
179
187
my @ all-arg-masts := [
180
188
MAST::InstructionList. new ($ invocant-reg , nqp ::const::MVM_reg_obj),
181
189
MAST::InstructionList. new ($ name-reg , nqp ::const::MVM_reg_str),
182
190
MAST::InstructionList. new ($ invocant-reg , nqp ::const::MVM_reg_obj)
183
191
];
192
+
193
+
184
194
my @ all-arg-qasts := [$ FAKE-POS-NODE , $ FAKE-POS-NODE , $ FAKE-POS-NODE ];
185
195
if @ arg-regs {
186
196
my int $ i ;
@@ -1226,11 +1236,12 @@ class QAST::MASTRegexCompiler {
1226
1236
if nqp ::istype($ node [0 ][0 ], QAST ::SVal) {
1227
1237
# Method call. Shift the method name from the compiled bits
1228
1238
# before doing the call.
1229
- nqp :: shift (@ arg-regs );
1239
+ # nqp::shift(@arg-regs);
1230
1240
nqp :: shift (@ arg-types );
1231
1241
nqp :: shift (@ arg-qasts );
1242
+
1232
1243
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 );
1234
1245
for @ arg-masts {
1235
1246
$ ! regalloc . release_register($ _ . result_reg, $ _ . result_kind);
1236
1247
}
@@ -1337,7 +1348,6 @@ class QAST::MASTRegexCompiler {
1337
1348
my $ caps := $ ! regalloc . fresh_i();
1338
1349
my $ haselemslabel := label();
1339
1350
my $ haselemsendlabel := label();
1340
- op($ frame , ' const_i64' , $ mark , $ label_index );
1341
1351
op($ frame , ' elems' , $ elems , $ bstack );
1342
1352
op($ frame , ' gt_i' , $ caps , $ elems , % ! reg <zero >);
1343
1353
op($ frame , ' if_i' , $ caps , $ haselemslabel );
@@ -1347,6 +1357,7 @@ class QAST::MASTRegexCompiler {
1347
1357
op($ frame , ' dec_i' , $ elems );
1348
1358
op($ frame , ' atpos_i' , $ caps , $ bstack , $ elems );
1349
1359
$ frame . add-label($ haselemsendlabel );
1360
+ op($ frame , ' const_i64' , $ mark , $ label_index );
1350
1361
op($ frame , ' push_i' , $ bstack , $ mark );
1351
1362
op($ frame , ' push_i' , $ bstack , $ pos );
1352
1363
op($ frame , ' push_i' , $ bstack , $ rep );
0 commit comments