diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-01-16 20:03:57 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-01-16 20:03:57 -0200 |
| commit | 7ab7703b53be3024a06334653b29dac338e55a01 (patch) | |
| tree | becc738e21f7d328cd21b73bb1b4da445d96aee6 /lvm.c | |
| parent | 566310fa04621a6fb848efec5cd00b7c9c6575c8 (diff) | |
| download | lua-7ab7703b53be3024a06334653b29dac338e55a01.tar.gz lua-7ab7703b53be3024a06334653b29dac338e55a01.tar.bz2 lua-7ab7703b53be3024a06334653b29dac338e55a01.zip | |
cleaner semantics for test instructions (skips)
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 60 |
1 files changed, 20 insertions, 40 deletions
| @@ -64,7 +64,7 @@ int luaV_tostring (lua_State *L, TObject *obj) { | |||
| 64 | static void traceexec (lua_State *L, lua_Hook linehook) { | 64 | static void traceexec (lua_State *L, lua_Hook linehook) { |
| 65 | CallInfo *ci = L->ci; | 65 | CallInfo *ci = L->ci; |
| 66 | int *lineinfo = ci_func(ci)->l.p->lineinfo; | 66 | int *lineinfo = ci_func(ci)->l.p->lineinfo; |
| 67 | int pc = (int)(*ci->pc - ci_func(ci)->l.p->code) - 1; | 67 | int pc = cast(int, *ci->pc - ci_func(ci)->l.p->code) - 1; |
| 68 | int newline; | 68 | int newline; |
| 69 | if (pc == 0) { /* may be first time? */ | 69 | if (pc == 0) { /* may be first time? */ |
| 70 | ci->line = 1; | 70 | ci->line = 1; |
| @@ -221,9 +221,10 @@ int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r) { | |||
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | 223 | ||
| 224 | void luaV_strconc (lua_State *L, int total, StkId top) { | 224 | void luaV_strconc (lua_State *L, int total, int last) { |
| 225 | luaV_checkGC(L, top); | 225 | luaV_checkGC(L, L->ci->base + last + 1); |
| 226 | do { | 226 | do { |
| 227 | StkId top = L->ci->base + last + 1; | ||
| 227 | int n = 2; /* number of elements handled in this pass (at least 2) */ | 228 | int n = 2; /* number of elements handled in this pass (at least 2) */ |
| 228 | if (tostring(L, top-2) || tostring(L, top-1)) { | 229 | if (tostring(L, top-2) || tostring(L, top-1)) { |
| 229 | if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) | 230 | if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) |
| @@ -249,7 +250,7 @@ void luaV_strconc (lua_State *L, int total, StkId top) { | |||
| 249 | setsvalue(top-n, luaS_newlstr(L, buffer, tl)); | 250 | setsvalue(top-n, luaS_newlstr(L, buffer, tl)); |
| 250 | } | 251 | } |
| 251 | total -= n-1; /* got `n' strings to create 1 new */ | 252 | total -= n-1; /* got `n' strings to create 1 new */ |
| 252 | top -= n-1; | 253 | last -= n-1; |
| 253 | } while (total > 1); /* repeat until only 1 result left */ | 254 | } while (total > 1); /* repeat until only 1 result left */ |
| 254 | } | 255 | } |
| 255 | 256 | ||
| @@ -431,71 +432,50 @@ StkId luaV_execute (lua_State *L) { | |||
| 431 | break; | 432 | break; |
| 432 | } | 433 | } |
| 433 | case OP_CONCAT: { | 434 | case OP_CONCAT: { |
| 434 | StkId top = RC(i)+1; | 435 | int b = GETARG_B(i); |
| 435 | StkId rb = RB(i); | 436 | int c = GETARG_C(i); |
| 436 | luaV_strconc(L, top-rb, top); | 437 | luaV_strconc(L, c-b+1, c); |
| 437 | setobj(ra, rb); | 438 | setobj(ra, base+b); |
| 438 | break; | 439 | break; |
| 439 | } | 440 | } |
| 440 | case OP_CJMP: | ||
| 441 | case OP_JMP: { | 441 | case OP_JMP: { |
| 442 | dojump(pc, i); | 442 | dojump(pc, i); |
| 443 | break; | 443 | break; |
| 444 | } | 444 | } |
| 445 | case OP_TESTEQ: { | 445 | case OP_TESTEQ: { /* skip next instruction if test fails */ |
| 446 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 446 | if (!luaO_equalObj(ra, RKC(i))) pc++; |
| 447 | if (luaO_equalObj(ra, RKC(i))) dojump(pc, *pc); | ||
| 448 | pc++; | ||
| 449 | break; | 447 | break; |
| 450 | } | 448 | } |
| 451 | case OP_TESTNE: { | 449 | case OP_TESTNE: { |
| 452 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 450 | if (luaO_equalObj(ra, RKC(i))) pc++; |
| 453 | if (!luaO_equalObj(ra, RKC(i))) dojump(pc, *pc); | ||
| 454 | pc++; | ||
| 455 | break; | 451 | break; |
| 456 | } | 452 | } |
| 457 | case OP_TESTLT: { | 453 | case OP_TESTLT: { |
| 458 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 454 | if (!luaV_lessthan(L, ra, RKC(i))) pc++; |
| 459 | if (luaV_lessthan(L, ra, RKC(i))) dojump(pc, *pc); | ||
| 460 | pc++; | ||
| 461 | break; | 455 | break; |
| 462 | } | 456 | } |
| 463 | case OP_TESTLE: { /* b <= c === !(c<b) */ | 457 | case OP_TESTLE: { /* b <= c === !(c<b) */ |
| 464 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 458 | if (luaV_lessthan(L, RKC(i), ra)) pc++; |
| 465 | if (!luaV_lessthan(L, RKC(i), ra)) dojump(pc, *pc); | ||
| 466 | pc++; | ||
| 467 | break; | 459 | break; |
| 468 | } | 460 | } |
| 469 | case OP_TESTGT: { /* b > c === (c<b) */ | 461 | case OP_TESTGT: { /* b > c === (c<b) */ |
| 470 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 462 | if (!luaV_lessthan(L, RKC(i), ra)) pc++; |
| 471 | if (luaV_lessthan(L, RKC(i), ra)) dojump(pc, *pc); | ||
| 472 | pc++; | ||
| 473 | break; | 463 | break; |
| 474 | } | 464 | } |
| 475 | case OP_TESTGE: { /* b >= c === !(b<c) */ | 465 | case OP_TESTGE: { /* b >= c === !(b<c) */ |
| 476 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 466 | if (luaV_lessthan(L, ra, RKC(i))) pc++; |
| 477 | if (!luaV_lessthan(L, ra, RKC(i))) dojump(pc, *pc); | ||
| 478 | pc++; | ||
| 479 | break; | 467 | break; |
| 480 | } | 468 | } |
| 481 | case OP_TESTT: { | 469 | case OP_TESTT: { |
| 482 | StkId rb = RB(i); | 470 | StkId rb = RB(i); |
| 483 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 471 | if (l_isfalse(rb)) pc++; |
| 484 | if (!l_isfalse(rb)) { | 472 | else setobj(ra, rb); |
| 485 | setobj(ra, rb); | ||
| 486 | dojump(pc, *pc); | ||
| 487 | } | ||
| 488 | pc++; | ||
| 489 | break; | 473 | break; |
| 490 | } | 474 | } |
| 491 | case OP_TESTF: { | 475 | case OP_TESTF: { |
| 492 | StkId rb = RB(i); | 476 | StkId rb = RB(i); |
| 493 | lua_assert(GET_OPCODE(*pc) == OP_CJMP); | 477 | if (!l_isfalse(rb)) pc++; |
| 494 | if (l_isfalse(rb)) { | 478 | else setobj(ra, rb); |
| 495 | setobj(ra, rb); | ||
| 496 | dojump(pc, *pc); | ||
| 497 | } | ||
| 498 | pc++; | ||
| 499 | break; | 479 | break; |
| 500 | } | 480 | } |
| 501 | case OP_CALL: { | 481 | case OP_CALL: { |
