Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[nrx] Expose basic nrx functionality to CgOp
  • Loading branch information
sorear committed Sep 5, 2010
1 parent 3e8d824 commit ebb3662
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
10 changes: 10 additions & 0 deletions src/CgOp.pm
Expand Up @@ -522,6 +522,10 @@ use warnings;
CgOp::Primitive->new(op => [ 'clr_string', $_[0] ]);
}

sub char {
CgOp::Primitive->new(op => [ 'clr_char', $_[0] ]);
}

sub withtypes {
if (blessed($_[0])) {
prog(@_);
Expand Down Expand Up @@ -572,6 +576,12 @@ use warnings;
zyg => [ $inv, @args ], is_cps_call => 1);
}

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

sub fgoto {
my ($tgt) = @_;
CgOp::Primitive->new(op => [ 'goto', $_[0] ], zyg => [ $_[1] ],
Expand Down
21 changes: 21 additions & 0 deletions src/CodeGen.pm
Expand Up @@ -49,6 +49,7 @@ use 5.010;
ToString => [m => 'String'] },
'Frame' =>
{ pos => [f => 'Variable[]'],
rx => [f => 'RxFrame'],
caller => [f => 'Frame'],
outer => [f => 'Frame'],
proto => [f => 'Frame'],
Expand All @@ -57,6 +58,15 @@ use 5.010;
ExecutingFile=> [m => 'String'],
ExtractNamed => [m => 'Variable'],
LexicalFind => [m => 'Variable'] },
'RxFrame' =>
{ Exact => [m => 'Boolean'],
Exact1 => [m => 'Boolean'],
IncQuant => [m => 'Void'],
GetQuant => [m => 'Int32'],
OpenQuant => [m => 'Void'],
CloseQuant => [m => 'Int32'],
Backtrack => [c => 'Void'],
End => [c => 'Void'] },
'Niecza.FatalException' =>
{ SearchForHandler => [c => 'Void'] },
'Niecza.LexoticControlException' =>
Expand Down Expand Up @@ -483,6 +493,11 @@ use 5.010;
$self->_push('System.String', qm($text));
}

sub clr_char {
my ($self, $val) = @_;
$self->_push('Char', "((char)" . ord($val) . ")");
}

sub clr_int {
my ($self, $val) = @_;
$self->_push('Int32', $val);
Expand Down Expand Up @@ -600,6 +615,12 @@ 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)");
}

sub return {
my ($self, $nv) = @_;
return if $self->unreach;
Expand Down
27 changes: 26 additions & 1 deletion test2.pl
@@ -1,6 +1,31 @@
# vim: ft=perl6
use Test;

ok '{}' ~~ / \{ <.ws> \} /, 'ws matches between \W';
#ok '{}' ~~ / \{ <.ws> \} /, 'ws matches between \W';

sub rxt($C) {
Q:CgOp {
(prog
(setfield rx (callframe) (rawnew RxFrame (cast Cursor (@ {$C}))))
(rxbprim ExactOne (char x))
(rawccall (getfield rx (callframe)) End)
(rawccall (getfield rx (callframe)) Backtrack)
(null Variable))
}
}
PRE-INIT {
Q:CgOp {
(prog
(rawsset RxFrame.EMPTYP (@ {EMPTY}))
(rawsset RxFrame.ListMO (getfield klass (cast DynObject (@ {List}))))
(rawsset RxFrame.LLArrayMO (getfield klass
(cast DynObject (@ {LLArray}))))
(null Variable))
}
}

ok rxt(Cursor.new("x")).Bool, "/x/ ~~ x";
ok !rxt(Cursor.new("y")).Bool, "/x/ !~ y";

done-testing;

0 comments on commit ebb3662

Please sign in to comment.