diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-11-04 10:57:02 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-11-04 10:57:02 -0200 |
| commit | 93fd67b7936f0f1fc20645d18eb85a193887c315 (patch) | |
| tree | 11cd249fad6b0253f0de48b94c08ab08671b8544 | |
| parent | 6bb3e40a8d2cdb64a6ac1962d8748dd638a11721 (diff) | |
| download | lua-93fd67b7936f0f1fc20645d18eb85a193887c315.tar.gz lua-93fd67b7936f0f1fc20645d18eb85a193887c315.tar.bz2 lua-93fd67b7936f0f1fc20645d18eb85a193887c315.zip | |
no more 'CallInfo' structure
| -rw-r--r-- | ldo.c | 64 | ||||
| -rw-r--r-- | ldo.h | 5 | ||||
| -rw-r--r-- | lstate.c | 57 | ||||
| -rw-r--r-- | lstate.h | 15 | ||||
| -rw-r--r-- | lvm.c | 9 |
5 files changed, 31 insertions, 119 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 2.167 2017/11/03 17:22:54 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 2.168 2017/11/03 20:41:05 roberto Exp roberto $ |
| 3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -157,15 +157,11 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { | |||
| 157 | ** =================================================================== | 157 | ** =================================================================== |
| 158 | */ | 158 | */ |
| 159 | static void correctstack (lua_State *L, StkId oldstack) { | 159 | static void correctstack (lua_State *L, StkId oldstack) { |
| 160 | CallInfo *ci; | ||
| 161 | UpVal *up; | 160 | UpVal *up; |
| 162 | L->top = (L->top - oldstack) + L->stack; | 161 | L->top = (L->top - oldstack) + L->stack; |
| 163 | L->func = (L->func - oldstack) + L->stack; | 162 | L->func = (L->func - oldstack) + L->stack; |
| 164 | for (up = L->openupval; up != NULL; up = up->u.open.next) | 163 | for (up = L->openupval; up != NULL; up = up->u.open.next) |
| 165 | up->v = s2v((uplevel(up) - oldstack) + L->stack); | 164 | up->v = s2v((uplevel(up) - oldstack) + L->stack); |
| 166 | for (ci = L->ci; ci != NULL; ci = ci->previous) { | ||
| 167 | ci->func = (ci->func - oldstack) + L->stack; | ||
| 168 | } | ||
| 169 | } | 165 | } |
| 170 | 166 | ||
| 171 | 167 | ||
| @@ -223,10 +219,6 @@ void luaD_shrinkstack (lua_State *L) { | |||
| 223 | int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK; | 219 | int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK; |
| 224 | if (goodsize > LUAI_MAXSTACK) | 220 | if (goodsize > LUAI_MAXSTACK) |
| 225 | goodsize = LUAI_MAXSTACK; /* respect stack limit */ | 221 | goodsize = LUAI_MAXSTACK; /* respect stack limit */ |
| 226 | if (L->stacksize > LUAI_MAXSTACK) /* had been handling stack overflow? */ | ||
| 227 | luaE_freeCI(L); /* free all CIs (list grew because of an error) */ | ||
| 228 | else | ||
| 229 | luaE_shrinkCI(L); /* shrink list */ | ||
| 230 | /* if thread is currently not handling a stack overflow and its | 222 | /* if thread is currently not handling a stack overflow and its |
| 231 | good size is smaller than current size, shrink its stack */ | 223 | good size is smaller than current size, shrink its stack */ |
| 232 | if (inuse <= (LUAI_MAXSTACK - EXTRA_STACK) && | 224 | if (inuse <= (LUAI_MAXSTACK - EXTRA_STACK) && |
| @@ -363,7 +355,7 @@ static int moveresults (lua_State *L, StkId firstResult, StkId res, | |||
| 363 | ** moves current number of results to proper place; returns 0 iff call | 355 | ** moves current number of results to proper place; returns 0 iff call |
| 364 | ** wanted multiple (variable number of) results. | 356 | ** wanted multiple (variable number of) results. |
| 365 | */ | 357 | */ |
| 366 | int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) { | 358 | int luaD_poscall (lua_State *L, StkId firstResult, int nres) { |
| 367 | StkId res = L->func; /* res == final position of 1st result */ | 359 | StkId res = L->func; /* res == final position of 1st result */ |
| 368 | int wanted = res->stkci.nresults; | 360 | int wanted = res->stkci.nresults; |
| 369 | if (L->hookmask & (LUA_MASKRET | LUA_MASKLINE)) { | 361 | if (L->hookmask & (LUA_MASKRET | LUA_MASKLINE)) { |
| @@ -376,18 +368,12 @@ int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) { | |||
| 376 | /* 'oldpc' for caller function */ | 368 | /* 'oldpc' for caller function */ |
| 377 | L->oldpc = (res - res->stkci.previous)->stkci.u.l.savedpc; | 369 | L->oldpc = (res - res->stkci.previous)->stkci.u.l.savedpc; |
| 378 | } | 370 | } |
| 379 | L->ci = ci->previous; /* back to caller */ | ||
| 380 | L->func = res - res->stkci.previous; | 371 | L->func = res - res->stkci.previous; |
| 381 | lua_assert(L->func == L->ci->func); | ||
| 382 | /* move results to proper place */ | 372 | /* move results to proper place */ |
| 383 | return moveresults(L, firstResult, res, nres, wanted); | 373 | return moveresults(L, firstResult, res, nres, wanted); |
| 384 | } | 374 | } |
| 385 | 375 | ||
| 386 | 376 | ||
| 387 | |||
| 388 | #define next_ci(L) (L->ci = (L->ci->next ? L->ci->next : luaE_extendCI(L))) | ||
| 389 | |||
| 390 | |||
| 391 | /* | 377 | /* |
| 392 | ** Prepares a function call: checks the stack, creates a new CallInfo | 378 | ** Prepares a function call: checks the stack, creates a new CallInfo |
| 393 | ** entry, fills in the relevant information, calls hook if needed. | 379 | ** entry, fills in the relevant information, calls hook if needed. |
| @@ -398,7 +384,6 @@ int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) { | |||
| 398 | int luaD_precall (lua_State *L, StkId func, int nresults) { | 384 | int luaD_precall (lua_State *L, StkId func, int nresults) { |
| 399 | lua_CFunction f; | 385 | lua_CFunction f; |
| 400 | TValue *funcv = s2v(func); | 386 | TValue *funcv = s2v(func); |
| 401 | CallInfo *ci; | ||
| 402 | switch (ttype(funcv)) { | 387 | switch (ttype(funcv)) { |
| 403 | case LUA_TCCL: /* C closure */ | 388 | case LUA_TCCL: /* C closure */ |
| 404 | f = clCvalue(funcv)->f; | 389 | f = clCvalue(funcv)->f; |
| @@ -408,10 +393,9 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 408 | Cfunc: { | 393 | Cfunc: { |
| 409 | int n; /* number of returns */ | 394 | int n; /* number of returns */ |
| 410 | checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ | 395 | checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ |
| 411 | ci = next_ci(L); /* now 'enter' new function */ | ||
| 412 | func->stkci.nresults = nresults; | 396 | func->stkci.nresults = nresults; |
| 413 | func->stkci.previous = func - L->func; | 397 | func->stkci.previous = func - L->func; |
| 414 | L->func = ci->func = func; | 398 | L->func = func; |
| 415 | setfunctop(func, L->top + LUA_MINSTACK); | 399 | setfunctop(func, L->top + LUA_MINSTACK); |
| 416 | lua_assert(functop(func) <= L->stack_last); | 400 | lua_assert(functop(func) <= L->stack_last); |
| 417 | callstatus(func) = 0; | 401 | callstatus(func) = 0; |
| @@ -421,7 +405,7 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 421 | n = (*f)(L); /* do the actual call */ | 405 | n = (*f)(L); /* do the actual call */ |
| 422 | lua_lock(L); | 406 | lua_lock(L); |
| 423 | api_checknelems(L, n); | 407 | api_checknelems(L, n); |
| 424 | luaD_poscall(L, ci, L->top - n, n); | 408 | luaD_poscall(L, L->top - n, n); |
| 425 | return 1; | 409 | return 1; |
| 426 | } | 410 | } |
| 427 | case LUA_TLCL: { /* Lua function: prepare its call */ | 411 | case LUA_TLCL: { /* Lua function: prepare its call */ |
| @@ -433,11 +417,10 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 433 | setnilvalue(s2v(L->top++)); /* complete missing arguments */ | 417 | setnilvalue(s2v(L->top++)); /* complete missing arguments */ |
| 434 | if (p->is_vararg) | 418 | if (p->is_vararg) |
| 435 | luaT_adjustvarargs(L, p, n); | 419 | luaT_adjustvarargs(L, p, n); |
| 436 | ci = next_ci(L); /* now 'enter' new function */ | ||
| 437 | func->stkci.nresults = nresults; | 420 | func->stkci.nresults = nresults; |
| 438 | func->stkci.previous = func - L->func; | 421 | func->stkci.previous = func - L->func; |
| 439 | func->stkci.framesize = fsize + 1; /* size includes function itself */ | 422 | func->stkci.framesize = fsize + 1; /* size includes function itself */ |
| 440 | L->func = ci->func = func; | 423 | L->func = func; |
| 441 | L->top = func + 1 + fsize; | 424 | L->top = func + 1 + fsize; |
| 442 | lua_assert(functop(func) <= L->stack_last); | 425 | lua_assert(functop(func) <= L->stack_last); |
| 443 | func->stkci.u.l.savedpc = p->code; /* starting point */ | 426 | func->stkci.u.l.savedpc = p->code; /* starting point */ |
| @@ -500,7 +483,6 @@ void luaD_callnoyield (lua_State *L, StkId func, int nResults) { | |||
| 500 | ** continuation function. | 483 | ** continuation function. |
| 501 | */ | 484 | */ |
| 502 | static void finishCcall (lua_State *L, int status) { | 485 | static void finishCcall (lua_State *L, int status) { |
| 503 | CallInfo *ci = L->ci; | ||
| 504 | StkId func = L->func; | 486 | StkId func = L->func; |
| 505 | int n; | 487 | int n; |
| 506 | /* must have a continuation and must be able to call it */ | 488 | /* must have a continuation and must be able to call it */ |
| @@ -519,7 +501,7 @@ static void finishCcall (lua_State *L, int status) { | |||
| 519 | n = (*func->stkci.u.c.k)(L, status, func->stkci.u.c.ctx); | 501 | n = (*func->stkci.u.c.k)(L, status, func->stkci.u.c.ctx); |
| 520 | lua_lock(L); | 502 | lua_lock(L); |
| 521 | api_checknelems(L, n); | 503 | api_checknelems(L, n); |
| 522 | luaD_poscall(L, ci, L->top - n, n); /* finish 'luaD_precall' */ | 504 | luaD_poscall(L, L->top - n, n); /* finish 'luaD_precall' */ |
| 523 | } | 505 | } |
| 524 | 506 | ||
| 525 | 507 | ||
| @@ -534,7 +516,7 @@ static void finishCcall (lua_State *L, int status) { | |||
| 534 | static void unroll (lua_State *L, void *ud) { | 516 | static void unroll (lua_State *L, void *ud) { |
| 535 | if (ud != NULL) /* error status? */ | 517 | if (ud != NULL) /* error status? */ |
| 536 | finishCcall(L, *(int *)ud); /* finish 'lua_pcallk' callee */ | 518 | finishCcall(L, *(int *)ud); /* finish 'lua_pcallk' callee */ |
| 537 | while (L->ci != &L->base_ci) { /* something in the stack */ | 519 | while (L->func != L->stack) { /* something in the stack */ |
| 538 | if (!isLua(L->func)) /* C function? */ | 520 | if (!isLua(L->func)) /* C function? */ |
| 539 | finishCcall(L, LUA_YIELD); /* complete its execution */ | 521 | finishCcall(L, LUA_YIELD); /* complete its execution */ |
| 540 | else { /* Lua function */ | 522 | else { /* Lua function */ |
| @@ -549,11 +531,13 @@ static void unroll (lua_State *L, void *ud) { | |||
| 549 | ** Try to find a suspended protected call (a "recover point") for the | 531 | ** Try to find a suspended protected call (a "recover point") for the |
| 550 | ** given thread. | 532 | ** given thread. |
| 551 | */ | 533 | */ |
| 552 | static CallInfo *findpcall (lua_State *L) { | 534 | static StkId findpcall (lua_State *L) { |
| 553 | CallInfo *ci; | 535 | StkId func; |
| 554 | for (ci = L->ci; ci != NULL; ci = ci->previous) { /* search for a pcall */ | 536 | for (func = L->func; |
| 555 | if (callstatus(ci->func) & CIST_YPCALL) | 537 | func->stkci.previous != 0; |
| 556 | return ci; | 538 | func -= func->stkci.previous) { |
| 539 | if (callstatus(func) & CIST_YPCALL) | ||
| 540 | return func; | ||
| 557 | } | 541 | } |
| 558 | return NULL; /* no pending pcall */ | 542 | return NULL; /* no pending pcall */ |
| 559 | } | 543 | } |
| @@ -566,18 +550,17 @@ static CallInfo *findpcall (lua_State *L) { | |||
| 566 | */ | 550 | */ |
| 567 | static int recover (lua_State *L, int status) { | 551 | static int recover (lua_State *L, int status) { |
| 568 | StkId oldtop; | 552 | StkId oldtop; |
| 569 | CallInfo *ci = findpcall(L); | 553 | StkId recf = findpcall(L); |
| 570 | if (ci == NULL) return 0; /* no recovery point */ | 554 | if (recf == NULL) return 0; /* no recovery point */ |
| 571 | /* "finish" luaD_pcall */ | 555 | /* "finish" luaD_pcall */ |
| 572 | oldtop = ci->func + ci->func->stkci.u2.funcidx; | 556 | oldtop = recf + recf->stkci.u2.funcidx; |
| 573 | luaF_close(L, oldtop); | 557 | luaF_close(L, oldtop); |
| 574 | seterrorobj(L, status, oldtop); | 558 | seterrorobj(L, status, oldtop); |
| 575 | L->ci = ci; | 559 | L->func = recf; |
| 576 | L->func = ci->func; | 560 | L->allowhook = getoah(callstatus(recf)); /* restore original 'allowhook' */ |
| 577 | L->allowhook = getoah(callstatus(L->func)); /* restore original 'allowhook' */ | ||
| 578 | L->nny = 0; /* should be zero to be yieldable */ | 561 | L->nny = 0; /* should be zero to be yieldable */ |
| 579 | luaD_shrinkstack(L); | 562 | luaD_shrinkstack(L); |
| 580 | L->errfunc = ci->func->stkci.u.c.old_errfunc; | 563 | L->errfunc = recf->stkci.u.c.old_errfunc; |
| 581 | return 1; /* continue running the coroutine */ | 564 | return 1; /* continue running the coroutine */ |
| 582 | } | 565 | } |
| 583 | 566 | ||
| @@ -606,7 +589,6 @@ static int resume_error (lua_State *L, const char *msg, int narg) { | |||
| 606 | static void resume (lua_State *L, void *ud) { | 589 | static void resume (lua_State *L, void *ud) { |
| 607 | int n = *(cast(int*, ud)); /* number of arguments */ | 590 | int n = *(cast(int*, ud)); /* number of arguments */ |
| 608 | StkId firstArg = L->top - n; /* first argument */ | 591 | StkId firstArg = L->top - n; /* first argument */ |
| 609 | CallInfo *ci = L->ci; | ||
| 610 | StkId func = L->func; | 592 | StkId func = L->func; |
| 611 | if (L->status == LUA_OK) { /* starting a coroutine? */ | 593 | if (L->status == LUA_OK) { /* starting a coroutine? */ |
| 612 | if (!luaD_precall(L, firstArg - 1, LUA_MULTRET)) /* Lua function? */ | 594 | if (!luaD_precall(L, firstArg - 1, LUA_MULTRET)) /* Lua function? */ |
| @@ -626,7 +608,7 @@ static void resume (lua_State *L, void *ud) { | |||
| 626 | api_checknelems(L, n); | 608 | api_checknelems(L, n); |
| 627 | firstArg = L->top - n; /* yield results come from continuation */ | 609 | firstArg = L->top - n; /* yield results come from continuation */ |
| 628 | } | 610 | } |
| 629 | luaD_poscall(L, ci, firstArg, n); /* finish 'luaD_precall' */ | 611 | luaD_poscall(L, firstArg, n); /* finish 'luaD_precall' */ |
| 630 | } | 612 | } |
| 631 | unroll(L, NULL); /* run continuation */ | 613 | unroll(L, NULL); /* run continuation */ |
| 632 | } | 614 | } |
| @@ -639,7 +621,7 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs, | |||
| 639 | unsigned short oldnny = L->nny; /* save "number of non-yieldable" calls */ | 621 | unsigned short oldnny = L->nny; /* save "number of non-yieldable" calls */ |
| 640 | lua_lock(L); | 622 | lua_lock(L); |
| 641 | if (L->status == LUA_OK) { /* may be starting a coroutine */ | 623 | if (L->status == LUA_OK) { /* may be starting a coroutine */ |
| 642 | if (L->ci != &L->base_ci) /* not in base level? */ | 624 | if (L->func != L->stack) /* not in base level? */ |
| 643 | return resume_error(L, "cannot resume non-suspended coroutine", nargs); | 625 | return resume_error(L, "cannot resume non-suspended coroutine", nargs); |
| 644 | } | 626 | } |
| 645 | else if (L->status != LUA_YIELD) | 627 | else if (L->status != LUA_YIELD) |
| @@ -712,7 +694,6 @@ LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx, | |||
| 712 | int luaD_pcall (lua_State *L, Pfunc func, void *u, | 694 | int luaD_pcall (lua_State *L, Pfunc func, void *u, |
| 713 | ptrdiff_t old_top, ptrdiff_t ef) { | 695 | ptrdiff_t old_top, ptrdiff_t ef) { |
| 714 | int status; | 696 | int status; |
| 715 | CallInfo *old_ci = L->ci; | ||
| 716 | ptrdiff_t oldfunc = savestack(L, L->func); | 697 | ptrdiff_t oldfunc = savestack(L, L->func); |
| 717 | lu_byte old_allowhooks = L->allowhook; | 698 | lu_byte old_allowhooks = L->allowhook; |
| 718 | unsigned short old_nny = L->nny; | 699 | unsigned short old_nny = L->nny; |
| @@ -723,7 +704,6 @@ int luaD_pcall (lua_State *L, Pfunc func, void *u, | |||
| 723 | StkId oldtop = restorestack(L, old_top); | 704 | StkId oldtop = restorestack(L, old_top); |
| 724 | luaF_close(L, oldtop); /* close possible pending closures */ | 705 | luaF_close(L, oldtop); /* close possible pending closures */ |
| 725 | seterrorobj(L, status, oldtop); | 706 | seterrorobj(L, status, oldtop); |
| 726 | L->ci = old_ci; | ||
| 727 | L->func = restorestack(L, oldfunc); | 707 | L->func = restorestack(L, oldfunc); |
| 728 | L->allowhook = old_allowhooks; | 708 | L->allowhook = old_allowhooks; |
| 729 | L->nny = old_nny; | 709 | L->nny = old_nny; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.h,v 2.30 2017/05/13 12:57:20 roberto Exp roberto $ | 2 | ** $Id: ldo.h,v 2.31 2017/06/29 15:06:44 roberto Exp roberto $ |
| 3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -52,8 +52,7 @@ LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); | |||
| 52 | LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults); | 52 | LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults); |
| 53 | LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, | 53 | LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, |
| 54 | ptrdiff_t oldtop, ptrdiff_t ef); | 54 | ptrdiff_t oldtop, ptrdiff_t ef); |
| 55 | LUAI_FUNC int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, | 55 | LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult, int nres); |
| 56 | int nres); | ||
| 57 | LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); | 56 | LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); |
| 58 | LUAI_FUNC void luaD_growstack (lua_State *L, int n); | 57 | LUAI_FUNC void luaD_growstack (lua_State *L, int n); |
| 59 | LUAI_FUNC void luaD_shrinkstack (lua_State *L); | 58 | LUAI_FUNC void luaD_shrinkstack (lua_State *L); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.c,v 2.143 2017/10/31 17:54:35 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 2.144 2017/11/03 12:12:30 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -97,51 +97,8 @@ void luaE_setdebt (global_State *g, l_mem debt) { | |||
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | 99 | ||
| 100 | CallInfo *luaE_extendCI (lua_State *L) { | ||
| 101 | CallInfo *ci = luaM_new(L, CallInfo); | ||
| 102 | lua_assert(L->ci->next == NULL); | ||
| 103 | L->ci->next = ci; | ||
| 104 | ci->previous = L->ci; | ||
| 105 | ci->next = NULL; | ||
| 106 | L->nci++; | ||
| 107 | return ci; | ||
| 108 | } | ||
| 109 | |||
| 110 | |||
| 111 | /* | ||
| 112 | ** free all CallInfo structures not in use by a thread | ||
| 113 | */ | ||
| 114 | void luaE_freeCI (lua_State *L) { | ||
| 115 | CallInfo *ci = L->ci; | ||
| 116 | CallInfo *next = ci->next; | ||
| 117 | ci->next = NULL; | ||
| 118 | while ((ci = next) != NULL) { | ||
| 119 | next = ci->next; | ||
| 120 | luaM_free(L, ci); | ||
| 121 | L->nci--; | ||
| 122 | } | ||
| 123 | } | ||
| 124 | |||
| 125 | |||
| 126 | /* | ||
| 127 | ** free half of the CallInfo structures not in use by a thread | ||
| 128 | */ | ||
| 129 | void luaE_shrinkCI (lua_State *L) { | ||
| 130 | CallInfo *ci = L->ci; | ||
| 131 | CallInfo *next2; /* next's next */ | ||
| 132 | /* while there are two nexts */ | ||
| 133 | while (ci->next != NULL && (next2 = ci->next->next) != NULL) { | ||
| 134 | luaM_free(L, ci->next); /* free next */ | ||
| 135 | L->nci--; | ||
| 136 | ci->next = next2; /* remove 'next' from the list */ | ||
| 137 | next2->previous = ci; | ||
| 138 | ci = next2; /* keep next's next */ | ||
| 139 | } | ||
| 140 | } | ||
| 141 | |||
| 142 | |||
| 143 | static void stack_init (lua_State *L1, lua_State *L) { | 100 | static void stack_init (lua_State *L1, lua_State *L) { |
| 144 | int i; CallInfo *ci; | 101 | int i; |
| 145 | /* initialize stack array */ | 102 | /* initialize stack array */ |
| 146 | L1->stack = luaM_newvector(L, BASIC_STACK_SIZE, StackValue); | 103 | L1->stack = luaM_newvector(L, BASIC_STACK_SIZE, StackValue); |
| 147 | L1->stacksize = BASIC_STACK_SIZE; | 104 | L1->stacksize = BASIC_STACK_SIZE; |
| @@ -149,24 +106,19 @@ static void stack_init (lua_State *L1, lua_State *L) { | |||
| 149 | setnilvalue(s2v(L1->stack + i)); /* erase new stack */ | 106 | setnilvalue(s2v(L1->stack + i)); /* erase new stack */ |
| 150 | L1->top = L1->stack; | 107 | L1->top = L1->stack; |
| 151 | L1->stack_last = L1->stack + L1->stacksize - EXTRA_STACK; | 108 | L1->stack_last = L1->stack + L1->stacksize - EXTRA_STACK; |
| 152 | /* initialize first ci */ | 109 | /* initialize first 'function' */ |
| 153 | ci = &L1->base_ci; | 110 | L1->func = L1->stack; |
| 154 | ci->next = ci->previous = NULL; | ||
| 155 | L1->func = ci->func = L1->top; | ||
| 156 | L1->func->stkci.previous = 0; /* end of linked list */ | 111 | L1->func->stkci.previous = 0; /* end of linked list */ |
| 157 | L1->func->stkci.framesize = LUA_MINSTACK + 1; | 112 | L1->func->stkci.framesize = LUA_MINSTACK + 1; |
| 158 | callstatus(L1->func) = 0; | 113 | callstatus(L1->func) = 0; |
| 159 | setnilvalue(s2v(L1->top)); /* 'function' entry for this 'ci' */ | 114 | setnilvalue(s2v(L1->top)); /* 'function' entry for this 'ci' */ |
| 160 | L1->top++; | 115 | L1->top++; |
| 161 | L1->ci = ci; | ||
| 162 | } | 116 | } |
| 163 | 117 | ||
| 164 | 118 | ||
| 165 | static void freestack (lua_State *L) { | 119 | static void freestack (lua_State *L) { |
| 166 | if (L->stack == NULL) | 120 | if (L->stack == NULL) |
| 167 | return; /* stack not completely built yet */ | 121 | return; /* stack not completely built yet */ |
| 168 | L->ci = &L->base_ci; /* free the entire 'ci' list */ | ||
| 169 | luaE_freeCI(L); | ||
| 170 | lua_assert(L->nci == 0); | 122 | lua_assert(L->nci == 0); |
| 171 | luaM_freearray(L, L->stack, L->stacksize); /* free stack array */ | 123 | luaM_freearray(L, L->stack, L->stacksize); /* free stack array */ |
| 172 | } | 124 | } |
| @@ -216,7 +168,6 @@ static void f_luaopen (lua_State *L, void *ud) { | |||
| 216 | static void preinit_thread (lua_State *L, global_State *g) { | 168 | static void preinit_thread (lua_State *L, global_State *g) { |
| 217 | G(L) = g; | 169 | G(L) = g; |
| 218 | L->stack = NULL; | 170 | L->stack = NULL; |
| 219 | L->ci = NULL; | ||
| 220 | L->func = NULL; | 171 | L->func = NULL; |
| 221 | L->nci = 0; | 172 | L->nci = 0; |
| 222 | L->stacksize = 0; | 173 | L->stacksize = 0; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.h,v 2.147 2017/11/03 12:12:30 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 2.148 2017/11/03 17:22:54 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -81,14 +81,6 @@ typedef struct stringtable { | |||
| 81 | } stringtable; | 81 | } stringtable; |
| 82 | 82 | ||
| 83 | 83 | ||
| 84 | /* | ||
| 85 | ** Information about a call. | ||
| 86 | */ | ||
| 87 | typedef struct CallInfo { | ||
| 88 | StkId func; /* function index in the stack */ | ||
| 89 | struct CallInfo *previous, *next; /* dynamic call link */ | ||
| 90 | } CallInfo; | ||
| 91 | |||
| 92 | 84 | ||
| 93 | /* | 85 | /* |
| 94 | ** Bits in CallInfo status | 86 | ** Bits in CallInfo status |
| @@ -170,7 +162,6 @@ struct lua_State { | |||
| 170 | lu_byte status; | 162 | lu_byte status; |
| 171 | StkId top; /* first free slot in the stack */ | 163 | StkId top; /* first free slot in the stack */ |
| 172 | global_State *l_G; | 164 | global_State *l_G; |
| 173 | CallInfo *ci; /* call info for current function */ | ||
| 174 | StkId func; /* current function */ | 165 | StkId func; /* current function */ |
| 175 | const Instruction *oldpc; /* last pc traced */ | 166 | const Instruction *oldpc; /* last pc traced */ |
| 176 | StkId stack_last; /* last free slot in the stack */ | 167 | StkId stack_last; /* last free slot in the stack */ |
| @@ -179,7 +170,6 @@ struct lua_State { | |||
| 179 | GCObject *gclist; | 170 | GCObject *gclist; |
| 180 | struct lua_State *twups; /* list of threads with open upvalues */ | 171 | struct lua_State *twups; /* list of threads with open upvalues */ |
| 181 | struct lua_longjmp *errorJmp; /* current error recover point */ | 172 | struct lua_longjmp *errorJmp; /* current error recover point */ |
| 182 | CallInfo base_ci; /* CallInfo for first level (C calling Lua) */ | ||
| 183 | volatile lua_Hook hook; | 173 | volatile lua_Hook hook; |
| 184 | ptrdiff_t errfunc; /* current error handling function (stack index) */ | 174 | ptrdiff_t errfunc; /* current error handling function (stack index) */ |
| 185 | int stacksize; | 175 | int stacksize; |
| @@ -235,9 +225,6 @@ union GCUnion { | |||
| 235 | 225 | ||
| 236 | LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt); | 226 | LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt); |
| 237 | LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); | 227 | LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); |
| 238 | LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L); | ||
| 239 | LUAI_FUNC void luaE_freeCI (lua_State *L); | ||
| 240 | LUAI_FUNC void luaE_shrinkCI (lua_State *L); | ||
| 241 | 228 | ||
| 242 | 229 | ||
| 243 | #endif | 230 | #endif |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 2.303 2017/11/03 17:22:54 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.304 2017/11/03 19:33:22 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -796,7 +796,6 @@ void luaV_finishOp (lua_State *L) { | |||
| 796 | 796 | ||
| 797 | 797 | ||
| 798 | void luaV_execute (lua_State *L) { | 798 | void luaV_execute (lua_State *L) { |
| 799 | CallInfo *ci = L->ci; | ||
| 800 | LClosure *cl; | 799 | LClosure *cl; |
| 801 | TValue *k; | 800 | TValue *k; |
| 802 | StkId base = L->func + 1; /* local copy of 'L->func + 1' */ | 801 | StkId base = L->func + 1; /* local copy of 'L->func + 1' */ |
| @@ -804,7 +803,6 @@ void luaV_execute (lua_State *L) { | |||
| 804 | const Instruction *pc; /* local copy of 'basepc(base)' */ | 803 | const Instruction *pc; /* local copy of 'basepc(base)' */ |
| 805 | callstatus(base - 1) |= CIST_FRESH; /* fresh invocation of 'luaV_execute" */ | 804 | callstatus(base - 1) |= CIST_FRESH; /* fresh invocation of 'luaV_execute" */ |
| 806 | newframe: /* reentry point when frame changes (call/return) */ | 805 | newframe: /* reentry point when frame changes (call/return) */ |
| 807 | lua_assert(ci == L->ci); | ||
| 808 | cl = clLvalue(s2v(L->func)); /* local reference to function's closure */ | 806 | cl = clLvalue(s2v(L->func)); /* local reference to function's closure */ |
| 809 | k = cl->p->k; /* local reference to function's constant table */ | 807 | k = cl->p->k; /* local reference to function's constant table */ |
| 810 | updatemask(L); | 808 | updatemask(L); |
| @@ -1361,7 +1359,6 @@ void luaV_execute (lua_State *L) { | |||
| 1361 | /* else leave top for next instruction */ | 1359 | /* else leave top for next instruction */ |
| 1362 | } | 1360 | } |
| 1363 | else { /* Lua function */ | 1361 | else { /* Lua function */ |
| 1364 | ci = L->ci; | ||
| 1365 | base = L->func + 1; | 1362 | base = L->func + 1; |
| 1366 | goto newframe; /* restart luaV_execute over new Lua function */ | 1363 | goto newframe; /* restart luaV_execute over new Lua function */ |
| 1367 | } | 1364 | } |
| @@ -1391,7 +1388,6 @@ void luaV_execute (lua_State *L) { | |||
| 1391 | L->top = functop(ofunc); /* correct top */ | 1388 | L->top = functop(ofunc); /* correct top */ |
| 1392 | ofunc->stkci.u.l.savedpc = nfunc->stkci.u.l.savedpc; | 1389 | ofunc->stkci.u.l.savedpc = nfunc->stkci.u.l.savedpc; |
| 1393 | callstatus(ofunc) |= CIST_TAIL; /* function was tail called */ | 1390 | callstatus(ofunc) |= CIST_TAIL; /* function was tail called */ |
| 1394 | ci = L->ci = L->ci->previous; /* remove new frame */ | ||
| 1395 | base = ofunc + 1; | 1391 | base = ofunc + 1; |
| 1396 | L->func = ofunc; | 1392 | L->func = ofunc; |
| 1397 | lua_assert(L->top == base + getproto(s2v(ofunc))->maxstacksize); | 1393 | lua_assert(L->top == base + getproto(s2v(ofunc))->maxstacksize); |
| @@ -1403,11 +1399,10 @@ void luaV_execute (lua_State *L) { | |||
| 1403 | int b = GETARG_B(i); | 1399 | int b = GETARG_B(i); |
| 1404 | if (cl->p->sizep > 0) luaF_close(L, base); | 1400 | if (cl->p->sizep > 0) luaF_close(L, base); |
| 1405 | savepc(base); | 1401 | savepc(base); |
| 1406 | b = luaD_poscall(L, ci, ra, (b != 0 ? b - 1 : cast_int(L->top - ra))); | 1402 | b = luaD_poscall(L, ra, (b != 0 ? b - 1 : cast_int(L->top - ra))); |
| 1407 | if (callstatus(base - 1) & CIST_FRESH) /* local 'base' still from callee */ | 1403 | if (callstatus(base - 1) & CIST_FRESH) /* local 'base' still from callee */ |
| 1408 | return; /* external invocation: return */ | 1404 | return; /* external invocation: return */ |
| 1409 | else { /* invocation via reentry: continue execution */ | 1405 | else { /* invocation via reentry: continue execution */ |
| 1410 | ci = L->ci; | ||
| 1411 | base = L->func + 1; | 1406 | base = L->func + 1; |
| 1412 | if (b) L->top = functop(base - 1); | 1407 | if (b) L->top = functop(base - 1); |
| 1413 | lua_assert(isLua(base - 1)); | 1408 | lua_assert(isLua(base - 1)); |
