@@ -1311,20 +1311,34 @@ class QAST::MASTRegexCompiler {
1311
1311
my $ i0 := $ ! regalloc . fresh_i();
1312
1312
my $ testop := $ node . negate ?? ' if_i' !! ' unless_i' ;
1313
1313
my $ succeed := label();
1314
+ my $ prop := ~ $ node [0 ];
1314
1315
my @ ins := [
1315
1316
op(' ge_i' , $ i0 , % ! reg <pos >, % ! reg <eos >),
1316
1317
op(' if_i' , $ i0 , % ! reg <fail >),
1317
1318
];
1318
1319
if + @ ($ node ) == 1 {
1319
1320
my $ hasvalcode := label();
1320
1321
my $ endblock := label();
1321
- if ~ $ node [0 ] ~~ /^ [ In<[ A..Z ] > | in<[ a..z ] > ] / { # "InArabic" is a lookup of Block Arabic
1322
+ if $ prop eq ' name' || $ prop eq ' Name' {
1323
+ my $ s0 := $ ! regalloc . fresh_s();
1322
1324
merge_ins(@ ins , [
1323
- op(' const_s' , $ pname , sval(nqp :: substr ($ node [0 ],2 ))),
1325
+ op(' ordat' , $ i0 , % ! reg <tgt >, % ! reg <pos >),
1326
+ op(' getuniname' , $ s0 , $ i0 ),
1327
+ op(' const_i64' , $ i0 , % ! reg <zero >),
1328
+ op(' unless_s' , $ s0 , $ endblock ),
1329
+ op(' ordfirst' , $ i0 , $ s0 ),
1330
+ op(' const_i64' , $ pcode , ival(60 )), # not a property code but the ord of '<'
1331
+ op(' ne_i' , $ i0 , $ i0 , $ pcode ),
1332
+ $ endblock ,
1333
+ op(' if_i' , $ i0 , $ succeed ),
1334
+ ]);
1335
+ }
1336
+ elsif $ prop ~~ /^ [ In<[ A..Z ] > | in<[ a..z ] > ] / { # "InArabic" is a lookup of Block Arabic
1337
+ merge_ins(@ ins , [
1338
+ op(' const_s' , $ pname , sval(nqp :: substr ($ prop ,2 ))),
1324
1339
op(' uniisblock' , $ i0 , % ! reg <tgt >, % ! reg <pos >, $ pname ),
1325
1340
op(' if_i' , $ i0 , $ succeed ),
1326
1341
op(' const_s' , $ pprop , sval(' Block' )),
1327
- op(' const_s' , $ pname , sval(nqp :: substr ($ node [0 ],2 ))),
1328
1342
op(' unipropcode' , $ pcode , $ pprop ),
1329
1343
op(' unless_i' , $ pcode , $ endblock ),
1330
1344
op(' unipvalcode' , $ pvcode , $ pcode , $ pname ),
@@ -1343,15 +1357,27 @@ class QAST::MASTRegexCompiler {
1343
1357
op($ testop , $ i0 , % ! reg <fail >),
1344
1358
]);
1345
1359
}
1360
+ elsif $ prop eq ' name' || $ prop eq ' Name' {
1361
+ my $ smrtmtch_mast := $ ! qastcomp . as_mast($ node [1 ], : want($ MVM_reg_obj ));
1362
+ my $ s0 := $ ! regalloc . fresh_s();
1363
+ merge_ins(@ ins , $ smrtmtch_mast . instructions);
1364
+ merge_ins(@ ins , [
1365
+ op(' ordat' , $ i0 , % ! reg <tgt >, % ! reg <pos >),
1366
+ op(' getuniname' , $ s0 , $ i0 ),
1367
+ op(' findmeth' , % ! reg <method >, % ! reg <cur >, sval(' !DELEGATE_ACCEPTS' )),
1368
+ call(% ! reg <method >, [$ Arg ::obj, $ Arg ::obj, $ Arg ::str], : result($ i0 ),
1369
+ % ! reg <cur >, $ smrtmtch_mast . result_reg, $ s0 ),
1370
+ op($ testop , $ i0 , % ! reg <fail >),
1371
+ ]);
1372
+ }
1346
1373
else {
1347
- my $ sname := $ ! regalloc . fresh_s();
1348
1374
my $ smrtmtch_mast := $ ! qastcomp . as_mast($ node [1 ], : want($ MVM_reg_obj ));
1349
1375
my $ s0 := $ ! regalloc . fresh_s();
1350
1376
my $ tryintprop := label();
1351
1377
my $ tryboolprop := label();
1352
1378
merge_ins(@ ins , $ smrtmtch_mast . instructions);
1353
1379
merge_ins(@ ins , [
1354
- op(' const_s' , $ pname , sval($ node [ 0 ] )),
1380
+ op(' const_s' , $ pname , sval($ prop )),
1355
1381
op(' unipropcode' , $ pcode , $ pname ),
1356
1382
op(' unipvalcode' , $ pvcode , $ pcode , $ pname ),
1357
1383
op(' ordat' , $ i0 , % ! reg <tgt >, % ! reg <pos >),
0 commit comments