summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ldebug.c13
-rw-r--r--ldebug.h4
-rw-r--r--ldo.c12
-rw-r--r--lstate.h37
-rw-r--r--luaconf.h28
-rw-r--r--lvm.c80
6 files changed, 84 insertions, 90 deletions
diff --git a/ldebug.c b/ldebug.c
index 044eb57f..9fca89ec 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 2.4 2004/04/30 20:13:38 roberto Exp roberto $ 2** $Id: ldebug.c,v 2.5 2004/05/31 18:51:50 roberto Exp roberto $
3** Debug Interface 3** Debug Interface
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -35,7 +35,7 @@ static const char *getfuncname (CallInfo *ci, const char **name);
35 35
36static int currentpc (CallInfo *ci) { 36static int currentpc (CallInfo *ci) {
37 if (!isLua(ci)) return -1; /* function is not a Lua function? */ 37 if (!isLua(ci)) return -1; /* function is not a Lua function? */
38 return pcRel(ci->u.l.savedpc, ci_func(ci)->l.p); 38 return pcRel(ci->savedpc, ci_func(ci)->l.p);
39} 39}
40 40
41 41
@@ -86,7 +86,7 @@ LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
86 for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) { 86 for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) {
87 level--; 87 level--;
88 if (f_isLua(ci)) /* Lua function? */ 88 if (f_isLua(ci)) /* Lua function? */
89 level -= ci->u.l.tailcalls; /* skip lost tail calls */ 89 level -= ci->tailcalls; /* skip lost tail calls */
90 } 90 }
91 if (level > 0 || ci == L->base_ci) status = 0; /* there is no such level */ 91 if (level > 0 || ci == L->base_ci) status = 0; /* there is no such level */
92 else if (level < 0) { /* level is of a lost tail call */ 92 else if (level < 0) { /* level is of a lost tail call */
@@ -255,8 +255,9 @@ static int precheck (const Proto *pt) {
255} 255}
256 256
257 257
258static int checkopenop (const Proto *pt, int pc) { 258#define checkopenop(pt,pc) luaG_checkopenop((pt)->code[(pc)+1])
259 Instruction i = pt->code[pc+1]; 259
260int luaG_checkopenop (Instruction i) {
260 switch (GET_OPCODE(i)) { 261 switch (GET_OPCODE(i)) {
261 case OP_CALL: 262 case OP_CALL:
262 case OP_TAILCALL: 263 case OP_TAILCALL:
@@ -487,7 +488,7 @@ static const char *getobjname (CallInfo *ci, int stackpos, const char **name) {
487 488
488static const char *getfuncname (CallInfo *ci, const char **name) { 489static const char *getfuncname (CallInfo *ci, const char **name) {
489 Instruction i; 490 Instruction i;
490 if ((isLua(ci) && ci->u.l.tailcalls > 0) || !isLua(ci - 1)) 491 if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1))
491 return NULL; /* calling function is not Lua (or is unknown) */ 492 return NULL; /* calling function is not Lua (or is unknown) */
492 ci--; /* calling function */ 493 ci--; /* calling function */
493 i = ci_func(ci)->l.p->code[currentpc(ci)]; 494 i = ci_func(ci)->l.p->code[currentpc(ci)];
diff --git a/ldebug.h b/ldebug.h
index b1c9ed2d..8f087b52 100644
--- a/ldebug.h
+++ b/ldebug.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.h,v 1.33 2003/07/16 20:49:02 roberto Exp roberto $ 2** $Id: ldebug.h,v 2.1 2003/12/10 12:13:36 roberto Exp roberto $
3** Auxiliary functions from Debug Interface module 3** Auxiliary functions from Debug Interface module
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -25,6 +25,6 @@ int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2);
25void luaG_runerror (lua_State *L, const char *fmt, ...); 25void luaG_runerror (lua_State *L, const char *fmt, ...);
26void luaG_errormsg (lua_State *L); 26void luaG_errormsg (lua_State *L);
27int luaG_checkcode (const Proto *pt); 27int luaG_checkcode (const Proto *pt);
28 28int luaG_checkopenop (Instruction i);
29 29
30#endif 30#endif
diff --git a/ldo.c b/ldo.c
index 293e66a3..a5fe6908 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 2.5 2004/05/14 19:25:09 roberto Exp roberto $ 2** $Id: ldo.c,v 2.6 2004/05/31 18:51:50 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*/
@@ -256,8 +256,8 @@ int luaD_precall (lua_State *L, StkId func, int nresults) {
256 ci->func = func; 256 ci->func = func;
257 L->base = ci->base = base; 257 L->base = ci->base = base;
258 ci->top = L->base + p->maxstacksize; 258 ci->top = L->base + p->maxstacksize;
259 ci->u.l.savedpc = p->code; /* starting point */ 259 ci->savedpc = p->code; /* starting point */
260 ci->u.l.tailcalls = 0; 260 ci->tailcalls = 0;
261 ci->nresults = nresults; 261 ci->nresults = nresults;
262 for (st = L->top; st < ci->top; st++) 262 for (st = L->top; st < ci->top; st++)
263 setnilvalue(st); 263 setnilvalue(st);
@@ -293,7 +293,7 @@ static StkId callrethooks (lua_State *L, StkId firstResult) {
293 ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ 293 ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */
294 luaD_callhook(L, LUA_HOOKRET, -1); 294 luaD_callhook(L, LUA_HOOKRET, -1);
295 if (f_isLua(L->ci)) { /* Lua function? */ 295 if (f_isLua(L->ci)) { /* Lua function? */
296 while (L->ci->u.l.tailcalls--) /* call hook for eventual tail calls */ 296 while (L->ci->tailcalls--) /* call hook for eventual tail calls */
297 luaD_callhook(L, LUA_HOOKTAILRET, -1); 297 luaD_callhook(L, LUA_HOOKTAILRET, -1);
298 } 298 }
299 return restorestack(L, fr); 299 return restorestack(L, fr);
@@ -352,8 +352,8 @@ static void resume (lua_State *L, void *ud) {
352 if (!f_isLua(ci)) { /* `common' yield? */ 352 if (!f_isLua(ci)) { /* `common' yield? */
353 /* finish interrupted execution of `OP_CALL' */ 353 /* finish interrupted execution of `OP_CALL' */
354 int nresults = ci->nresults; 354 int nresults = ci->nresults;
355 lua_assert(GET_OPCODE(*((ci-1)->u.l.savedpc - 1)) == OP_CALL || 355 lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL ||
356 GET_OPCODE(*((ci-1)->u.l.savedpc - 1)) == OP_TAILCALL); 356 GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL);
357 luaD_poscall(L, nresults, L->top - nargs); /* complete it */ 357 luaD_poscall(L, nresults, L->top - nargs); /* complete it */
358 if (nresults >= 0) L->top = L->ci->top; 358 if (nresults >= 0) L->top = L->ci->top;
359 } /* else yielded inside a hook: just continue its execution */ 359 } /* else yielded inside a hook: just continue its execution */
diff --git a/lstate.h b/lstate.h
index 0ac69529..bec73a5b 100644
--- a/lstate.h
+++ b/lstate.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.h,v 2.3 2004/05/14 19:25:09 roberto Exp roberto $ 2** $Id: lstate.h,v 2.4 2004/05/31 18:51:50 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*/
@@ -14,30 +14,6 @@
14#include "lzio.h" 14#include "lzio.h"
15 15
16 16
17/*
18** macros for thread synchronization inside Lua core machine:
19** all accesses to the global state and to global objects are synchronized.
20** Because threads can read the stack of other threads
21** (when running garbage collection),
22** a thread must also synchronize any write-access to its own stack.
23** Unsynchronized accesses are allowed only when reading its own stack,
24** or when reading immutable fields from global objects
25** (such as string values and udata values).
26*/
27#ifndef lua_lock
28#define lua_lock(L) ((void) 0)
29#endif
30
31#ifndef lua_unlock
32#define lua_unlock(L) ((void) 0)
33#endif
34
35
36#ifndef lua_userstateopen
37#define lua_userstateopen(l)
38#endif
39
40
41 17
42struct lua_longjmp; /* defined in ldo.c */ 18struct lua_longjmp; /* defined in ldo.c */
43 19
@@ -74,15 +50,8 @@ typedef struct CallInfo {
74 StkId func; /* function index in the stack */ 50 StkId func; /* function index in the stack */
75 StkId top; /* top for this function */ 51 StkId top; /* top for this function */
76 int nresults; /* expected number of results from this function */ 52 int nresults; /* expected number of results from this function */
77 union { 53 const Instruction *savedpc;
78 struct { /* for Lua functions */ 54 int tailcalls; /* number of tail calls lost under this entry */
79 const Instruction *savedpc;
80 int tailcalls; /* number of tail calls lost under this entry */
81 } l;
82 struct { /* for C functions */
83 int dummy; /* just to avoid an empty struct */
84 } c;
85 } u;
86} CallInfo; 55} CallInfo;
87 56
88 57
diff --git a/luaconf.h b/luaconf.h
index 476b8bc1..93793e55 100644
--- a/luaconf.h
+++ b/luaconf.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: luaconf.h,v 1.4 2004/05/28 18:32:51 roberto Exp roberto $ 2** $Id: luaconf.h,v 1.5 2004/06/02 13:24:43 roberto Exp roberto $
3** Configuration file for Lua 3** Configuration file for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -215,6 +215,32 @@
215#endif 215#endif
216 216
217 217
218
219/*
220** macros for thread synchronization inside Lua core machine:
221** all accesses to the global state and to global objects are synchronized.
222** Because threads can read the stack of other threads
223** (when running garbage collection),
224** a thread must also synchronize any write-access to its own stack.
225** Unsynchronized accesses are allowed only when reading its own stack,
226** or when reading immutable fields from global objects
227** (such as string values and udata values).
228*/
229#define lua_lock(L) ((void) 0)
230#define lua_unlock(L) ((void) 0)
231
232/*
233** this macro allows a thread switch in appropriate places in the Lua
234** core
235*/
236#define lua_threadyield(L) {lua_unlock(L); lua_lock(L);}
237
238
239
240/* allows user-specific initialization on new threads */
241#define lua_userstateopen(l) /* empty */
242
243
218#endif 244#endif
219 245
220/* }====================================================== */ 246/* }====================================================== */
diff --git a/lvm.c b/lvm.c
index 5363ebef..44d77783 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.6 2004/05/14 19:25:09 roberto Exp $ 2** $Id: lvm.c,v 2.7 2004/05/31 18:51:50 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*/
@@ -58,8 +58,8 @@ int luaV_tostring (lua_State *L, StkId obj) {
58static void traceexec (lua_State *L, const Instruction *pc) { 58static void traceexec (lua_State *L, const Instruction *pc) {
59 lu_byte mask = L->hookmask; 59 lu_byte mask = L->hookmask;
60 CallInfo *ci = L->ci; 60 CallInfo *ci = L->ci;
61 const Instruction *oldpc = ci->u.l.savedpc; 61 const Instruction *oldpc = ci->savedpc;
62 ci->u.l.savedpc = pc; 62 ci->savedpc = pc;
63 if (mask > LUA_MASKLINE) { /* instruction-hook set? */ 63 if (mask > LUA_MASKLINE) { /* instruction-hook set? */
64 if (L->hookcount == 0) { 64 if (L->hookcount == 0) {
65 resethookcount(L); 65 resethookcount(L);
@@ -122,18 +122,18 @@ StkId luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val,
122 /* else will try the tag method */ 122 /* else will try the tag method */
123 } 123 }
124 else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) { 124 else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) {
125 if (pc) L->ci->u.l.savedpc = pc; 125 L->ci->savedpc = pc;
126 luaG_typeerror(L, t, "index"); 126 luaG_typeerror(L, t, "index");
127 } 127 }
128 if (ttisfunction(tm)) { 128 if (ttisfunction(tm)) {
129 if (pc) L->ci->u.l.savedpc = pc; 129 L->ci->savedpc = pc;
130 prepTMcall(L, tm, t, key); 130 prepTMcall(L, tm, t, key);
131 callTMres(L, val); 131 callTMres(L, val);
132 return L->base; 132 return L->base;
133 } 133 }
134 t = tm; /* else repeat with `tm' */ 134 t = tm; /* else repeat with `tm' */
135 } 135 }
136 if (pc) L->ci->u.l.savedpc = pc; 136 L->ci->savedpc = pc;
137 luaG_runerror(L, "loop in gettable"); 137 luaG_runerror(L, "loop in gettable");
138 return NULL; /* to avoid warnings */ 138 return NULL; /* to avoid warnings */
139} 139}
@@ -156,11 +156,11 @@ StkId luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val,
156 /* else will try the tag method */ 156 /* else will try the tag method */
157 } 157 }
158 else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) { 158 else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) {
159 if (pc) L->ci->u.l.savedpc = pc; 159 L->ci->savedpc = pc;
160 luaG_typeerror(L, t, "index"); 160 luaG_typeerror(L, t, "index");
161 } 161 }
162 if (ttisfunction(tm)) { 162 if (ttisfunction(tm)) {
163 if (pc) L->ci->u.l.savedpc = pc; 163 L->ci->savedpc = pc;
164 prepTMcall(L, tm, t, key); 164 prepTMcall(L, tm, t, key);
165 setobj2s(L, L->top+3, val); /* 3th argument */ 165 setobj2s(L, L->top+3, val); /* 3th argument */
166 callTM(L); 166 callTM(L);
@@ -168,7 +168,7 @@ StkId luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val,
168 } 168 }
169 t = tm; /* else repeat with `tm' */ 169 t = tm; /* else repeat with `tm' */
170 } 170 }
171 if (pc) L->ci->u.l.savedpc = pc; 171 L->ci->savedpc = pc;
172 luaG_runerror(L, "loop in settable"); 172 luaG_runerror(L, "loop in settable");
173 return NULL; /* to avoid warnings */ 173 return NULL; /* to avoid warnings */
174} 174}
@@ -331,7 +331,7 @@ static StkId Arith (lua_State *L, StkId ra, const TValue *rb,
331 const TValue *rc, TMS op, const Instruction *pc) { 331 const TValue *rc, TMS op, const Instruction *pc) {
332 TValue tempb, tempc; 332 TValue tempb, tempc;
333 const TValue *b, *c; 333 const TValue *b, *c;
334 L->ci->u.l.savedpc = pc; 334 L->ci->savedpc = pc;
335 if ((b = luaV_tonumber(rb, &tempb)) != NULL && 335 if ((b = luaV_tonumber(rb, &tempb)) != NULL &&
336 (c = luaV_tonumber(rc, &tempc)) != NULL) { 336 (c = luaV_tonumber(rc, &tempc)) != NULL) {
337 switch (op) { 337 switch (op) {
@@ -374,7 +374,7 @@ static StkId Arith (lua_State *L, StkId ra, const TValue *rb,
374#define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i)) 374#define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i))
375 375
376 376
377#define dojump(pc, i) ((pc) += (i)) 377#define dojump(L,pc,i) {(pc) += (i); lua_threadyield(L);}
378 378
379 379
380StkId luaV_execute (lua_State *L, int nexeccalls) { 380StkId luaV_execute (lua_State *L, int nexeccalls) {
@@ -386,7 +386,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
386 if (L->hookmask & LUA_MASKCALL) 386 if (L->hookmask & LUA_MASKCALL)
387 luaD_callhook(L, LUA_HOOKCALL, -1); 387 luaD_callhook(L, LUA_HOOKCALL, -1);
388 retentry: /* entry point when returning to old functions */ 388 retentry: /* entry point when returning to old functions */
389 pc = L->ci->u.l.savedpc; 389 pc = L->ci->savedpc;
390 cl = &clvalue(L->ci->func)->l; 390 cl = &clvalue(L->ci->func)->l;
391 base = L->base; 391 base = L->base;
392 k = cl->p->k; 392 k = cl->p->k;
@@ -398,7 +398,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
398 (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { 398 (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {
399 traceexec(L, pc); /***/ 399 traceexec(L, pc); /***/
400 if (L->isSuspended) { /* did hook yield? */ 400 if (L->isSuspended) { /* did hook yield? */
401 L->ci->u.l.savedpc = pc - 1; 401 L->ci->savedpc = pc - 1;
402 return NULL; 402 return NULL;
403 } 403 }
404 base = L->base; 404 base = L->base;
@@ -406,10 +406,8 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
406 /* warning!! several calls may realloc the stack and invalidate `ra' */ 406 /* warning!! several calls may realloc the stack and invalidate `ra' */
407 ra = RA(i); 407 ra = RA(i);
408 lua_assert(base == L->ci->base && base == L->base); 408 lua_assert(base == L->ci->base && base == L->base);
409 lua_assert(L->top <= L->stack + L->stacksize && L->top >= base); 409 lua_assert(base <= L->top && L->top <= L->stack + L->stacksize);
410 lua_assert(L->top == L->ci->top || 410 lua_assert(L->top == L->ci->top || luaG_checkopenop(i));
411 GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||
412 GET_OPCODE(i) == OP_RETURN || GET_OPCODE(i) == OP_SETLISTO);
413 switch (GET_OPCODE(i)) { 411 switch (GET_OPCODE(i)) {
414 case OP_MOVE: { 412 case OP_MOVE: {
415 setobjs2s(L, ra, RB(i)); 413 setobjs2s(L, ra, RB(i));
@@ -465,7 +463,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
465 int b = GETARG_B(i); 463 int b = GETARG_B(i);
466 b = fb2int(b); 464 b = fb2int(b);
467 sethvalue(L, ra, luaH_new(L, b, GETARG_C(i))); 465 sethvalue(L, ra, luaH_new(L, b, GETARG_C(i)));
468 L->ci->u.l.savedpc = pc; 466 L->ci->savedpc = pc;
469 luaC_checkGC(L); /***/ 467 luaC_checkGC(L); /***/
470 base = L->base; 468 base = L->base;
471 break; 469 break;
@@ -528,7 +526,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
528 } 526 }
529 else { 527 else {
530 setnilvalue(&temp); 528 setnilvalue(&temp);
531 L->ci->u.l.savedpc = pc; 529 L->ci->savedpc = pc;
532 if (!call_binTM(L, RB(i), &temp, ra, TM_UNM)) /***/ 530 if (!call_binTM(L, RB(i), &temp, ra, TM_UNM)) /***/
533 luaG_aritherror(L, RB(i), &temp); 531 luaG_aritherror(L, RB(i), &temp);
534 base = L->base; 532 base = L->base;
@@ -543,7 +541,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
543 case OP_CONCAT: { 541 case OP_CONCAT: {
544 int b = GETARG_B(i); 542 int b = GETARG_B(i);
545 int c = GETARG_C(i); 543 int c = GETARG_C(i);
546 L->ci->u.l.savedpc = pc; 544 L->ci->savedpc = pc;
547 luaV_concat(L, c-b+1, c); /* may change `base' (and `ra') */ /***/ 545 luaV_concat(L, c-b+1, c); /* may change `base' (and `ra') */ /***/
548 luaC_checkGC(L); /***/ 546 luaC_checkGC(L); /***/
549 base = L->base; 547 base = L->base;
@@ -551,27 +549,27 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
551 break; 549 break;
552 } 550 }
553 case OP_JMP: { 551 case OP_JMP: {
554 dojump(pc, GETARG_sBx(i)); 552 dojump(L, pc, GETARG_sBx(i));
555 break; 553 break;
556 } 554 }
557 case OP_EQ: { 555 case OP_EQ: {
558 L->ci->u.l.savedpc = pc; 556 L->ci->savedpc = pc;
559 if (equalobj(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/ 557 if (equalobj(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/
560 else dojump(pc, GETARG_sBx(*pc) + 1); 558 else dojump(L, pc, GETARG_sBx(*pc) + 1);
561 base = L->base; 559 base = L->base;
562 break; 560 break;
563 } 561 }
564 case OP_LT: { 562 case OP_LT: {
565 L->ci->u.l.savedpc = pc; 563 L->ci->savedpc = pc;
566 if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/ 564 if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/
567 else dojump(pc, GETARG_sBx(*pc) + 1); 565 else dojump(L, pc, GETARG_sBx(*pc) + 1);
568 base = L->base; 566 base = L->base;
569 break; 567 break;
570 } 568 }
571 case OP_LE: { 569 case OP_LE: {
572 L->ci->u.l.savedpc = pc; 570 L->ci->savedpc = pc;
573 if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/ 571 if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/
574 else dojump(pc, GETARG_sBx(*pc) + 1); 572 else dojump(L, pc, GETARG_sBx(*pc) + 1);
575 base = L->base; 573 base = L->base;
576 break; 574 break;
577 } 575 }
@@ -580,7 +578,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
580 if (l_isfalse(rb) == GETARG_C(i)) pc++; 578 if (l_isfalse(rb) == GETARG_C(i)) pc++;
581 else { 579 else {
582 setobjs2s(L, ra, rb); 580 setobjs2s(L, ra, rb);
583 dojump(pc, GETARG_sBx(*pc) + 1); 581 dojump(L, pc, GETARG_sBx(*pc) + 1);
584 } 582 }
585 break; 583 break;
586 } 584 }
@@ -589,7 +587,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
589 int b = GETARG_B(i); 587 int b = GETARG_B(i);
590 int nresults = GETARG_C(i) - 1; 588 int nresults = GETARG_C(i) - 1;
591 if (b != 0) L->top = ra+b; /* else previous instruction set top */ 589 if (b != 0) L->top = ra+b; /* else previous instruction set top */
592 L->ci->u.l.savedpc = pc; 590 L->ci->savedpc = pc;
593 pcr = luaD_precall(L, ra, nresults); 591 pcr = luaD_precall(L, ra, nresults);
594 if (pcr == PCRLUA) { 592 if (pcr == PCRLUA) {
595 nexeccalls++; 593 nexeccalls++;
@@ -610,7 +608,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
610 int pcr; 608 int pcr;
611 int b = GETARG_B(i); 609 int b = GETARG_B(i);
612 if (b != 0) L->top = ra+b; /* else previous instruction set top */ 610 if (b != 0) L->top = ra+b; /* else previous instruction set top */
613 L->ci->u.l.savedpc = pc; 611 L->ci->savedpc = pc;
614 lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); 612 lua_assert(GETARG_C(i) - 1 == LUA_MULTRET);
615 pcr = luaD_precall(L, ra, LUA_MULTRET); 613 pcr = luaD_precall(L, ra, LUA_MULTRET);
616 if (pcr == PCRLUA) { 614 if (pcr == PCRLUA) {
@@ -625,8 +623,8 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
625 for (aux = 0; pfunc+aux < L->top; aux++) /* move frame down */ 623 for (aux = 0; pfunc+aux < L->top; aux++) /* move frame down */
626 setobjs2s(L, func+aux, pfunc+aux); 624 setobjs2s(L, func+aux, pfunc+aux);
627 ci->top = L->top = base+aux; /* correct top */ 625 ci->top = L->top = base+aux; /* correct top */
628 ci->u.l.savedpc = L->ci->u.l.savedpc; 626 ci->savedpc = L->ci->savedpc;
629 ci->u.l.tailcalls++; /* one more call lost */ 627 ci->tailcalls++; /* one more call lost */
630 L->ci--; /* remove new frame */ 628 L->ci--; /* remove new frame */
631 goto callentry; 629 goto callentry;
632 } 630 }
@@ -645,13 +643,13 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
645 int b = GETARG_B(i); 643 int b = GETARG_B(i);
646 if (b != 0) L->top = ra+b-1; 644 if (b != 0) L->top = ra+b-1;
647 if (L->openupval) luaF_close(L, base); 645 if (L->openupval) luaF_close(L, base);
648 L->ci->u.l.savedpc = pc; 646 L->ci->savedpc = pc;
649 if (--nexeccalls == 0) /* was previous function running `here'? */ 647 if (--nexeccalls == 0) /* was previous function running `here'? */
650 return ra; /* no: return */ 648 return ra; /* no: return */
651 else { /* yes: continue its execution */ 649 else { /* yes: continue its execution */
652 int nresults = (ci+1)->nresults; 650 int nresults = (ci+1)->nresults;
653 lua_assert(isLua(ci)); 651 lua_assert(isLua(ci));
654 lua_assert(GET_OPCODE(*(ci->u.l.savedpc - 1)) == OP_CALL); 652 lua_assert(GET_OPCODE(*(ci->savedpc - 1)) == OP_CALL);
655 luaD_poscall(L, nresults, ra); 653 luaD_poscall(L, nresults, ra);
656 if (nresults >= 0) L->top = L->ci->top; 654 if (nresults >= 0) L->top = L->ci->top;
657 goto retentry; 655 goto retentry;
@@ -662,7 +660,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
662 lua_Number idx = nvalue(ra) + step; /* increment index */ 660 lua_Number idx = nvalue(ra) + step; /* increment index */
663 lua_Number limit = nvalue(ra+1); 661 lua_Number limit = nvalue(ra+1);
664 if (step > 0 ? idx <= limit : idx >= limit) { 662 if (step > 0 ? idx <= limit : idx >= limit) {
665 dojump(pc, GETARG_sBx(i)); /* jump back */ 663 dojump(L, pc, GETARG_sBx(i)); /* jump back */
666 setnvalue(ra, idx); /* update internal index... */ 664 setnvalue(ra, idx); /* update internal index... */
667 setnvalue(ra+3, idx); /* ...and external index */ 665 setnvalue(ra+3, idx); /* ...and external index */
668 } 666 }
@@ -672,7 +670,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
672 const TValue *init = ra; 670 const TValue *init = ra;
673 const TValue *plimit = ra+1; 671 const TValue *plimit = ra+1;
674 const TValue *pstep = ra+2; 672 const TValue *pstep = ra+2;
675 L->ci->u.l.savedpc = pc; 673 L->ci->savedpc = pc;
676 if (!tonumber(init, ra)) 674 if (!tonumber(init, ra))
677 luaG_runerror(L, "`for' initial value must be a number"); 675 luaG_runerror(L, "`for' initial value must be a number");
678 else if (!tonumber(plimit, ra+1)) 676 else if (!tonumber(plimit, ra+1))
@@ -680,7 +678,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
680 else if (!tonumber(pstep, ra+2)) 678 else if (!tonumber(pstep, ra+2))
681 luaG_runerror(L, "`for' step must be a number"); 679 luaG_runerror(L, "`for' step must be a number");
682 setnvalue(ra, nvalue(ra) - nvalue(pstep)); 680 setnvalue(ra, nvalue(ra) - nvalue(pstep));
683 dojump(pc, GETARG_sBx(i)); 681 dojump(L, pc, GETARG_sBx(i));
684 break; 682 break;
685 } 683 }
686 case OP_TFORLOOP: { 684 case OP_TFORLOOP: {
@@ -689,7 +687,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
689 setobjs2s(L, cb+1, ra+1); 687 setobjs2s(L, cb+1, ra+1);
690 setobjs2s(L, cb, ra); 688 setobjs2s(L, cb, ra);
691 L->top = cb+3; /* func. + 2 args (state and index) */ 689 L->top = cb+3; /* func. + 2 args (state and index) */
692 L->ci->u.l.savedpc = pc; 690 L->ci->savedpc = pc;
693 luaD_call(L, cb, GETARG_C(i)); /***/ 691 luaD_call(L, cb, GETARG_C(i)); /***/
694 L->top = L->ci->top; 692 L->top = L->ci->top;
695 base = L->base; 693 base = L->base;
@@ -698,7 +696,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
698 pc++; /* skip jump (break loop) */ 696 pc++; /* skip jump (break loop) */
699 else { 697 else {
700 setobjs2s(L, cb-1, cb); /* save control variable */ 698 setobjs2s(L, cb-1, cb); /* save control variable */
701 dojump(pc, GETARG_sBx(*pc) + 1); /* jump back */ 699 dojump(L, pc, GETARG_sBx(*pc) + 1); /* jump back */
702 } 700 }
703 break; 701 break;
704 } 702 }
@@ -707,7 +705,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
707 setobjs2s(L, ra+1, ra); 705 setobjs2s(L, ra+1, ra);
708 setobj2s(L, ra, luaH_getstr(hvalue(gt(L)), luaS_new(L, "next"))); 706 setobj2s(L, ra, luaH_getstr(hvalue(gt(L)), luaS_new(L, "next")));
709 } 707 }
710 dojump(pc, GETARG_sBx(i)); 708 dojump(L, pc, GETARG_sBx(i));
711 break; 709 break;
712 } 710 }
713 case OP_SETLIST: 711 case OP_SETLIST:
@@ -755,7 +753,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) {
755 } 753 }
756 } 754 }
757 setclvalue(L, ra, ncl); 755 setclvalue(L, ra, ncl);
758 L->ci->u.l.savedpc = pc; 756 L->ci->savedpc = pc;
759 luaC_checkGC(L); /***/ 757 luaC_checkGC(L); /***/
760 base = L->base; 758 base = L->base;
761 break; 759 break;