Skip to content

Commit

Permalink
generate code for calling Backtrack once only
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Sep 13, 2010
1 parent af4b265 commit 6617fa8
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 21 deletions.
2 changes: 1 addition & 1 deletion src/CodeGen.pm
Expand Up @@ -687,7 +687,7 @@ use 5.010;
sub rxbprim {
my ($self, $name, $nargs) = @_;
my @args = reverse map { ($self->_popn(1))[0] } 1 .. $nargs;
$self->_emit("if (!th.rx.$name(" . join(", ", @args) . ")) return th.rx.Backtrack(th)");
$self->_emit("if (!th.rx.$name(" . join(", ", @args) . ")) goto case \@\@Lbacktrack");
}

sub rxpushb {
Expand Down
1 change: 1 addition & 0 deletions src/Op.pm
Expand Up @@ -1065,6 +1065,7 @@ use CgOp;
CgOp::null('Cursor')),
$self->rxop->code($body),
CgOp::rawccall(CgOp::rxframe, 'End'),
CgOp::label('backtrack'),
CgOp::rawccall(CgOp::rxframe, 'Backtrack'),
CgOp::null('Variable'));
}
Expand Down
38 changes: 18 additions & 20 deletions src/RxOp.pm
Expand Up @@ -83,10 +83,9 @@ use CgOp;
CgOp::int($self->min)),
CgOp::rxpushb('QUANT', $exit), CgOp::prog());
if (defined $self->max) {
push @code, CgOp::ternary(CgOp::compare('>=',
push @code, CgOp::cgoto('backtrack', CgOp::compare('>=',
CgOp::rawcall(CgOp::rxframe, 'GetQuant'),
CgOp::int($self->max)),
CgOp::rawccall(CgOp::rxframe, 'Backtrack'), CgOp::prog());
CgOp::int($self->max)));
}
push @code, $self->zyg->[0]->code($body);
push @code, CgOp::rawcall(CgOp::rxframe, 'IncQuant');
Expand Down Expand Up @@ -244,11 +243,11 @@ use CgOp;
push @code, $self->zyg->[0]->code($body);
push @code, CgOp::rawcall(CgOp::rxframe, 'CommitGroup',
CgOp::clr_string("CUTGRP"), CgOp::clr_string("ENDCUTGRP"));
push @code, CgOp::rawccall(CgOp::rxframe, 'Backtrack');
push @code, CgOp::goto('backtrack');
push @code, CgOp::label($fail);
push @code, CgOp::rawcall(CgOp::rxframe, 'CommitGroup',
CgOp::clr_string("CUTGRP"), CgOp::clr_string("ENDCUTGRP"));
push @code, CgOp::rawccall(CgOp::rxframe, 'Backtrack');
push @code, CgOp::goto('backtrack');
push @code, CgOp::label($pass);

@code;
Expand Down Expand Up @@ -278,7 +277,7 @@ use CgOp;
push @code, $self->zyg->[0]->code($body);
push @code, CgOp::rawcall(CgOp::rxframe, 'CommitGroup',
CgOp::clr_string("CUTGRP"), CgOp::clr_string("ENDCUTGRP"));
push @code, CgOp::rawccall(CgOp::rxframe, 'Backtrack');
push @code, CgOp::goto('backtrack');
push @code, CgOp::label($pass);

@code;
Expand Down Expand Up @@ -338,13 +337,13 @@ use CgOp;
my @pushcapf = (@{ $self->captures } == 0) ? () : (
CgOp::rawcall(CgOp::rxframe, "PushCapture",
$namesf, CgOp::cast('Cursor', CgOp::letvar("k"))));
my $updatef =
CgOp::ternary(CgOp::rawcall(CgOp::letvar("k"), 'IsDefined'),
CgOp::prog(
@pushcapf, CgOp::rawcall(CgOp::rxframe, "SetPos",
CgOp::getfield("pos", CgOp::cast("Cursor",
CgOp::letvar("k"))))),
CgOp::rawccall(CgOp::rxframe, "Backtrack"));
my $updatef = CgOp::prog(
CgOp::ncgoto('backtrack', CgOp::rawcall(CgOp::letvar("k"),
'IsDefined')),
@pushcapf,
CgOp::rawcall(CgOp::rxframe, "SetPos",
CgOp::getfield("pos", CgOp::cast("Cursor",
CgOp::letvar("k")))));

my @code;

Expand Down Expand Up @@ -473,7 +472,7 @@ use CgOp;
map { $_->lad } @{ $self->zyg })),
CgOp::clr_string('')),
CgOp::const(CgOp::rawnewarr('Int32', map { CgOp::labelid($_) } @ls)));
push @code, CgOp::rawccall(CgOp::rxframe, 'Backtrack');
push @code, CgOp::goto('backtrack');
for (my $i = 0; $i < @ls; $i++) {
push @code, CgOp::label($ls[$i]);
push @code, $self->zyg->[$i]->code($body);
Expand Down Expand Up @@ -536,7 +535,7 @@ use CgOp;
"ks", CgOp::null('Variable'),
"k", CgOp::null('IP6'),
CgOp::label('nextfn'),
CgOp::cgoto('end',
CgOp::cgoto('backtrack',
CgOp::compare('>=', CgOp::letvar("i"),
CgOp::getfield("Length", CgOp::letvar("fns")))),
CgOp::rxpushb('LTM', 'nextfn'),
Expand All @@ -546,21 +545,20 @@ use CgOp;
CgOp::letvar("i", CgOp::arith('+', CgOp::letvar("i"), CgOp::int(1))),
CgOp::letvar("k", CgOp::fetch(CgOp::rawsccall('Kernel.GetFirst:c,Variable',
CgOp::fetch(CgOp::letvar("ks"))))),
CgOp::ncgoto('end',
CgOp::ncgoto('backtrack',
CgOp::rawcall(CgOp::letvar("k"), 'IsDefined')),
CgOp::rawccall(CgOp::rxframe, 'End', CgOp::cast('Cursor',
CgOp::letvar("k"))),
CgOp::letvar('ks', CgOp::methodcall(CgOp::methodcall(
CgOp::letvar('ks'), "list"), "clone")),
CgOp::sink(CgOp::methodcall(CgOp::letvar('ks'), 'shift')),
CgOp::label('nextcsr'),
CgOp::ncgoto('end', CgOp::unbox('Boolean', CgOp::fetch(
CgOp::ncgoto('backtrack', CgOp::unbox('Boolean', CgOp::fetch(
CgOp::methodcall(CgOp::letvar('ks'), 'Bool')))),
CgOp::rxpushb('SUBRULE', 'nextcsr'),
CgOp::rawccall(CgOp::rxframe, 'End', CgOp::cast('Cursor',
CgOp::fetch(CgOp::methodcall(CgOp::letvar('ks'), 'shift')))),
CgOp::label('end'),
CgOp::rawccall(CgOp::rxframe, 'Backtrack'))
CgOp::goto('backtrack'));
}

sub lad {
Expand Down Expand Up @@ -628,7 +626,7 @@ use CgOp;

sub code {
my ($self, $body) = @_;
CgOp::rawccall(CgOp::rxframe, "Backtrack");
CgOp::goto('backtrack');
}

sub lad {
Expand Down

0 comments on commit 6617fa8

Please sign in to comment.