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: { |