summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/jit.c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2014-09-29 15:00:04 +0000
committerkr.angelov <kr.angelov@gmail.com>2014-09-29 15:00:04 +0000
commit80acad444792b77a77b6fa232989e1d2caf8c673 (patch)
tree6f29193042700a0f3423156dc9fe28f3b4a9061d /src/runtime/c/pgf/jit.c
parent1ecd61f7f58ca148024d8d40b7bd046142d0e9ad (diff)
bugfix in the pattern matching compiler and a number of other fixes that I somehow did not push before
Diffstat (limited to 'src/runtime/c/pgf/jit.c')
-rw-r--r--src/runtime/c/pgf/jit.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/runtime/c/pgf/jit.c b/src/runtime/c/pgf/jit.c
index 0470b7f9f..09fdf3bc6 100644
--- a/src/runtime/c/pgf/jit.c
+++ b/src/runtime/c/pgf/jit.c
@@ -1093,6 +1093,28 @@ pgf_jit_function(PgfReader* rdr, PgfAbstr* abstr,
jit_bare_ret(a*sizeof(PgfClosure*));
break;
}
+ case PGF_INSTR_DROP: {
+ size_t n = pgf_read_int(rdr);
+ size_t target = pgf_read_int(rdr);
+
+#ifdef PGF_JIT_DEBUG
+ gu_printf(out, err, "DROP %d %03d\n", n, target);
+#endif
+
+ if (n > 0)
+ jit_addi_p(JIT_SP, JIT_SP, n*sizeof(PgfClosure*));
+
+ jit_insn *jump =
+ jit_jmpi(jit_forward());
+
+ PgfSegmentPatch label_patch;
+ label_patch.segment = target;
+ label_patch.ref = jump;
+ label_patch.is_abs = false;
+ gu_buf_push(rdr->jit_state->segment_patches, PgfSegmentPatch, label_patch);
+
+ break;
+ }
case PGF_INSTR_FAIL:
#ifdef PGF_JIT_DEBUG
gu_printf(out, err, "FAIL\n");