aboutsummaryrefslogtreecommitdiff
path: root/interpreter/Elymas.pm
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-01-14 12:53:09 +0100
committerDrahflow <drahflow@gmx.de>2013-01-14 12:53:09 +0100
commitfe0d09cfceff89d3215f3fa3f148ac3130d9b91a (patch)
treebdb8b4f74ee17bf862cbc5045c9e8fb450b5ed16 /interpreter/Elymas.pm
parent347a635d04df610e1a5a56a46eddf071533a13ac (diff)
I heard you like JIT, so I put some JIT in your JIT
Diffstat (limited to 'interpreter/Elymas.pm')
-rw-r--r--interpreter/Elymas.pm36
1 files changed, 35 insertions, 1 deletions
diff --git a/interpreter/Elymas.pm b/interpreter/Elymas.pm
index 20f8c36..eb514fa 100644
--- a/interpreter/Elymas.pm
+++ b/interpreter/Elymas.pm
@@ -7,7 +7,7 @@ require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(
popInt popString popArray arrayAccess $quoted @globalCallStack
- interpretCode execute executeString executeFile resolve canCastTo typeEqual
+ interpretCode compileCode execute executeString executeFile resolve canCastTo typeEqual
);
use Data::Dumper;
@@ -73,6 +73,40 @@ sub interpretCode {
}
}
+sub compileCode {
+ my ($code) = @_;
+
+ my $ret = "my \$i = 0; eval {\n";
+
+ foreach my $i (0 .. $#$code) {
+ my $t = $code->[$i];
+
+ if(ref($t->[1]) eq 'ARRAY' and $t->[1]->[0] eq 'func') {
+ if(not $t->[1]->[2]) {
+ # untyped function, just call, no need to go through execute
+ $ret .= "push \@globalCallStack, \$code[$i];\n";
+ $ret .= "&{\$code[$i]->[0]}(\$data, \$lscope);\n";
+ $ret .= "pop \@globalCallStack;\n";
+ } else {
+ $ret .= "\$i = $i; execute(\$code[$i], \$data, \$lscope);\n";
+ }
+ } else {
+ $ret .= "push \@\$data, \$code[$i];\n";
+ }
+ }
+
+ $ret .= <<'EOPERL';
+ };
+ if($@) {
+ print "Stack: " . Dumper($data);
+ print "Token: " . Dumper($code[$i]);
+ die;
+ }
+EOPERL
+
+ return $ret;
+}
+
sub typeStack {
my ($type) = @_;