diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2014-09-29 15:00:04 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2014-09-29 15:00:04 +0000 |
| commit | 80acad444792b77a77b6fa232989e1d2caf8c673 (patch) | |
| tree | 6f29193042700a0f3423156dc9fe28f3b4a9061d /src/runtime/c/pgf/jit.c | |
| parent | 1ecd61f7f58ca148024d8d40b7bd046142d0e9ad (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.c | 22 |
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"); |
