diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-03-09 10:57:37 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-03-09 10:57:37 -0300 |
commit | e3cf93ddb677fe9482563a5687d3bf3e05ca0407 (patch) | |
tree | c692a19e5597c785c198d558a07dd0571f3fa98c /lvm.c | |
parent | 88b306f495fa7034c708c6b75a355a6deee51c58 (diff) | |
download | lua-e3cf93ddb677fe9482563a5687d3bf3e05ca0407.tar.gz lua-e3cf93ddb677fe9482563a5687d3bf3e05ca0407.tar.bz2 lua-e3cf93ddb677fe9482563a5687d3bf3e05ca0407.zip |
first implementation of "threaded code" for boolean operations
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 77 |
1 files changed, 41 insertions, 36 deletions
@@ -478,36 +478,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf, | |||
478 | break; | 478 | break; |
479 | } | 479 | } |
480 | 480 | ||
481 | case NEQOP: | ||
482 | top--; | ||
483 | setbool(top-1, !luaO_equalObj(top-1, top)); | ||
484 | break; | ||
485 | |||
486 | case EQOP: | ||
487 | top--; | ||
488 | setbool(top-1, luaO_equalObj(top-1, top)); | ||
489 | break; | ||
490 | |||
491 | case LTOP: | ||
492 | top--; | ||
493 | setbool(top-1, luaV_lessthan(L, top-1, top, top+1)); | ||
494 | break; | ||
495 | |||
496 | case LEOP: /* a <= b === !(b<a) */ | ||
497 | top--; | ||
498 | setbool(top-1, !luaV_lessthan(L, top, top-1, top+1)); | ||
499 | break; | ||
500 | |||
501 | case GTOP: /* a > b === (b<a) */ | ||
502 | top--; | ||
503 | setbool(top-1, luaV_lessthan(L, top, top-1, top+1)); | ||
504 | break; | ||
505 | |||
506 | case GEOP: /* a >= b === !(a<b) */ | ||
507 | top--; | ||
508 | setbool(top-1, !luaV_lessthan(L, top-1, top, top+1)); | ||
509 | break; | ||
510 | |||
511 | case ADDOP: | 481 | case ADDOP: |
512 | if (tonumber(top-1) || tonumber(top-2)) | 482 | if (tonumber(top-1) || tonumber(top-2)) |
513 | call_arith(L, top, IM_ADD); | 483 | call_arith(L, top, IM_ADD); |
@@ -579,6 +549,44 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf, | |||
579 | nvalue(top-1) = 1; | 549 | nvalue(top-1) = 1; |
580 | break; | 550 | break; |
581 | 551 | ||
552 | case IFNEQJMP: | ||
553 | top -= 2; | ||
554 | if (!luaO_equalObj(top, top+1)) pc += GETARG_S(i); | ||
555 | break; | ||
556 | |||
557 | case IFEQJMP: | ||
558 | top -= 2; | ||
559 | if (luaO_equalObj(top, top+1)) pc += GETARG_S(i); | ||
560 | break; | ||
561 | |||
562 | case IFLTJMP: | ||
563 | top -= 2; | ||
564 | if (luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); | ||
565 | break; | ||
566 | |||
567 | case IFLEJMP: /* a <= b === !(b<a) */ | ||
568 | top -= 2; | ||
569 | if (!luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); | ||
570 | break; | ||
571 | |||
572 | case IFGTJMP: /* a > b === (b<a) */ | ||
573 | top -= 2; | ||
574 | if (luaV_lessthan(L, top+1, top, top+2)) pc += GETARG_S(i); | ||
575 | break; | ||
576 | |||
577 | case IFGEJMP: /* a >= b === !(a<b) */ | ||
578 | top -= 2; | ||
579 | if (!luaV_lessthan(L, top, top+1, top+2)) pc += GETARG_S(i); | ||
580 | break; | ||
581 | |||
582 | case IFTJMP: | ||
583 | if (ttype(--top) != LUA_T_NIL) pc += GETARG_S(i); | ||
584 | break; | ||
585 | |||
586 | case IFFJMP: | ||
587 | if (ttype(--top) == LUA_T_NIL) pc += GETARG_S(i); | ||
588 | break; | ||
589 | |||
582 | case ONTJMP: | 590 | case ONTJMP: |
583 | if (ttype(top-1) != LUA_T_NIL) pc += GETARG_S(i); | 591 | if (ttype(top-1) != LUA_T_NIL) pc += GETARG_S(i); |
584 | else top--; | 592 | else top--; |
@@ -593,12 +601,9 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf, | |||
593 | pc += GETARG_S(i); | 601 | pc += GETARG_S(i); |
594 | break; | 602 | break; |
595 | 603 | ||
596 | case IFTJMP: | 604 | case PUSHNILJMP: |
597 | if (ttype(--top) != LUA_T_NIL) pc += GETARG_S(i); | 605 | ttype(top++) = LUA_T_NIL; |
598 | break; | 606 | pc++; |
599 | |||
600 | case IFFJMP: | ||
601 | if (ttype(--top) == LUA_T_NIL) pc += GETARG_S(i); | ||
602 | break; | 607 | break; |
603 | 608 | ||
604 | case CLOSURE: | 609 | case CLOSURE: |