aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib_jit.c9
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]) */
344LJLIB_CF(jit_util_tracesnap) 344LJLIB_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;