aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-05-13 10:54:47 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-05-13 10:54:47 -0300
commit6d95de83c644da5f720cf468c38df9782f1c890d (patch)
tree734170c5082ae1e44ad9fe69d85b167fd4d07207 /lvm.c
parent5c8770f8969a73cf4ca503f54c2217f76de62e04 (diff)
downloadlua-6d95de83c644da5f720cf468c38df9782f1c890d.tar.gz
lua-6d95de83c644da5f720cf468c38df9782f1c890d.tar.bz2
lua-6d95de83c644da5f720cf468c38df9782f1c890d.zip
no more field 'base' in CallInfo (base is always equal to 'func + 1',
with old/new vararg implementation)
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/lvm.c b/lvm.c
index 3053d929..284646bb 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.280 2017/05/11 18:57:46 roberto Exp roberto $ 2** $Id: lvm.c,v 2.281 2017/05/13 12:57:20 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*/
@@ -659,7 +659,7 @@ static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base,
659*/ 659*/
660void luaV_finishOp (lua_State *L) { 660void luaV_finishOp (lua_State *L) {
661 CallInfo *ci = L->ci; 661 CallInfo *ci = L->ci;
662 StkId base = ci->u.l.base; 662 StkId base = ci->func + 1;
663 Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */ 663 Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */
664 OpCode op = GET_OPCODE(inst); 664 OpCode op = GET_OPCODE(inst);
665 switch (op) { /* finish its execution */ 665 switch (op) { /* finish its execution */
@@ -696,7 +696,7 @@ void luaV_finishOp (lua_State *L) {
696 luaV_concat(L, total); /* concat them (may yield again) */ 696 luaV_concat(L, total); /* concat them (may yield again) */
697 } 697 }
698 /* move final result to final position */ 698 /* move final result to final position */
699 setobj2s(L, ci->u.l.base + GETARG_A(inst), L->top - 1); 699 setobj2s(L, ci->func + 1 + GETARG_A(inst), L->top - 1);
700 L->top = ci->top; /* restore top */ 700 L->top = ci->top; /* restore top */
701 break; 701 break;
702 } 702 }
@@ -753,7 +753,7 @@ void luaV_finishOp (lua_State *L) {
753*/ 753*/
754#define dojump(ci,i,e) \ 754#define dojump(ci,i,e) \
755 { int a = GETARG_A(i); \ 755 { int a = GETARG_A(i); \
756 if (a != 0) luaF_close(L, ci->u.l.base + a - 1); \ 756 if (a != 0) luaF_close(L, ci->func + a); \
757 pc += GETARG_sBx(i) + e; updatemask(L); } 757 pc += GETARG_sBx(i) + e; updatemask(L); }
758 758
759 759
@@ -772,7 +772,7 @@ void luaV_finishOp (lua_State *L) {
772** stack, and change the hooks. 772** stack, and change the hooks.
773*/ 773*/
774#define Protect(code) \ 774#define Protect(code) \
775 { savepc(L); {code;}; base = ci->u.l.base; updatemask(L); } 775 { savepc(L); {code;}; base = ci->func + 1; updatemask(L); }
776 776
777 777
778#define checkGC(L,c) \ 778#define checkGC(L,c) \
@@ -797,7 +797,7 @@ void luaV_execute (lua_State *L) {
797 CallInfo *ci = L->ci; 797 CallInfo *ci = L->ci;
798 LClosure *cl; 798 LClosure *cl;
799 TValue *k; 799 TValue *k;
800 StkId base; /* local copy of 'ci->u.l.base' */ 800 StkId base; /* local copy of 'ci->func + 1' */
801 int mask; /* local copy of 'L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)' */ 801 int mask; /* local copy of 'L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)' */
802 const Instruction *pc; /* local copy of 'ci->u.l.savedpc' */ 802 const Instruction *pc; /* local copy of 'ci->u.l.savedpc' */
803 ci->callstatus |= CIST_FRESH; /* fresh invocation of 'luaV_execute" */ 803 ci->callstatus |= CIST_FRESH; /* fresh invocation of 'luaV_execute" */
@@ -806,14 +806,14 @@ void luaV_execute (lua_State *L) {
806 cl = clLvalue(ci->func); /* local reference to function's closure */ 806 cl = clLvalue(ci->func); /* local reference to function's closure */
807 k = cl->p->k; /* local reference to function's constant table */ 807 k = cl->p->k; /* local reference to function's constant table */
808 updatemask(L); 808 updatemask(L);
809 base = ci->u.l.base; 809 base = ci->func + 1;
810 pc = ci->u.l.savedpc; 810 pc = ci->u.l.savedpc;
811 /* main loop of interpreter */ 811 /* main loop of interpreter */
812 for (;;) { 812 for (;;) {
813 Instruction i; 813 Instruction i;
814 StkId ra; 814 StkId ra;
815 vmfetch(); 815 vmfetch();
816 lua_assert(base == ci->u.l.base); 816 lua_assert(base == ci->func + 1);
817 lua_assert(base <= L->top && L->top < L->stack + L->stacksize); 817 lua_assert(base <= L->top && L->top < L->stack + L->stacksize);
818 vmdispatch (GET_OPCODE(i)) { 818 vmdispatch (GET_OPCODE(i)) {
819 vmcase(OP_MOVE) { 819 vmcase(OP_MOVE) {
@@ -1288,19 +1288,18 @@ void luaV_execute (lua_State *L) {
1288 StkId nfunc = nci->func; /* called function */ 1288 StkId nfunc = nci->func; /* called function */
1289 StkId ofunc = oci->func; /* caller function */ 1289 StkId ofunc = oci->func; /* caller function */
1290 /* last stack slot filled by 'precall' */ 1290 /* last stack slot filled by 'precall' */
1291 StkId lim = nci->u.l.base + getproto(nfunc)->numparams; 1291 StkId lim = nci->func + 1 + getproto(nfunc)->numparams;
1292 int aux; 1292 int aux;
1293 /* close all upvalues from previous call */ 1293 /* close all upvalues from previous call */
1294 if (cl->p->sizep > 0) luaF_close(L, oci->u.l.base); 1294 if (cl->p->sizep > 0) luaF_close(L, oci->func + 1);
1295 /* move new frame into old one */ 1295 /* move new frame into old one */
1296 for (aux = 0; nfunc + aux < lim; aux++) 1296 for (aux = 0; nfunc + aux < lim; aux++)
1297 setobjs2s(L, ofunc + aux, nfunc + aux); 1297 setobjs2s(L, ofunc + aux, nfunc + aux);
1298 oci->u.l.base = ofunc + (nci->u.l.base - nfunc); /* correct base */
1299 oci->top = L->top = ofunc + (L->top - nfunc); /* correct top */ 1298 oci->top = L->top = ofunc + (L->top - nfunc); /* correct top */
1300 oci->u.l.savedpc = nci->u.l.savedpc; 1299 oci->u.l.savedpc = nci->u.l.savedpc;
1301 oci->callstatus |= CIST_TAIL; /* function was tail called */ 1300 oci->callstatus |= CIST_TAIL; /* function was tail called */
1302 ci = L->ci = oci; /* remove new frame */ 1301 ci = L->ci = oci; /* remove new frame */
1303 lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize); 1302 lua_assert(L->top == oci->func + 1 + getproto(ofunc)->maxstacksize);
1304 goto newframe; /* restart luaV_execute over new Lua function */ 1303 goto newframe; /* restart luaV_execute over new Lua function */
1305 } 1304 }
1306 vmbreak; 1305 vmbreak;