diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-02-04 14:36:16 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-02-04 14:36:16 -0200 |
commit | cbc58af26094ad6498c4160cf9710adc7883aa94 (patch) | |
tree | 8caa9f7162543ec4e224b2abbf038cb06d0f94ad /lvm.c | |
parent | 80001ab0eb3ad95f370796b26dacfdd7e9874877 (diff) | |
download | lua-cbc58af26094ad6498c4160cf9710adc7883aa94.tar.gz lua-cbc58af26094ad6498c4160cf9710adc7883aa94.tar.bz2 lua-cbc58af26094ad6498c4160cf9710adc7883aa94.zip |
new opcode for "long" arguments (3 bytes)
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 43 |
1 files changed, 24 insertions, 19 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.42 1999/02/02 17:57:49 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.43 1999/02/02 19:41:17 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 | */ |
@@ -328,6 +328,7 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) { | |||
328 | } | 328 | } |
329 | for (;;) { | 329 | for (;;) { |
330 | register int aux = 0; | 330 | register int aux = 0; |
331 | switchentry: | ||
331 | switch ((OpCode)*pc++) { | 332 | switch ((OpCode)*pc++) { |
332 | 333 | ||
333 | case ENDCODE: aux = 1; | 334 | case ENDCODE: aux = 1; |
@@ -348,14 +349,14 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) { | |||
348 | S->top -= (aux+1); | 349 | S->top -= (aux+1); |
349 | break; | 350 | break; |
350 | 351 | ||
351 | case PUSHNUMBERW: aux = highbyte(*pc++); | 352 | case PUSHNUMBERW: aux += highbyte(*pc++); |
352 | case PUSHNUMBER: aux += *pc++; | 353 | case PUSHNUMBER: aux += *pc++; |
353 | ttype(S->top) = LUA_T_NUMBER; | 354 | ttype(S->top) = LUA_T_NUMBER; |
354 | nvalue(S->top) = aux-NUMOFFSET; | 355 | nvalue(S->top) = aux-NUMOFFSET; |
355 | S->top++; | 356 | S->top++; |
356 | break; | 357 | break; |
357 | 358 | ||
358 | case PUSHCONSTANTW: aux = highbyte(*pc++); | 359 | case PUSHCONSTANTW: aux += highbyte(*pc++); |
359 | case PUSHCONSTANT: aux += *pc++; | 360 | case PUSHCONSTANT: aux += *pc++; |
360 | *S->top++ = consts[aux]; | 361 | *S->top++ = consts[aux]; |
361 | break; | 362 | break; |
@@ -368,22 +369,22 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) { | |||
368 | *S->top++ = *((S->stack+base) + aux); | 369 | *S->top++ = *((S->stack+base) + aux); |
369 | break; | 370 | break; |
370 | 371 | ||
371 | case GETGLOBALW: aux = highbyte(*pc++); | 372 | case GETGLOBALW: aux += highbyte(*pc++); |
372 | case GETGLOBAL: aux += *pc++; | 373 | case GETGLOBAL: aux += *pc++; |
373 | luaV_getglobal(tsvalue(&consts[aux])); | 374 | luaV_getglobal(tsvalue(&consts[aux])); |
374 | break; | 375 | break; |
375 | 376 | ||
376 | case GETTABLE: | 377 | case GETTABLE: |
377 | luaV_gettable(); | 378 | luaV_gettable(); |
378 | break; | 379 | break; |
379 | 380 | ||
380 | case GETDOTTEDW: aux = highbyte(*pc++); | 381 | case GETDOTTEDW: aux += highbyte(*pc++); |
381 | case GETDOTTED: aux += *pc++; | 382 | case GETDOTTED: aux += *pc++; |
382 | *S->top++ = consts[aux]; | 383 | *S->top++ = consts[aux]; |
383 | luaV_gettable(); | 384 | luaV_gettable(); |
384 | break; | 385 | break; |
385 | 386 | ||
386 | case PUSHSELFW: aux = highbyte(*pc++); | 387 | case PUSHSELFW: aux += highbyte(*pc++); |
387 | case PUSHSELF: aux += *pc++; { | 388 | case PUSHSELF: aux += *pc++; { |
388 | TObject receiver = *(S->top-1); | 389 | TObject receiver = *(S->top-1); |
389 | *S->top++ = consts[aux]; | 390 | *S->top++ = consts[aux]; |
@@ -392,7 +393,7 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) { | |||
392 | break; | 393 | break; |
393 | } | 394 | } |
394 | 395 | ||
395 | case CREATEARRAYW: aux = highbyte(*pc++); | 396 | case CREATEARRAYW: aux += highbyte(*pc++); |
396 | case CREATEARRAY: aux += *pc++; | 397 | case CREATEARRAY: aux += *pc++; |
397 | luaC_checkGC(); | 398 | luaC_checkGC(); |
398 | avalue(S->top) = luaH_new(aux); | 399 | avalue(S->top) = luaH_new(aux); |
@@ -408,12 +409,12 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) { | |||
408 | *((S->stack+base) + aux) = *(S->top-1); | 409 | *((S->stack+base) + aux) = *(S->top-1); |
409 | break; | 410 | break; |
410 | 411 | ||
411 | case SETGLOBALW: aux = highbyte(*pc++); | 412 | case SETGLOBALW: aux += highbyte(*pc++); |
412 | case SETGLOBAL: aux += *pc++; | 413 | case SETGLOBAL: aux += *pc++; |
413 | luaV_setglobal(tsvalue(&consts[aux])); | 414 | luaV_setglobal(tsvalue(&consts[aux])); |
414 | break; | 415 | break; |
415 | 416 | ||
416 | case SETGLOBALDUPW: aux = highbyte(*pc++); | 417 | case SETGLOBALDUPW: aux += highbyte(*pc++); |
417 | case SETGLOBALDUP: aux += *pc++; | 418 | case SETGLOBALDUP: aux += *pc++; |
418 | *S->top = *(S->top-1); | 419 | *S->top = *(S->top-1); |
419 | S->top++; | 420 | S->top++; |
@@ -435,7 +436,7 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) { | |||
435 | luaV_settable(S->top-3-(*pc++), 1); | 436 | luaV_settable(S->top-3-(*pc++), 1); |
436 | break; | 437 | break; |
437 | 438 | ||
438 | case SETLISTW: aux = highbyte(*pc++); | 439 | case SETLISTW: aux += highbyte(*pc++); |
439 | case SETLIST: aux += *pc++; { | 440 | case SETLIST: aux += *pc++; { |
440 | int n = *(pc++); | 441 | int n = *(pc++); |
441 | TObject *arr = S->top-n-1; | 442 | TObject *arr = S->top-n-1; |
@@ -561,34 +562,34 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) { | |||
561 | nvalue(S->top-1) = 1; | 562 | nvalue(S->top-1) = 1; |
562 | break; | 563 | break; |
563 | 564 | ||
564 | case ONTJMPW: aux = highbyte(*pc++); | 565 | case ONTJMPW: aux += highbyte(*pc++); |
565 | case ONTJMP: aux += *pc++; | 566 | case ONTJMP: aux += *pc++; |
566 | if (ttype(S->top-1) != LUA_T_NIL) pc += aux; | 567 | if (ttype(S->top-1) != LUA_T_NIL) pc += aux; |
567 | else S->top--; | 568 | else S->top--; |
568 | break; | 569 | break; |
569 | 570 | ||
570 | case ONFJMPW: aux = highbyte(*pc++); | 571 | case ONFJMPW: aux += highbyte(*pc++); |
571 | case ONFJMP: aux += *pc++; | 572 | case ONFJMP: aux += *pc++; |
572 | if (ttype(S->top-1) == LUA_T_NIL) pc += aux; | 573 | if (ttype(S->top-1) == LUA_T_NIL) pc += aux; |
573 | else S->top--; | 574 | else S->top--; |
574 | break; | 575 | break; |
575 | 576 | ||
576 | case JMPW: aux = highbyte(*pc++); | 577 | case JMPW: aux += highbyte(*pc++); |
577 | case JMP: aux += *pc++; | 578 | case JMP: aux += *pc++; |
578 | pc += aux; | 579 | pc += aux; |
579 | break; | 580 | break; |
580 | 581 | ||
581 | case IFFJMPW: aux = highbyte(*pc++); | 582 | case IFFJMPW: aux += highbyte(*pc++); |
582 | case IFFJMP: aux += *pc++; | 583 | case IFFJMP: aux += *pc++; |
583 | if (ttype(--S->top) == LUA_T_NIL) pc += aux; | 584 | if (ttype(--S->top) == LUA_T_NIL) pc += aux; |
584 | break; | 585 | break; |
585 | 586 | ||
586 | case IFTUPJMPW: aux = highbyte(*pc++); | 587 | case IFTUPJMPW: aux += highbyte(*pc++); |
587 | case IFTUPJMP: aux += *pc++; | 588 | case IFTUPJMP: aux += *pc++; |
588 | if (ttype(--S->top) != LUA_T_NIL) pc -= aux; | 589 | if (ttype(--S->top) != LUA_T_NIL) pc -= aux; |
589 | break; | 590 | break; |
590 | 591 | ||
591 | case IFFUPJMPW: aux = highbyte(*pc++); | 592 | case IFFUPJMPW: aux += highbyte(*pc++); |
592 | case IFFUPJMP: aux += *pc++; | 593 | case IFFUPJMP: aux += *pc++; |
593 | if (ttype(--S->top) == LUA_T_NIL) pc -= aux; | 594 | if (ttype(--S->top) == LUA_T_NIL) pc -= aux; |
594 | break; | 595 | break; |
@@ -605,7 +606,7 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) { | |||
605 | break; | 606 | break; |
606 | } | 607 | } |
607 | 608 | ||
608 | case SETLINEW: aux = highbyte(*pc++); | 609 | case SETLINEW: aux += highbyte(*pc++); |
609 | case SETLINE: aux += *pc++; | 610 | case SETLINE: aux += *pc++; |
610 | if ((S->stack+base-1)->ttype != LUA_T_LINE) { | 611 | if ((S->stack+base-1)->ttype != LUA_T_LINE) { |
611 | /* open space for LINE value */ | 612 | /* open space for LINE value */ |
@@ -618,6 +619,10 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) { | |||
618 | luaD_lineHook(aux); | 619 | luaD_lineHook(aux); |
619 | break; | 620 | break; |
620 | 621 | ||
622 | case LONGARG: | ||
623 | aux = highbyte(highbyte(*pc++)); | ||
624 | goto switchentry; /* do not reset "aux" */ | ||
625 | |||
621 | } | 626 | } |
622 | } | 627 | } |
623 | } | 628 | } |