Skip to content

Commit 547bb85

Browse files
committed
implement <:Name(/:s LATIN SMALL LETTER/)> for moar
1 parent d267664 commit 547bb85

File tree

1 file changed

+31
-5
lines changed

1 file changed

+31
-5
lines changed

src/vm/moar/QAST/QASTRegexCompilerMAST.nqp

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,20 +1311,34 @@ class QAST::MASTRegexCompiler {
13111311
my $i0 := $!regalloc.fresh_i();
13121312
my $testop := $node.negate ?? 'if_i' !! 'unless_i';
13131313
my $succeed := label();
1314+
my $prop := ~$node[0];
13141315
my @ins := [
13151316
op('ge_i', $i0, %!reg<pos>, %!reg<eos>),
13161317
op('if_i', $i0, %!reg<fail>),
13171318
];
13181319
if +@($node) == 1 {
13191320
my $hasvalcode := label();
13201321
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();
13221324
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))),
13241339
op('uniisblock', $i0, %!reg<tgt>, %!reg<pos>, $pname),
13251340
op('if_i', $i0, $succeed),
13261341
op('const_s', $pprop, sval('Block')),
1327-
op('const_s', $pname, sval(nqp::substr($node[0],2))),
13281342
op('unipropcode', $pcode, $pprop),
13291343
op('unless_i', $pcode, $endblock),
13301344
op('unipvalcode', $pvcode, $pcode, $pname),
@@ -1343,15 +1357,27 @@ class QAST::MASTRegexCompiler {
13431357
op($testop, $i0, %!reg<fail>),
13441358
]);
13451359
}
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+
}
13461373
else {
1347-
my $sname := $!regalloc.fresh_s();
13481374
my $smrtmtch_mast := $!qastcomp.as_mast($node[1], :want($MVM_reg_obj));
13491375
my $s0 := $!regalloc.fresh_s();
13501376
my $tryintprop := label();
13511377
my $tryboolprop := label();
13521378
merge_ins(@ins, $smrtmtch_mast.instructions);
13531379
merge_ins(@ins, [
1354-
op('const_s', $pname, sval($node[0])),
1380+
op('const_s', $pname, sval($prop)),
13551381
op('unipropcode', $pcode, $pname),
13561382
op('unipvalcode', $pvcode, $pcode, $pname),
13571383
op('ordat', $i0, %!reg<tgt>, %!reg<pos>),

0 commit comments

Comments
 (0)