diff options
Diffstat (limited to 'src/lj_err.c')
-rw-r--r-- | src/lj_err.c | 21 |
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 | ||
400 | cTValue *lj_err_getframe(lua_State *L, int level, int *size) | 401 | cTValue *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. */ |
750 | static ptrdiff_t finderrfunc(lua_State *L) | 751 | static 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))) |