diff options
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 224 |
1 files changed, 113 insertions, 111 deletions
@@ -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) | |||
79 | void luaV_closure (int nelems) | 80 | void 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) | |||
94 | void luaV_gettable (void) | 95 | void 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 | */ |
132 | void luaV_settable (TObject *t, int mode) | 133 | void 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 | ||
192 | static void call_binTM (IMS event, char *msg) | 193 | static 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) | |||
214 | static void comparison (lua_Type ttype_less, lua_Type ttype_equal, | 215 | static 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 | ||
235 | void luaV_pack (StkId firstel, int nvararg, TObject *tab) | 236 | void 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 | */ |
275 | StkId luaV_execute (Closure *cl, StkId base) | 276 | StkId 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; |