diff options
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 126 |
1 files changed, 73 insertions, 53 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.2 1997/09/19 18:40:32 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.3 1997/09/19 21:17:52 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 | */ |
@@ -28,7 +28,7 @@ | |||
28 | 28 | ||
29 | 29 | ||
30 | /* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */ | 30 | /* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */ |
31 | #define EXTRA_STACK 4 | 31 | #define EXTRA_STACK 5 |
32 | 32 | ||
33 | 33 | ||
34 | 34 | ||
@@ -276,14 +276,14 @@ static void adjust_varargs (StkId first_extra_arg) | |||
276 | */ | 276 | */ |
277 | StkId luaV_execute (Closure *cl, StkId base) | 277 | StkId luaV_execute (Closure *cl, StkId base) |
278 | { | 278 | { |
279 | TProtoFunc *func = cl->consts[0].value.tf; | 279 | Byte *pc = cl->consts[0].value.tf->code; |
280 | Byte *pc = func->code; | 280 | TObject *consts = cl->consts[0].value.tf->consts; |
281 | if (lua_callhook) | 281 | if (lua_callhook) |
282 | luaD_callHook(base, LUA_T_MARK, 0); | 282 | luaD_callHook(base, LUA_T_MARK, 0); |
283 | luaD_checkstack((*pc++)+EXTRA_STACK); | 283 | luaD_checkstack((*pc++)+EXTRA_STACK); |
284 | while (1) { | 284 | while (1) { |
285 | OpCode opcode; | 285 | int aux; |
286 | switch (opcode = (OpCode)*pc++) { | 286 | switch ((OpCode)(aux = *pc++)) { |
287 | 287 | ||
288 | case PUSHNIL: | 288 | case PUSHNIL: |
289 | ttype(luaD_stack.top++) = LUA_T_NIL; | 289 | ttype(luaD_stack.top++) = LUA_T_NIL; |
@@ -296,89 +296,95 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
296 | break; | 296 | break; |
297 | } | 297 | } |
298 | 298 | ||
299 | case PUSH0: case PUSH1: case PUSH2: | ||
300 | ttype(luaD_stack.top) = LUA_T_NUMBER; | ||
301 | nvalue(luaD_stack.top) = opcode-PUSH0; | ||
302 | luaD_stack.top++; | ||
303 | break; | ||
304 | |||
305 | case PUSHBYTE: | 299 | case PUSHBYTE: |
306 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 300 | aux = *pc++; goto pushnumber; |
307 | nvalue(luaD_stack.top) = *pc++; | ||
308 | luaD_stack.top++; | ||
309 | break; | ||
310 | 301 | ||
311 | case PUSHWORD: | 302 | case PUSHWORD: |
303 | aux = get_word(pc); goto pushnumber; | ||
304 | |||
305 | case PUSH0: case PUSH1: case PUSH2: | ||
306 | aux -= PUSH0; | ||
307 | pushnumber: | ||
312 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 308 | ttype(luaD_stack.top) = LUA_T_NUMBER; |
313 | nvalue(luaD_stack.top) = get_word(pc); | 309 | nvalue(luaD_stack.top) = aux; |
314 | luaD_stack.top++; | 310 | luaD_stack.top++; |
315 | break; | 311 | break; |
316 | 312 | ||
313 | case PUSHLOCAL: | ||
314 | aux = *pc++; goto pushlocal; | ||
315 | |||
317 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: | 316 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: |
318 | case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: | 317 | case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: |
319 | case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: | 318 | case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: |
320 | case PUSHLOCAL9: | 319 | case PUSHLOCAL9: |
321 | *luaD_stack.top++ = | 320 | aux -= PUSHLOCAL0; |
322 | *((luaD_stack.stack+base) + (int)(opcode-PUSHLOCAL0)); | 321 | pushlocal: |
323 | break; | 322 | *luaD_stack.top++ = *((luaD_stack.stack+base) + aux); |
324 | |||
325 | case PUSHLOCAL: | ||
326 | *luaD_stack.top++ = *((luaD_stack.stack+base) + (*pc++)); | ||
327 | break; | 323 | break; |
328 | 324 | ||
329 | case PUSHGLOBALB: | 325 | case GETGLOBAL: |
330 | luaV_getglobal(luaG_findsymbol(tsvalue(&func->consts[*pc++]))); | 326 | aux = get_word(pc); goto getglobal; |
331 | break; | ||
332 | 327 | ||
333 | case PUSHGLOBAL: | 328 | case GETGLOBALB: |
334 | luaV_getglobal(luaG_findsymbol(tsvalue(&func->consts[get_word(pc)]))); | 329 | aux = *pc++; |
330 | getglobal: | ||
331 | luaV_getglobal(luaG_findsymbol(tsvalue(&consts[aux]))); | ||
335 | break; | 332 | break; |
336 | 333 | ||
337 | case GETTABLE: | 334 | case GETTABLE: |
338 | luaV_gettable(); | 335 | luaV_gettable(); |
339 | break; | 336 | break; |
340 | 337 | ||
341 | case PUSHSELF: { | 338 | case PUSHSELF: |
339 | aux = get_word(pc); goto pushself; | ||
340 | |||
341 | case PUSHSELFB: | ||
342 | aux = *pc++; | ||
343 | pushself: { | ||
342 | TObject receiver = *(luaD_stack.top-1); | 344 | TObject receiver = *(luaD_stack.top-1); |
343 | *luaD_stack.top++ = func->consts[get_word(pc)]; | 345 | *luaD_stack.top++ = consts[aux]; |
344 | luaV_gettable(); | 346 | luaV_gettable(); |
345 | *luaD_stack.top++ = receiver; | 347 | *luaD_stack.top++ = receiver; |
346 | break; | 348 | break; |
347 | } | 349 | } |
348 | 350 | ||
351 | case PUSHCONSTANT: | ||
352 | aux = get_word(pc); goto pushconstant; | ||
353 | |||
349 | case PUSHCONSTANTB: | 354 | case PUSHCONSTANTB: |
350 | *luaD_stack.top++ = func->consts[*pc++]; | 355 | aux = *pc++; |
356 | pushconstant: | ||
357 | *luaD_stack.top++ = consts[aux]; | ||
351 | break; | 358 | break; |
352 | 359 | ||
353 | case PUSHCONSTANT: | 360 | case PUSHUPVALUE: |
354 | *luaD_stack.top++ = func->consts[get_word(pc)]; | 361 | aux = *pc++; goto pushupvalue; |
355 | break; | ||
356 | 362 | ||
357 | case PUSHUPVALUE0: | 363 | case PUSHUPVALUE0: |
358 | *luaD_stack.top++ = cl->consts[1]; | 364 | aux = 0; |
365 | pushupvalue: | ||
366 | *luaD_stack.top++ = cl->consts[aux+1]; | ||
359 | break; | 367 | break; |
360 | 368 | ||
361 | case PUSHUPVALUE: | 369 | case SETLOCAL: |
362 | *luaD_stack.top++ = cl->consts[(*pc++)+1]; | 370 | aux = *pc++; goto setlocal; |
363 | break; | ||
364 | 371 | ||
365 | case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: | 372 | case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: |
366 | case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: | 373 | case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: |
367 | case SETLOCAL6: case SETLOCAL7: case SETLOCAL8: | 374 | case SETLOCAL6: case SETLOCAL7: case SETLOCAL8: |
368 | case SETLOCAL9: | 375 | case SETLOCAL9: |
369 | *((luaD_stack.stack+base) + (int)(opcode-SETLOCAL0)) = | 376 | aux -= SETLOCAL0; |
370 | *(--luaD_stack.top); | 377 | setlocal: |
378 | *((luaD_stack.stack+base) + aux) = *(--luaD_stack.top); | ||
371 | break; | 379 | break; |
372 | 380 | ||
373 | case SETLOCAL: | 381 | case SETGLOBAL: |
374 | *((luaD_stack.stack+base) + (*pc++)) = *(--luaD_stack.top); break; | 382 | aux = get_word(pc); goto setglobal; |
375 | 383 | ||
376 | case SETGLOBALB: | 384 | case SETGLOBALB: |
377 | luaV_setglobal(luaG_findsymbol(tsvalue(&func->consts[*pc++]))); | 385 | aux = *pc++; |
378 | break; | 386 | setglobal: |
379 | 387 | luaV_setglobal(luaG_findsymbol(tsvalue(&consts[aux]))); | |
380 | case SETGLOBAL: | ||
381 | luaV_setglobal(luaG_findsymbol(tsvalue(&func->consts[get_word(pc)]))); | ||
382 | break; | 388 | break; |
383 | 389 | ||
384 | case SETTABLE0: | 390 | case SETTABLE0: |
@@ -389,14 +395,17 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
389 | luaV_settable(luaD_stack.top-3-(*pc++), 2); | 395 | luaV_settable(luaD_stack.top-3-(*pc++), 2); |
390 | break; | 396 | break; |
391 | 397 | ||
398 | case SETLIST: | ||
399 | aux = *(pc++) * LFIELDS_PER_FLUSH; goto setlist; | ||
400 | |||
392 | case SETLIST0: | 401 | case SETLIST0: |
393 | case SETLIST: { | 402 | aux = 0; |
394 | int m = (opcode == SETLIST0) ? 0 : *(pc++) * LFIELDS_PER_FLUSH; | 403 | setlist: { |
395 | int n = *(pc++); | 404 | int n = *(pc++); |
396 | TObject *arr = luaD_stack.top-n-1; | 405 | TObject *arr = luaD_stack.top-n-1; |
397 | for (; n; n--) { | 406 | for (; n; n--) { |
398 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 407 | ttype(luaD_stack.top) = LUA_T_NUMBER; |
399 | nvalue(luaD_stack.top) = n+m; | 408 | nvalue(luaD_stack.top) = n+aux; |
400 | *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); | 409 | *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); |
401 | luaD_stack.top--; | 410 | luaD_stack.top--; |
402 | } | 411 | } |
@@ -414,7 +423,12 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
414 | } | 423 | } |
415 | 424 | ||
416 | case POPS: | 425 | case POPS: |
417 | luaD_stack.top -= *(pc++); | 426 | aux = *pc++; goto pop; |
427 | |||
428 | case POP1: case POP2: | ||
429 | aux -= (POP1-1); | ||
430 | pop: | ||
431 | luaD_stack.top -= aux; | ||
418 | break; | 432 | break; |
419 | 433 | ||
420 | case ARGS: | 434 | case ARGS: |
@@ -436,7 +450,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
436 | case EQOP: case NEQOP: { | 450 | case EQOP: case NEQOP: { |
437 | int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); | 451 | int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); |
438 | luaD_stack.top--; | 452 | luaD_stack.top--; |
439 | if (opcode == NEQOP) res = !res; | 453 | if (aux == NEQOP) res = !res; |
440 | ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; | 454 | ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; |
441 | nvalue(luaD_stack.top-1) = 1; | 455 | nvalue(luaD_stack.top-1) = 1; |
442 | break; | 456 | break; |
@@ -578,6 +592,12 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
578 | break; | 592 | break; |
579 | 593 | ||
580 | case CLOSURE: | 594 | case CLOSURE: |
595 | aux = get_word(pc); goto closure; | ||
596 | |||
597 | case CLOSUREB: | ||
598 | aux = *pc++; | ||
599 | closure: | ||
600 | *luaD_stack.top++ = consts[aux]; | ||
581 | luaV_closure(); | 601 | luaV_closure(); |
582 | luaC_checkGC(); | 602 | luaC_checkGC(); |
583 | break; | 603 | break; |
@@ -594,7 +614,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
594 | case RETCODE: | 614 | case RETCODE: |
595 | if (lua_callhook) | 615 | if (lua_callhook) |
596 | luaD_callHook(base, LUA_T_MARK, 1); | 616 | luaD_callHook(base, LUA_T_MARK, 1); |
597 | return (base + ((opcode==RETCODE) ? *pc : 0)); | 617 | return (base + ((aux==RETCODE) ? *pc : 0)); |
598 | 618 | ||
599 | case SETLINE: { | 619 | case SETLINE: { |
600 | int line = get_word(pc); | 620 | int line = get_word(pc); |