Skip to content

Commit e5c7395

Browse files
committed
implement negated charrange on parrot and jvm
jvm part is still b0rked, though
1 parent 643eb6f commit e5c7395

File tree

3 files changed

+36
-15
lines changed

3 files changed

+36
-15
lines changed

src/QRegex/P6Regex/Actions.nqp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -641,12 +641,13 @@ class QRegex::P6Regex::Actions is HLL::Actions {
641641
$str := $str ~ (%*RX<i> ?? nqp::lc($c) ~ nqp::uc($c) !! $c);
642642
}
643643
}
644-
if nqp::elems(@alts) == 0 && $use-range == 1 && nqp::chars($str) && $<sign> ne '-' {
644+
if nqp::elems(@alts) == 0 && $use-range == 1 && nqp::chars($str) {
645645
$qast := QAST::Regex.new(
646646
$str,
647647
QAST::IVal.new( :value($lower) ),
648-
QAST::IVal.new( :value($upper) )
649-
, :rxtype<charrange>, :node($/) );
648+
QAST::IVal.new( :value($upper) ),
649+
:negate( $<sign> eq '-' ),
650+
:rxtype<charrange>, :node($/) );
650651
} else {
651652
@alts.push(QAST::Regex.new( $str, :rxtype<enumcharlist>, :node($/), :negate( $<sign> eq '-' ) ))
652653
if nqp::chars($str);

src/vm/jvm/QAST/Compiler.nqp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4895,16 +4895,30 @@ class QAST::CompilerJAST {
48954895
$TYPE_STR, 'codePointAt', 'Integer', 'Integer' ));
48964896
$il.append($I2L);
48974897
$il.append($DUP);
4898+
48984899
$il.append(JAST::PushIVal.new( :value($node[1].value) ));
48994900
$il.append($LCMP);
4900-
$il.append(JAST::Instruction.new( :op('ifge'), $succeed ));
4901-
$il.append($POP);
4902-
$il.append(JAST::Instruction.new( :op('goto'), %*REG<fail>));
49034901

4904-
$il.append($succeed);
4905-
$il.append(JAST::PushIVal.new( :value($node[2].value) ));
4906-
$il.append($LCMP);
4907-
$il.append(JAST::Instruction.new( :op('ifgt'), %*REG<fail> ));
4902+
if $node.negate {
4903+
my $succeed_and_pop := JAST::Label.new(:name(self.unique('charrange_succeed_pop_')));
4904+
$il.append(JAST::Instruction.new( :op('iflt'), $succeed_and_pop ));
4905+
$il.append(JAST::PushIVal.new( :value($node[2].value) ));
4906+
$il.append($LCMP);
4907+
$il.append(JAST::Instruction.new( :op('ifge'), $succeed ));
4908+
$il.append(JAST::Instruction.new( :op('goto'), %*REG<fail> ));
4909+
$il.append($succeed_and_pop);
4910+
$il.append($POP);
4911+
$il.append($succeed);
4912+
} else {
4913+
$il.append(JAST::Instruction.new( :op('ifge'), $succeed ));
4914+
$il.append($POP);
4915+
$il.append(JAST::Instruction.new( :op('goto'), %*REG<fail>));
4916+
4917+
$il.append($succeed);
4918+
$il.append(JAST::PushIVal.new( :value($node[2].value) ));
4919+
$il.append($LCMP);
4920+
$il.append(JAST::Instruction.new( :op('ifgt'), %*REG<fail> ));
4921+
}
49084922

49094923
unless $node.subtype eq 'zerowidth' {
49104924
$il.append(JAST::Instruction.new( :op('lload'), %*REG<pos> ));

src/vm/parrot/QAST/Compiler.nqp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1436,13 +1436,19 @@ class QAST::Compiler is HLL::Compiler {
14361436

14371437
method charrange($node) {
14381438
my $ops := self.post_new('Ops', :result(%*REG<cur>));
1439+
$ops.push_pirop('ge', %*REG<pos>, %*REG<eos>, %*REG<fail>);
14391440
if $node.negate {
1440-
die("negated charrange NYI");
1441+
my $succeed := self.post_new('Label', :name(self.unique('succeed_')));
1442+
$ops.push_pirop('ord', '$I11', %*REG<tgt>, %*REG<pos>);
1443+
$ops.push_pirop('gt', '$I11', $node[2].value, $succeed);
1444+
$ops.push_pirop('lt', '$I11', $node[1].value, $succeed);
1445+
$ops.push_pirop('goto', %*REG<fail>);
1446+
$ops.push($succeed);
1447+
} else {
1448+
$ops.push_pirop('ord', '$I11', %*REG<tgt>, %*REG<pos>);
1449+
$ops.push_pirop('lt', '$I11', $node[1].value, %*REG<fail>);
1450+
$ops.push_pirop('gt', '$I11', $node[2].value, %*REG<fail>);
14411451
}
1442-
$ops.push_pirop('ge', %*REG<pos>, %*REG<eos>, %*REG<fail>);
1443-
$ops.push_pirop('ord', '$I11', %*REG<tgt>, %*REG<pos>);
1444-
$ops.push_pirop('lt', '$I11', $node[1].value, %*REG<fail>);
1445-
$ops.push_pirop('gt', '$I11', $node[2].value, %*REG<fail>);
14461452
$ops.push_pirop('inc', %*REG<pos>) unless $node.subtype eq 'zerowidth';
14471453
$ops;
14481454
}

0 commit comments

Comments
 (0)