diff options
| -rw-r--r-- | src/lib_jit.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/lib_jit.c b/src/lib_jit.c index af3e0a6ff..e6c5271f8 100644 --- a/src/lib_jit.c +++ b/src/lib_jit.c | |||
| @@ -340,11 +340,12 @@ LJLIB_CF(jit_util_tracek) | |||
| 340 | return 0; | 340 | return 0; |
| 341 | } | 341 | } |
| 342 | 342 | ||
| 343 | /* local snap = jit.util.tracesnap(tr, sn) */ | 343 | /* local snap = jit.util.tracesnap(tr, sn[, getpos]) */ |
| 344 | LJLIB_CF(jit_util_tracesnap) | 344 | LJLIB_CF(jit_util_tracesnap) |
| 345 | { | 345 | { |
| 346 | GCtrace *T = jit_checktrace(L); | 346 | GCtrace *T = jit_checktrace(L); |
| 347 | SnapNo sn = (SnapNo)lj_lib_checkint(L, 2); | 347 | SnapNo sn = (SnapNo)lj_lib_checkint(L, 2); |
| 348 | int getpos = (L->base+2 < L->top && tvistruecond(L->base+2)); | ||
| 348 | if (T && sn < T->nsnap) { | 349 | if (T && sn < T->nsnap) { |
| 349 | SnapShot *snap = &T->snap[sn]; | 350 | SnapShot *snap = &T->snap[sn]; |
| 350 | SnapEntry *map = &T->snapmap[snap->mapofs]; | 351 | SnapEntry *map = &T->snapmap[snap->mapofs]; |
| @@ -357,6 +358,12 @@ LJLIB_CF(jit_util_tracesnap) | |||
| 357 | for (n = 0; n < nent; n++) | 358 | for (n = 0; n < nent; n++) |
| 358 | setintV(lj_tab_setint(L, t, (int32_t)(n+2)), (int32_t)map[n]); | 359 | setintV(lj_tab_setint(L, t, (int32_t)(n+2)), (int32_t)map[n]); |
| 359 | setintV(lj_tab_setint(L, t, (int32_t)(nent+2)), (int32_t)SNAP(255, 0, 0)); | 360 | setintV(lj_tab_setint(L, t, (int32_t)(nent+2)), (int32_t)SNAP(255, 0, 0)); |
| 361 | if (getpos) { | ||
| 362 | const BCIns *pc = snap_pc(&map[nent]), *startpc = pc; | ||
| 363 | while (bc_op(*startpc) < BC_FUNCF) startpc--; | ||
| 364 | setintV(L->top++, (int)(pc - startpc)); | ||
| 365 | return 2; | ||
| 366 | } | ||
| 360 | return 1; | 367 | return 1; |
| 361 | } | 368 | } |
| 362 | return 0; | 369 | return 0; |
