summaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-01-16 20:03:57 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-01-16 20:03:57 -0200
commit7ab7703b53be3024a06334653b29dac338e55a01 (patch)
treebecc738e21f7d328cd21b73bb1b4da445d96aee6 /lvm.c
parent566310fa04621a6fb848efec5cd00b7c9c6575c8 (diff)
downloadlua-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.c60
1 files changed, 20 insertions, 40 deletions
diff --git a/lvm.c b/lvm.c
index b1dad7a8..b51ea0e0 100644
--- a/lvm.c
+++ b/lvm.c
@@ -64,7 +64,7 @@ int luaV_tostring (lua_State *L, TObject *obj) {
64static void traceexec (lua_State *L, lua_Hook linehook) { 64static 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
224void luaV_strconc (lua_State *L, int total, StkId top) { 224void 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: {