Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[nrx] Expose backtracking and labels to cgop
  • Loading branch information
sorear committed Sep 5, 2010
1 parent 6652b77 commit 605deee
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 3 deletions.
18 changes: 18 additions & 0 deletions src/CgOp.pm
Expand Up @@ -576,6 +576,24 @@ use warnings;
zyg => [ $inv, @args ], is_cps_call => 1);
}

sub label {
my ($name) = @_;
CgOp::Primitive->new(op => [ 'labelhere', $name ],
zyg => [ ], is_cps_call => 1);
}

sub goto {
my ($name) = @_;
CgOp::Primitive->new(op => [ 'goto', $name ],
zyg => [ ], is_cps_call => 1);
}

sub rxpushb {
my ($tag, $lbl) = @_;
CgOp::Primitive->new(op => [ 'rxpushb', $tag, $lbl ],
zyg => [ ], is_cps_call => 1);
}

sub rxbprim {
my ($name, @args) = @_;
CgOp::Primitive->new(op => [ 'rxbprim', $name, scalar @args ],
Expand Down
8 changes: 7 additions & 1 deletion src/CodeGen.pm
Expand Up @@ -621,6 +621,12 @@ use 5.010;
$self->_emit("if (!th.rx.$name(" . join(", ", @args) . ")) return th.rx.Backtrack(th)");
}

sub rxpushb {
my ($self, $tag, $label) = @_;
push @{ $self->buffer }, " th.rx.PushBacktrack(" . qm($tag) .
", \@\@L$label);\n";
}

sub return {
my ($self, $nv) = @_;
return if $self->unreach;
Expand Down Expand Up @@ -738,7 +744,7 @@ use 5.010;
($self->numlets + $self->minlets - 4), "];\n";
}
for (@{ $self->buffer }) {
s/\@\@L(\d+)/$self->labelname->{$1}/eg;
s/\@\@L(\w+)/$self->labelname->{$1}/eg;
}
print ::NIECZA_OUT " " x 12, $_ for @{ $self->buffer };
print ::NIECZA_OUT " " x 12, "default:\n";
Expand Down
10 changes: 8 additions & 2 deletions test2.pl
Expand Up @@ -7,7 +7,12 @@ ($C)
Q:CgOp {
(prog
(setfield rx (callframe) (rawnew RxFrame (cast Cursor (@ {$C}))))
(rxpushb SEQALT b1)
(rxbprim ExactOne (char x))
(goto b2)
(label b1)
(rxbprim ExactOne (char y))
(label b2)
(rawccall (getfield rx (callframe)) End)
(rawccall (getfield rx (callframe)) Backtrack)
(null Variable))
Expand All @@ -27,7 +32,8 @@ ($C)
}
}

is +rxt(Cursor.new("x")), 1, "/x/ ~~ x";
is +rxt(Cursor.new("y")), 0, "/x/ !~ y";
is +rxt(Cursor.new("x")), 1, "/x||y/ ~~ x";
is +rxt(Cursor.new("y")), 1, "/x||y/ ~~ y";
is +rxt(Cursor.new("z")), 0, "/x||y/ !~~ z";

done-testing;

0 comments on commit 605deee

Please sign in to comment.