aboutsummaryrefslogtreecommitdiff
path: root/src/lj_err.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_err.c')
-rw-r--r--src/lj_err.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/lj_err.c b/src/lj_err.c
index 9ae376ff..9c6de3aa 100644
--- a/src/lj_err.c
+++ b/src/lj_err.c
@@ -283,7 +283,7 @@ static TValue *findlocal(lua_State *L, const lua_Debug *ar,
283{ 283{
284 uint32_t offset = (uint32_t)ar->i_ci & 0xffff; 284 uint32_t offset = (uint32_t)ar->i_ci & 0xffff;
285 uint32_t size = (uint32_t)ar->i_ci >> 16; 285 uint32_t size = (uint32_t)ar->i_ci >> 16;
286 TValue *frame = L->stack + offset; 286 TValue *frame = tvref(L->stack) + offset;
287 TValue *nextframe = size ? frame + size : NULL; 287 TValue *nextframe = size ? frame + size : NULL;
288 GCfunc *fn = frame_func(frame); 288 GCfunc *fn = frame_func(frame);
289 BCPos pc = currentpc(L, fn, nextframe); 289 BCPos pc = currentpc(L, fn, nextframe);
@@ -335,9 +335,10 @@ LUA_API int lua_getinfo(lua_State *L, const char *what, lua_Debug *ar)
335 uint32_t offset = (uint32_t)ar->i_ci & 0xffff; 335 uint32_t offset = (uint32_t)ar->i_ci & 0xffff;
336 uint32_t size = (uint32_t)ar->i_ci >> 16; 336 uint32_t size = (uint32_t)ar->i_ci >> 16;
337 lua_assert(offset != 0); 337 lua_assert(offset != 0);
338 frame = L->stack + offset; 338 frame = tvref(L->stack) + offset;
339 if (size) nextframe = frame + size; 339 if (size) nextframe = frame + size;
340 lua_assert(frame<=L->maxstack && (!nextframe || nextframe<=L->maxstack)); 340 lua_assert(frame <= tvref(L->maxstack) &&
341 (!nextframe || nextframe <= tvref(L->maxstack)));
341 fn = frame_func(frame); 342 fn = frame_func(frame);
342 lua_assert(fn->c.gct == ~LJ_TFUNC); 343 lua_assert(fn->c.gct == ~LJ_TFUNC);
343 } 344 }
@@ -399,9 +400,9 @@ LUA_API int lua_getinfo(lua_State *L, const char *what, lua_Debug *ar)
399 400
400cTValue *lj_err_getframe(lua_State *L, int level, int *size) 401cTValue *lj_err_getframe(lua_State *L, int level, int *size)
401{ 402{
402 cTValue *frame, *nextframe; 403 cTValue *frame, *nextframe, *bot = tvref(L->stack);
403 /* Traverse frames backwards. */ 404 /* Traverse frames backwards. */
404 for (nextframe = frame = L->base-1; frame > L->stack; ) { 405 for (nextframe = frame = L->base-1; frame > bot; ) {
405 if (frame_gc(frame) == obj2gco(L)) 406 if (frame_gc(frame) == obj2gco(L))
406 level++; /* Skip dummy frames. See lj_meta_call(). */ 407 level++; /* Skip dummy frames. See lj_meta_call(). */
407 if (level-- == 0) { 408 if (level-- == 0) {
@@ -426,7 +427,7 @@ LUA_API int lua_getstack(lua_State *L, int level, lua_Debug *ar)
426 int size; 427 int size;
427 cTValue *frame = lj_err_getframe(L, level, &size); 428 cTValue *frame = lj_err_getframe(L, level, &size);
428 if (frame) { 429 if (frame) {
429 ar->i_ci = (size << 16) + cast_int(frame - L->stack); 430 ar->i_ci = (size << 16) + cast_int(frame - tvref(L->stack));
430 return 1; 431 return 1;
431 } else { 432 } else {
432 ar->i_ci = level - size; 433 ar->i_ci = level - size;
@@ -465,7 +466,7 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode)
465 return cf; 466 return cf;
466 } 467 }
467 } 468 }
468 if (frame <= L->stack) 469 if (frame <= tvref(L->stack))
469 break; 470 break;
470 switch (frame_typep(frame)) { 471 switch (frame_typep(frame)) {
471 case FRAME_LUA: /* Lua frame. */ 472 case FRAME_LUA: /* Lua frame. */
@@ -524,7 +525,7 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode)
524 /* No C frame. */ 525 /* No C frame. */
525 if (errcode) { 526 if (errcode) {
526 L->cframe = NULL; 527 L->cframe = NULL;
527 L->base = L->stack+1; 528 L->base = tvref(L->stack)+1;
528 unwindstack(L, L->base); 529 unwindstack(L, L->base);
529 if (G(L)->panic) 530 if (G(L)->panic)
530 G(L)->panic(L); 531 G(L)->panic(L);
@@ -749,9 +750,9 @@ LJ_NOINLINE void lj_err_mem(lua_State *L)
749/* Find error function for runtime errors. Requires an extra stack traversal. */ 750/* Find error function for runtime errors. Requires an extra stack traversal. */
750static ptrdiff_t finderrfunc(lua_State *L) 751static ptrdiff_t finderrfunc(lua_State *L)
751{ 752{
752 TValue *frame = L->base-1; 753 cTValue *frame = L->base-1, *bot = tvref(L->stack);
753 void *cf = L->cframe; 754 void *cf = L->cframe;
754 while (frame > L->stack) { 755 while (frame > bot) {
755 lua_assert(cf != NULL); 756 lua_assert(cf != NULL);
756 while (cframe_nres(cframe_raw(cf)) < 0) { /* cframe without frame? */ 757 while (cframe_nres(cframe_raw(cf)) < 0) { /* cframe without frame? */
757 if (frame >= restorestack(L, -cframe_nres(cf))) 758 if (frame >= restorestack(L, -cframe_nres(cf)))