aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c224
1 files changed, 113 insertions, 111 deletions
diff --git a/lvm.c b/lvm.c
index 1ba3e310..9e4aa8e0 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.12 1997/10/24 18:40:29 roberto Exp roberto $ 2** $Id: lvm.c,v 1.13 1997/10/27 16:14:37 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*/
@@ -14,6 +14,7 @@
14#include "lgc.h" 14#include "lgc.h"
15#include "lmem.h" 15#include "lmem.h"
16#include "lopcodes.h" 16#include "lopcodes.h"
17#include "lstate.h"
17#include "lstring.h" 18#include "lstring.h"
18#include "ltable.h" 19#include "ltable.h"
19#include "ltm.h" 20#include "ltm.h"
@@ -79,11 +80,11 @@ int luaV_tostring (TObject *obj)
79void luaV_closure (int nelems) 80void luaV_closure (int nelems)
80{ 81{
81 Closure *c = luaF_newclosure(nelems); 82 Closure *c = luaF_newclosure(nelems);
82 c->consts[0] = *(luaD_stack.top-1); 83 c->consts[0] = *(L->stack.top-1);
83 memcpy(&c->consts[1], luaD_stack.top-(nelems+1), nelems*sizeof(TObject)); 84 memcpy(&c->consts[1], L->stack.top-(nelems+1), nelems*sizeof(TObject));
84 luaD_stack.top -= nelems; 85 L->stack.top -= nelems;
85 ttype(luaD_stack.top-1) = LUA_T_FUNCTION; 86 ttype(L->stack.top-1) = LUA_T_FUNCTION;
86 (luaD_stack.top-1)->value.cl = c; 87 (L->stack.top-1)->value.cl = c;
87} 88}
88 89
89 90
@@ -94,22 +95,22 @@ void luaV_closure (int nelems)
94void luaV_gettable (void) 95void luaV_gettable (void)
95{ 96{
96 TObject *im; 97 TObject *im;
97 if (ttype(luaD_stack.top-2) != LUA_T_ARRAY) /* not a table, get "gettable" method */ 98 if (ttype(L->stack.top-2) != LUA_T_ARRAY) /* not a table, get "gettable" method */
98 im = luaT_getimbyObj(luaD_stack.top-2, IM_GETTABLE); 99 im = luaT_getimbyObj(L->stack.top-2, IM_GETTABLE);
99 else { /* object is a table... */ 100 else { /* object is a table... */
100 int tg = (luaD_stack.top-2)->value.a->htag; 101 int tg = (L->stack.top-2)->value.a->htag;
101 im = luaT_getim(tg, IM_GETTABLE); 102 im = luaT_getim(tg, IM_GETTABLE);
102 if (ttype(im) == LUA_T_NIL) { /* and does not have a "gettable" method */ 103 if (ttype(im) == LUA_T_NIL) { /* and does not have a "gettable" method */
103 TObject *h = luaH_get(avalue(luaD_stack.top-2), luaD_stack.top-1); 104 TObject *h = luaH_get(avalue(L->stack.top-2), L->stack.top-1);
104 if (h != NULL && ttype(h) != LUA_T_NIL) { 105 if (h != NULL && ttype(h) != LUA_T_NIL) {
105 --luaD_stack.top; 106 --L->stack.top;
106 *(luaD_stack.top-1) = *h; 107 *(L->stack.top-1) = *h;
107 } 108 }
108 else if (ttype(im=luaT_getim(tg, IM_INDEX)) != LUA_T_NIL) 109 else if (ttype(im=luaT_getim(tg, IM_INDEX)) != LUA_T_NIL)
109 luaD_callTM(im, 2, 1); 110 luaD_callTM(im, 2, 1);
110 else { 111 else {
111 --luaD_stack.top; 112 --L->stack.top;
112 ttype(luaD_stack.top-1) = LUA_T_NIL; 113 ttype(L->stack.top-1) = LUA_T_NIL;
113 } 114 }
114 return; 115 return;
115 } 116 }
@@ -124,26 +125,26 @@ void luaV_gettable (void)
124 125
125 126
126/* 127/*
127** Function to store indexed based on values at the luaD_stack.top 128** Function to store indexed based on values at the L->stack.top
128** mode = 0: raw store (without internal methods) 129** mode = 0: raw store (without internal methods)
129** mode = 1: normal store (with internal methods) 130** mode = 1: normal store (with internal methods)
130** mode = 2: "deep luaD_stack.stack" store (with internal methods) 131** mode = 2: "deep L->stack.stack" store (with internal methods)
131*/ 132*/
132void luaV_settable (TObject *t, int mode) 133void luaV_settable (TObject *t, int mode)
133{ 134{
134 TObject *im = (mode == 0) ? NULL : luaT_getimbyObj(t, IM_SETTABLE); 135 TObject *im = (mode == 0) ? NULL : luaT_getimbyObj(t, IM_SETTABLE);
135 if (ttype(t) == LUA_T_ARRAY && (im == NULL || ttype(im) == LUA_T_NIL)) { 136 if (ttype(t) == LUA_T_ARRAY && (im == NULL || ttype(im) == LUA_T_NIL)) {
136 TObject *h = luaH_set(avalue(t), t+1); 137 TObject *h = luaH_set(avalue(t), t+1);
137 *h = *(luaD_stack.top-1); 138 *h = *(L->stack.top-1);
138 luaD_stack.top -= (mode == 2) ? 1 : 3; 139 L->stack.top -= (mode == 2) ? 1 : 3;
139 } 140 }
140 else { /* object is not a table, and/or has a specific "settable" method */ 141 else { /* object is not a table, and/or has a specific "settable" method */
141 if (im && ttype(im) != LUA_T_NIL) { 142 if (im && ttype(im) != LUA_T_NIL) {
142 if (mode == 2) { 143 if (mode == 2) {
143 *(luaD_stack.top+1) = *(luaD_stack.top-1); 144 *(L->stack.top+1) = *(L->stack.top-1);
144 *(luaD_stack.top) = *(t+1); 145 *(L->stack.top) = *(t+1);
145 *(luaD_stack.top-1) = *t; 146 *(L->stack.top-1) = *t;
146 luaD_stack.top += 2; /* WARNING: caller must assure stack space */ 147 L->stack.top += 2; /* WARNING: caller must assure stack space */
147 } 148 }
148 luaD_callTM(im, 3, 0); 149 luaD_callTM(im, 3, 0);
149 } 150 }
@@ -159,13 +160,13 @@ void luaV_getglobal (TaggedString *ts)
159 TObject *value = &ts->u.globalval; 160 TObject *value = &ts->u.globalval;
160 TObject *im = luaT_getimbyObj(value, IM_GETGLOBAL); 161 TObject *im = luaT_getimbyObj(value, IM_GETGLOBAL);
161 if (ttype(im) == LUA_T_NIL) { /* default behavior */ 162 if (ttype(im) == LUA_T_NIL) { /* default behavior */
162 *luaD_stack.top++ = *value; 163 *L->stack.top++ = *value;
163 } 164 }
164 else { 165 else {
165 ttype(luaD_stack.top) = LUA_T_STRING; 166 ttype(L->stack.top) = LUA_T_STRING;
166 tsvalue(luaD_stack.top) = ts; 167 tsvalue(L->stack.top) = ts;
167 luaD_stack.top++; 168 L->stack.top++;
168 *luaD_stack.top++ = *value; 169 *L->stack.top++ = *value;
169 luaD_callTM(im, 2, 1); 170 luaD_callTM(im, 2, 1);
170 } 171 }
171} 172}
@@ -176,14 +177,14 @@ void luaV_setglobal (TaggedString *ts)
176 TObject *oldvalue = &ts->u.globalval; 177 TObject *oldvalue = &ts->u.globalval;
177 TObject *im = luaT_getimbyObj(oldvalue, IM_SETGLOBAL); 178 TObject *im = luaT_getimbyObj(oldvalue, IM_SETGLOBAL);
178 if (ttype(im) == LUA_T_NIL) /* default behavior */ 179 if (ttype(im) == LUA_T_NIL) /* default behavior */
179 luaS_rawsetglobal(ts, --luaD_stack.top); 180 luaS_rawsetglobal(ts, --L->stack.top);
180 else { 181 else {
181 /* WARNING: caller must assure stack space */ 182 /* WARNING: caller must assure stack space */
182 TObject newvalue = *(luaD_stack.top-1); 183 TObject newvalue = *(L->stack.top-1);
183 ttype(luaD_stack.top-1) = LUA_T_STRING; 184 ttype(L->stack.top-1) = LUA_T_STRING;
184 tsvalue(luaD_stack.top-1) = ts; 185 tsvalue(L->stack.top-1) = ts;
185 *luaD_stack.top++ = *oldvalue; 186 *L->stack.top++ = *oldvalue;
186 *luaD_stack.top++ = newvalue; 187 *L->stack.top++ = newvalue;
187 luaD_callTM(im, 3, 0); 188 luaD_callTM(im, 3, 0);
188 } 189 }
189} 190}
@@ -191,9 +192,9 @@ void luaV_setglobal (TaggedString *ts)
191 192
192static void call_binTM (IMS event, char *msg) 193static void call_binTM (IMS event, char *msg)
193{ 194{
194 TObject *im = luaT_getimbyObj(luaD_stack.top-2, event);/* try first operand */ 195 TObject *im = luaT_getimbyObj(L->stack.top-2, event);/* try first operand */
195 if (ttype(im) == LUA_T_NIL) { 196 if (ttype(im) == LUA_T_NIL) {
196 im = luaT_getimbyObj(luaD_stack.top-1, event); /* try second operand */ 197 im = luaT_getimbyObj(L->stack.top-1, event); /* try second operand */
197 if (ttype(im) == LUA_T_NIL) { 198 if (ttype(im) == LUA_T_NIL) {
198 im = luaT_getim(0, event); /* try a 'global' i.m. */ 199 im = luaT_getim(0, event); /* try a 'global' i.m. */
199 if (ttype(im) == LUA_T_NIL) 200 if (ttype(im) == LUA_T_NIL)
@@ -214,8 +215,8 @@ static void call_arith (IMS event)
214static void comparison (lua_Type ttype_less, lua_Type ttype_equal, 215static void comparison (lua_Type ttype_less, lua_Type ttype_equal,
215 lua_Type ttype_great, IMS op) 216 lua_Type ttype_great, IMS op)
216{ 217{
217 TObject *l = luaD_stack.top-2; 218 TObject *l = L->stack.top-2;
218 TObject *r = luaD_stack.top-1; 219 TObject *r = L->stack.top-1;
219 int result; 220 int result;
220 if (ttype(l) == LUA_T_NUMBER && ttype(r) == LUA_T_NUMBER) 221 if (ttype(l) == LUA_T_NUMBER && ttype(r) == LUA_T_NUMBER)
221 result = (nvalue(l) < nvalue(r)) ? -1 : (nvalue(l) == nvalue(r)) ? 0 : 1; 222 result = (nvalue(l) < nvalue(r)) ? -1 : (nvalue(l) == nvalue(r)) ? 0 : 1;
@@ -225,16 +226,16 @@ static void comparison (lua_Type ttype_less, lua_Type ttype_equal,
225 call_binTM(op, "unexpected type at comparison"); 226 call_binTM(op, "unexpected type at comparison");
226 return; 227 return;
227 } 228 }
228 luaD_stack.top--; 229 L->stack.top--;
229 nvalue(luaD_stack.top-1) = 1; 230 nvalue(L->stack.top-1) = 1;
230 ttype(luaD_stack.top-1) = (result < 0) ? ttype_less : 231 ttype(L->stack.top-1) = (result < 0) ? ttype_less :
231 (result == 0) ? ttype_equal : ttype_great; 232 (result == 0) ? ttype_equal : ttype_great;
232} 233}
233 234
234 235
235void luaV_pack (StkId firstel, int nvararg, TObject *tab) 236void luaV_pack (StkId firstel, int nvararg, TObject *tab)
236{ 237{
237 TObject *firstelem = luaD_stack.stack+firstel; 238 TObject *firstelem = L->stack.stack+firstel;
238 int i; 239 int i;
239 if (nvararg < 0) nvararg = 0; 240 if (nvararg < 0) nvararg = 0;
240 avalue(tab) = luaH_new(nvararg+1); /* +1 for field 'n' */ 241 avalue(tab) = luaH_new(nvararg+1); /* +1 for field 'n' */
@@ -260,20 +261,21 @@ static void adjust_varargs (StkId first_extra_arg)
260{ 261{
261 TObject arg; 262 TObject arg;
262 luaV_pack(first_extra_arg, 263 luaV_pack(first_extra_arg,
263 (luaD_stack.top-luaD_stack.stack)-first_extra_arg, &arg); 264 (L->stack.top-L->stack.stack)-first_extra_arg, &arg);
264 luaD_adjusttop(first_extra_arg); 265 luaD_adjusttop(first_extra_arg);
265 *luaD_stack.top++ = arg; 266 *L->stack.top++ = arg;
266} 267}
267 268
268 269
269 270
270/* 271/*
271** Execute the given opcode, until a RET. Parameters are between 272** Execute the given opcode, until a RET. Parameters are between
272** [luaD_stack.stack+base,luaD_stack.top). Returns n such that the the results are between 273** [stack+base,top). Returns n such that the the results are between
273** [luaD_stack.stack+n,luaD_stack.top). 274** [stack+n,top).
274*/ 275*/
275StkId luaV_execute (Closure *cl, StkId base) 276StkId luaV_execute (Closure *cl, StkId base)
276{ 277{
278 LState *LL = L; /* to optimize */
277 Byte *pc = cl->consts[0].value.tf->code; 279 Byte *pc = cl->consts[0].value.tf->code;
278 TObject *consts = cl->consts[0].value.tf->consts; 280 TObject *consts = cl->consts[0].value.tf->consts;
279 if (lua_callhook) 281 if (lua_callhook)
@@ -284,13 +286,13 @@ StkId luaV_execute (Closure *cl, StkId base)
284 switch ((OpCode)(aux = *pc++)) { 286 switch ((OpCode)(aux = *pc++)) {
285 287
286 case PUSHNIL0: 288 case PUSHNIL0:
287 ttype(luaD_stack.top++) = LUA_T_NIL; 289 ttype(LL->stack.top++) = LUA_T_NIL;
288 break; 290 break;
289 291
290 case PUSHNIL: 292 case PUSHNIL:
291 aux = *pc++; 293 aux = *pc++;
292 do { 294 do {
293 ttype(luaD_stack.top++) = LUA_T_NIL; 295 ttype(LL->stack.top++) = LUA_T_NIL;
294 } while (aux--); 296 } while (aux--);
295 break; 297 break;
296 298
@@ -303,9 +305,9 @@ StkId luaV_execute (Closure *cl, StkId base)
303 case PUSHNUMBER0: case PUSHNUMBER1: case PUSHNUMBER2: 305 case PUSHNUMBER0: case PUSHNUMBER1: case PUSHNUMBER2:
304 aux -= PUSHNUMBER0; 306 aux -= PUSHNUMBER0;
305 pushnumber: 307 pushnumber:
306 ttype(luaD_stack.top) = LUA_T_NUMBER; 308 ttype(LL->stack.top) = LUA_T_NUMBER;
307 nvalue(luaD_stack.top) = aux; 309 nvalue(LL->stack.top) = aux;
308 luaD_stack.top++; 310 LL->stack.top++;
309 break; 311 break;
310 312
311 case PUSHLOCAL: 313 case PUSHLOCAL:
@@ -315,7 +317,7 @@ StkId luaV_execute (Closure *cl, StkId base)
315 case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: 317 case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7:
316 aux -= PUSHLOCAL0; 318 aux -= PUSHLOCAL0;
317 pushlocal: 319 pushlocal:
318 *luaD_stack.top++ = *((luaD_stack.stack+base) + aux); 320 *LL->stack.top++ = *((LL->stack.stack+base) + aux);
319 break; 321 break;
320 322
321 case GETGLOBALW: 323 case GETGLOBALW:
@@ -345,7 +347,7 @@ StkId luaV_execute (Closure *cl, StkId base)
345 case GETDOTTED4: case GETDOTTED5: case GETDOTTED6: case GETDOTTED7: 347 case GETDOTTED4: case GETDOTTED5: case GETDOTTED6: case GETDOTTED7:
346 aux -= GETDOTTED0; 348 aux -= GETDOTTED0;
347 getdotted: 349 getdotted:
348 *luaD_stack.top++ = consts[aux]; 350 *LL->stack.top++ = consts[aux];
349 luaV_gettable(); 351 luaV_gettable();
350 break; 352 break;
351 353
@@ -355,10 +357,10 @@ StkId luaV_execute (Closure *cl, StkId base)
355 case PUSHSELF: 357 case PUSHSELF:
356 aux = *pc++; 358 aux = *pc++;
357 pushself: { 359 pushself: {
358 TObject receiver = *(luaD_stack.top-1); 360 TObject receiver = *(LL->stack.top-1);
359 *luaD_stack.top++ = consts[aux]; 361 *LL->stack.top++ = consts[aux];
360 luaV_gettable(); 362 luaV_gettable();
361 *luaD_stack.top++ = receiver; 363 *LL->stack.top++ = receiver;
362 break; 364 break;
363 } 365 }
364 366
@@ -373,7 +375,7 @@ StkId luaV_execute (Closure *cl, StkId base)
373 case PUSHCONSTANT6: case PUSHCONSTANT7: 375 case PUSHCONSTANT6: case PUSHCONSTANT7:
374 aux -= PUSHCONSTANT0; 376 aux -= PUSHCONSTANT0;
375 pushconstant: 377 pushconstant:
376 *luaD_stack.top++ = consts[aux]; 378 *LL->stack.top++ = consts[aux];
377 break; 379 break;
378 380
379 case PUSHUPVALUE: 381 case PUSHUPVALUE:
@@ -382,7 +384,7 @@ StkId luaV_execute (Closure *cl, StkId base)
382 case PUSHUPVALUE0: case PUSHUPVALUE1: 384 case PUSHUPVALUE0: case PUSHUPVALUE1:
383 aux -= PUSHUPVALUE0; 385 aux -= PUSHUPVALUE0;
384 pushupvalue: 386 pushupvalue:
385 *luaD_stack.top++ = cl->consts[aux+1]; 387 *LL->stack.top++ = cl->consts[aux+1];
386 break; 388 break;
387 389
388 case SETLOCAL: 390 case SETLOCAL:
@@ -392,7 +394,7 @@ StkId luaV_execute (Closure *cl, StkId base)
392 case SETLOCAL4: case SETLOCAL5: case SETLOCAL6: case SETLOCAL7: 394 case SETLOCAL4: case SETLOCAL5: case SETLOCAL6: case SETLOCAL7:
393 aux -= SETLOCAL0; 395 aux -= SETLOCAL0;
394 setlocal: 396 setlocal:
395 *((luaD_stack.stack+base) + aux) = *(--luaD_stack.top); 397 *((LL->stack.stack+base) + aux) = *(--LL->stack.top);
396 break; 398 break;
397 399
398 case SETGLOBALW: 400 case SETGLOBALW:
@@ -409,11 +411,11 @@ StkId luaV_execute (Closure *cl, StkId base)
409 break; 411 break;
410 412
411 case SETTABLE0: 413 case SETTABLE0:
412 luaV_settable(luaD_stack.top-3, 1); 414 luaV_settable(LL->stack.top-3, 1);
413 break; 415 break;
414 416
415 case SETTABLE: 417 case SETTABLE:
416 luaV_settable(luaD_stack.top-3-(*pc++), 2); 418 luaV_settable(LL->stack.top-3-(*pc++), 2);
417 break; 419 break;
418 420
419 case SETLISTW: 421 case SETLISTW:
@@ -426,12 +428,12 @@ StkId luaV_execute (Closure *cl, StkId base)
426 aux = 0; 428 aux = 0;
427 setlist: { 429 setlist: {
428 int n = *(pc++); 430 int n = *(pc++);
429 TObject *arr = luaD_stack.top-n-1; 431 TObject *arr = LL->stack.top-n-1;
430 for (; n; n--) { 432 for (; n; n--) {
431 ttype(luaD_stack.top) = LUA_T_NUMBER; 433 ttype(LL->stack.top) = LUA_T_NUMBER;
432 nvalue(luaD_stack.top) = n+aux; 434 nvalue(LL->stack.top) = n+aux;
433 *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); 435 *(luaH_set (avalue(arr), LL->stack.top)) = *(LL->stack.top-1);
434 luaD_stack.top--; 436 LL->stack.top--;
435 } 437 }
436 break; 438 break;
437 } 439 }
@@ -442,10 +444,10 @@ StkId luaV_execute (Closure *cl, StkId base)
442 case SETMAP: 444 case SETMAP:
443 aux = *pc++; 445 aux = *pc++;
444 setmap: { 446 setmap: {
445 TObject *arr = luaD_stack.top-(2*aux)-3; 447 TObject *arr = LL->stack.top-(2*aux)-3;
446 do { 448 do {
447 *(luaH_set (avalue(arr), luaD_stack.top-2)) = *(luaD_stack.top-1); 449 *(luaH_set (avalue(arr), LL->stack.top-2)) = *(LL->stack.top-1);
448 luaD_stack.top-=2; 450 LL->stack.top-=2;
449 } while (aux--); 451 } while (aux--);
450 break; 452 break;
451 } 453 }
@@ -456,7 +458,7 @@ StkId luaV_execute (Closure *cl, StkId base)
456 case POP0: case POP1: 458 case POP0: case POP1:
457 aux -= POP0; 459 aux -= POP0;
458 pop: 460 pop:
459 luaD_stack.top -= (aux+1); 461 LL->stack.top -= (aux+1);
460 break; 462 break;
461 463
462 case ARGS: 464 case ARGS:
@@ -478,17 +480,17 @@ StkId luaV_execute (Closure *cl, StkId base)
478 aux = *pc++; 480 aux = *pc++;
479 createarray: 481 createarray:
480 luaC_checkGC(); 482 luaC_checkGC();
481 avalue(luaD_stack.top) = luaH_new(aux); 483 avalue(LL->stack.top) = luaH_new(aux);
482 ttype(luaD_stack.top) = LUA_T_ARRAY; 484 ttype(LL->stack.top) = LUA_T_ARRAY;
483 luaD_stack.top++; 485 LL->stack.top++;
484 break; 486 break;
485 487
486 case EQOP: case NEQOP: { 488 case EQOP: case NEQOP: {
487 int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); 489 int res = luaO_equalObj(LL->stack.top-2, LL->stack.top-1);
488 luaD_stack.top--; 490 LL->stack.top--;
489 if (aux == NEQOP) res = !res; 491 if (aux == NEQOP) res = !res;
490 ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; 492 ttype(LL->stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL;
491 nvalue(luaD_stack.top-1) = 1; 493 nvalue(LL->stack.top-1) = 1;
492 break; 494 break;
493 } 495 }
494 496
@@ -509,49 +511,49 @@ StkId luaV_execute (Closure *cl, StkId base)
509 break; 511 break;
510 512
511 case ADDOP: { 513 case ADDOP: {
512 TObject *l = luaD_stack.top-2; 514 TObject *l = LL->stack.top-2;
513 TObject *r = luaD_stack.top-1; 515 TObject *r = LL->stack.top-1;
514 if (tonumber(r) || tonumber(l)) 516 if (tonumber(r) || tonumber(l))
515 call_arith(IM_ADD); 517 call_arith(IM_ADD);
516 else { 518 else {
517 nvalue(l) += nvalue(r); 519 nvalue(l) += nvalue(r);
518 --luaD_stack.top; 520 --LL->stack.top;
519 } 521 }
520 break; 522 break;
521 } 523 }
522 524
523 case SUBOP: { 525 case SUBOP: {
524 TObject *l = luaD_stack.top-2; 526 TObject *l = LL->stack.top-2;
525 TObject *r = luaD_stack.top-1; 527 TObject *r = LL->stack.top-1;
526 if (tonumber(r) || tonumber(l)) 528 if (tonumber(r) || tonumber(l))
527 call_arith(IM_SUB); 529 call_arith(IM_SUB);
528 else { 530 else {
529 nvalue(l) -= nvalue(r); 531 nvalue(l) -= nvalue(r);
530 --luaD_stack.top; 532 --LL->stack.top;
531 } 533 }
532 break; 534 break;
533 } 535 }
534 536
535 case MULTOP: { 537 case MULTOP: {
536 TObject *l = luaD_stack.top-2; 538 TObject *l = LL->stack.top-2;
537 TObject *r = luaD_stack.top-1; 539 TObject *r = LL->stack.top-1;
538 if (tonumber(r) || tonumber(l)) 540 if (tonumber(r) || tonumber(l))
539 call_arith(IM_MUL); 541 call_arith(IM_MUL);
540 else { 542 else {
541 nvalue(l) *= nvalue(r); 543 nvalue(l) *= nvalue(r);
542 --luaD_stack.top; 544 --LL->stack.top;
543 } 545 }
544 break; 546 break;
545 } 547 }
546 548
547 case DIVOP: { 549 case DIVOP: {
548 TObject *l = luaD_stack.top-2; 550 TObject *l = LL->stack.top-2;
549 TObject *r = luaD_stack.top-1; 551 TObject *r = LL->stack.top-1;
550 if (tonumber(r) || tonumber(l)) 552 if (tonumber(r) || tonumber(l))
551 call_arith(IM_DIV); 553 call_arith(IM_DIV);
552 else { 554 else {
553 nvalue(l) /= nvalue(r); 555 nvalue(l) /= nvalue(r);
554 --luaD_stack.top; 556 --LL->stack.top;
555 } 557 }
556 break; 558 break;
557 } 559 }
@@ -561,32 +563,32 @@ StkId luaV_execute (Closure *cl, StkId base)
561 break; 563 break;
562 564
563 case CONCOP: { 565 case CONCOP: {
564 TObject *l = luaD_stack.top-2; 566 TObject *l = LL->stack.top-2;
565 TObject *r = luaD_stack.top-1; 567 TObject *r = LL->stack.top-1;
566 if (tostring(l) || tostring(r)) 568 if (tostring(l) || tostring(r))
567 call_binTM(IM_CONCAT, "unexpected type for concatenation"); 569 call_binTM(IM_CONCAT, "unexpected type for concatenation");
568 else { 570 else {
569 tsvalue(l) = strconc(svalue(l), svalue(r)); 571 tsvalue(l) = strconc(svalue(l), svalue(r));
570 --luaD_stack.top; 572 --LL->stack.top;
571 } 573 }
572 luaC_checkGC(); 574 luaC_checkGC();
573 break; 575 break;
574 } 576 }
575 577
576 case MINUSOP: 578 case MINUSOP:
577 if (tonumber(luaD_stack.top-1)) { 579 if (tonumber(LL->stack.top-1)) {
578 ttype(luaD_stack.top) = LUA_T_NIL; 580 ttype(LL->stack.top) = LUA_T_NIL;
579 luaD_stack.top++; 581 LL->stack.top++;
580 call_arith(IM_UNM); 582 call_arith(IM_UNM);
581 } 583 }
582 else 584 else
583 nvalue(luaD_stack.top-1) = - nvalue(luaD_stack.top-1); 585 nvalue(LL->stack.top-1) = - nvalue(LL->stack.top-1);
584 break; 586 break;
585 587
586 case NOTOP: 588 case NOTOP:
587 ttype(luaD_stack.top-1) = 589 ttype(LL->stack.top-1) =
588 (ttype(luaD_stack.top-1) == LUA_T_NIL) ? LUA_T_NUMBER : LUA_T_NIL; 590 (ttype(LL->stack.top-1) == LUA_T_NIL) ? LUA_T_NUMBER : LUA_T_NIL;
589 nvalue(luaD_stack.top-1) = 1; 591 nvalue(LL->stack.top-1) = 1;
590 break; 592 break;
591 593
592 case ONTJMPW: 594 case ONTJMPW:
@@ -595,8 +597,8 @@ StkId luaV_execute (Closure *cl, StkId base)
595 case ONTJMP: 597 case ONTJMP:
596 aux = *pc++; 598 aux = *pc++;
597 ontjmp: 599 ontjmp:
598 if (ttype(luaD_stack.top-1) != LUA_T_NIL) pc += aux; 600 if (ttype(LL->stack.top-1) != LUA_T_NIL) pc += aux;
599 else luaD_stack.top--; 601 else LL->stack.top--;
600 break; 602 break;
601 603
602 case ONFJMPW: 604 case ONFJMPW:
@@ -605,8 +607,8 @@ StkId luaV_execute (Closure *cl, StkId base)
605 case ONFJMP: 607 case ONFJMP:
606 aux = *pc++; 608 aux = *pc++;
607 onfjmp: 609 onfjmp:
608 if (ttype(luaD_stack.top-1) == LUA_T_NIL) pc += aux; 610 if (ttype(LL->stack.top-1) == LUA_T_NIL) pc += aux;
609 else luaD_stack.top--; 611 else LL->stack.top--;
610 break; 612 break;
611 613
612 case JMPW: 614 case JMPW:
@@ -624,7 +626,7 @@ StkId luaV_execute (Closure *cl, StkId base)
624 case IFFJMP: 626 case IFFJMP:
625 aux = *pc++; 627 aux = *pc++;
626 iffjmp: 628 iffjmp:
627 if (ttype(--luaD_stack.top) == LUA_T_NIL) pc += aux; 629 if (ttype(--LL->stack.top) == LUA_T_NIL) pc += aux;
628 break; 630 break;
629 631
630 case IFTUPJMPW: 632 case IFTUPJMPW:
@@ -633,7 +635,7 @@ StkId luaV_execute (Closure *cl, StkId base)
633 case IFTUPJMP: 635 case IFTUPJMP:
634 aux = *pc++; 636 aux = *pc++;
635 iftupjmp: 637 iftupjmp:
636 if (ttype(--luaD_stack.top) != LUA_T_NIL) pc -= aux; 638 if (ttype(--LL->stack.top) != LUA_T_NIL) pc -= aux;
637 break; 639 break;
638 640
639 case IFFUPJMPW: 641 case IFFUPJMPW:
@@ -642,7 +644,7 @@ StkId luaV_execute (Closure *cl, StkId base)
642 case IFFUPJMP: 644 case IFFUPJMP:
643 aux = *pc++; 645 aux = *pc++;
644 iffupjmp: 646 iffupjmp:
645 if (ttype(--luaD_stack.top) == LUA_T_NIL) pc -= aux; 647 if (ttype(--LL->stack.top) == LUA_T_NIL) pc -= aux;
646 break; 648 break;
647 649
648 case CLOSURE: 650 case CLOSURE:
@@ -661,13 +663,13 @@ StkId luaV_execute (Closure *cl, StkId base)
661 case CALLFUNC0: case CALLFUNC1: 663 case CALLFUNC0: case CALLFUNC1:
662 aux -= CALLFUNC0; 664 aux -= CALLFUNC0;
663 callfunc: { 665 callfunc: {
664 StkId newBase = (luaD_stack.top-luaD_stack.stack)-(*pc++); 666 StkId newBase = (LL->stack.top-LL->stack.stack)-(*pc++);
665 luaD_call(newBase, aux); 667 luaD_call(newBase, aux);
666 break; 668 break;
667 } 669 }
668 670
669 case ENDCODE: 671 case ENDCODE:
670 luaD_stack.top = luaD_stack.stack + base; 672 LL->stack.top = LL->stack.stack + base;
671 /* goes through */ 673 /* goes through */
672 case RETCODE: 674 case RETCODE:
673 if (lua_callhook) 675 if (lua_callhook)
@@ -680,13 +682,13 @@ StkId luaV_execute (Closure *cl, StkId base)
680 case SETLINE: 682 case SETLINE:
681 aux = *pc++; 683 aux = *pc++;
682 setline: 684 setline:
683 if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) { 685 if ((LL->stack.stack+base-1)->ttype != LUA_T_LINE) {
684 /* open space for LINE value */ 686 /* open space for LINE value */
685 luaD_openstack((luaD_stack.top-luaD_stack.stack)-base); 687 luaD_openstack((LL->stack.top-LL->stack.stack)-base);
686 base++; 688 base++;
687 (luaD_stack.stack+base-1)->ttype = LUA_T_LINE; 689 (LL->stack.stack+base-1)->ttype = LUA_T_LINE;
688 } 690 }
689 (luaD_stack.stack+base-1)->value.i = aux; 691 (LL->stack.stack+base-1)->value.i = aux;
690 if (lua_linehook) 692 if (lua_linehook)
691 luaD_lineHook(aux); 693 luaD_lineHook(aux);
692 break; 694 break;