aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c54
1 files changed, 22 insertions, 32 deletions
diff --git a/lvm.c b/lvm.c
index fe30a27f..b0184b46 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.251 2002/08/07 19:22:39 roberto Exp roberto $ 2** $Id: lvm.c,v 1.252 2002/08/12 17:23:12 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*/
@@ -318,7 +318,8 @@ void luaV_concat (lua_State *L, int total, int last) {
318} 318}
319 319
320 320
321static void Arith (lua_State *L, StkId ra, StkId rb, StkId rc, TMS op) { 321static void Arith (lua_State *L, StkId ra,
322 const TObject *rb, const TObject *rc, TMS op) {
322 TObject tempb, tempc; 323 TObject tempb, tempc;
323 const TObject *b, *c; 324 const TObject *b, *c;
324 if ((b = luaV_tonumber(rb, &tempb)) != NULL && 325 if ((b = luaV_tonumber(rb, &tempb)) != NULL &&
@@ -356,10 +357,9 @@ static void Arith (lua_State *L, StkId ra, StkId rb, StkId rc, TMS op) {
356 357
357#define RA(i) (base+GETARG_A(i)) 358#define RA(i) (base+GETARG_A(i))
358#define RB(i) (base+GETARG_B(i)) 359#define RB(i) (base+GETARG_B(i))
360#define RKB(i) ((GETARG_B(i) < MAXSTACK) ? RB(i) : k+GETARG_B(i)-MAXSTACK)
359#define RC(i) (base+GETARG_C(i)) 361#define RC(i) (base+GETARG_C(i))
360#define RKC(i) ((GETARG_C(i) < MAXSTACK) ? \ 362#define RKC(i) ((GETARG_C(i) < MAXSTACK) ? RC(i) : k+GETARG_C(i)-MAXSTACK)
361 base+GETARG_C(i) : \
362 k+GETARG_C(i)-MAXSTACK)
363#define KBx(i) (k+GETARG_Bx(i)) 363#define KBx(i) (k+GETARG_Bx(i))
364 364
365 365
@@ -423,7 +423,7 @@ StkId luaV_execute (lua_State *L) {
423 break; 423 break;
424 } 424 }
425 case OP_GETGLOBAL: { 425 case OP_GETGLOBAL: {
426 StkId rb = KBx(i); 426 TObject *rb = KBx(i);
427 const TObject *v; 427 const TObject *v;
428 lua_assert(ttisstring(rb) && ttistable(&cl->g)); 428 lua_assert(ttisstring(rb) && ttistable(&cl->g));
429 v = luaH_getstr(hvalue(&cl->g), tsvalue(rb)); 429 v = luaH_getstr(hvalue(&cl->g), tsvalue(rb));
@@ -456,7 +456,7 @@ StkId luaV_execute (lua_State *L) {
456 break; 456 break;
457 } 457 }
458 case OP_SETTABLE: { 458 case OP_SETTABLE: {
459 luaV_settable(L, RB(i), RKC(i), ra); 459 luaV_settable(L, ra, RKB(i), RKC(i));
460 break; 460 break;
461 } 461 }
462 case OP_NEWTABLE: { 462 case OP_NEWTABLE: {
@@ -482,8 +482,8 @@ StkId luaV_execute (lua_State *L) {
482 break; 482 break;
483 } 483 }
484 case OP_ADD: { 484 case OP_ADD: {
485 StkId rb = RB(i); 485 TObject *rb = RKB(i);
486 StkId rc = RKC(i); 486 TObject *rc = RKC(i);
487 if (ttisnumber(rb) && ttisnumber(rc)) { 487 if (ttisnumber(rb) && ttisnumber(rc)) {
488 setnvalue(ra, nvalue(rb) + nvalue(rc)); 488 setnvalue(ra, nvalue(rb) + nvalue(rc));
489 } 489 }
@@ -492,8 +492,8 @@ StkId luaV_execute (lua_State *L) {
492 break; 492 break;
493 } 493 }
494 case OP_SUB: { 494 case OP_SUB: {
495 StkId rb = RB(i); 495 TObject *rb = RKB(i);
496 StkId rc = RKC(i); 496 TObject *rc = RKC(i);
497 if (ttisnumber(rb) && ttisnumber(rc)) { 497 if (ttisnumber(rb) && ttisnumber(rc)) {
498 setnvalue(ra, nvalue(rb) - nvalue(rc)); 498 setnvalue(ra, nvalue(rb) - nvalue(rc));
499 } 499 }
@@ -502,8 +502,8 @@ StkId luaV_execute (lua_State *L) {
502 break; 502 break;
503 } 503 }
504 case OP_MUL: { 504 case OP_MUL: {
505 StkId rb = RB(i); 505 TObject *rb = RKB(i);
506 StkId rc = RKC(i); 506 TObject *rc = RKC(i);
507 if (ttisnumber(rb) && ttisnumber(rc)) { 507 if (ttisnumber(rb) && ttisnumber(rc)) {
508 setnvalue(ra, nvalue(rb) * nvalue(rc)); 508 setnvalue(ra, nvalue(rb) * nvalue(rc));
509 } 509 }
@@ -512,8 +512,8 @@ StkId luaV_execute (lua_State *L) {
512 break; 512 break;
513 } 513 }
514 case OP_DIV: { 514 case OP_DIV: {
515 StkId rb = RB(i); 515 TObject *rb = RKB(i);
516 StkId rc = RKC(i); 516 TObject *rc = RKC(i);
517 if (ttisnumber(rb) && ttisnumber(rc)) { 517 if (ttisnumber(rb) && ttisnumber(rc)) {
518 setnvalue(ra, nvalue(rb) / nvalue(rc)); 518 setnvalue(ra, nvalue(rb) / nvalue(rc));
519 } 519 }
@@ -522,7 +522,7 @@ StkId luaV_execute (lua_State *L) {
522 break; 522 break;
523 } 523 }
524 case OP_POW: { 524 case OP_POW: {
525 Arith(L, ra, RB(i), RKC(i), TM_POW); 525 Arith(L, ra, RKB(i), RKC(i), TM_POW);
526 break; 526 break;
527 } 527 }
528 case OP_UNM: { 528 case OP_UNM: {
@@ -556,35 +556,25 @@ StkId luaV_execute (lua_State *L) {
556 break; 556 break;
557 } 557 }
558 case OP_EQ: { /* skip next instruction if test fails */ 558 case OP_EQ: { /* skip next instruction if test fails */
559 if (equalobj(L, ra, RKC(i)) != GETARG_B(i)) pc++; 559 if (equalobj(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++;
560 else dojump(pc, GETARG_sBx(*pc) + 1); 560 else dojump(pc, GETARG_sBx(*pc) + 1);
561 break; 561 break;
562 } 562 }
563 case OP_LT: { 563 case OP_LT: {
564 if (luaV_lessthan(L, ra, RKC(i)) != GETARG_B(i)) pc++; 564 if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++;
565 else dojump(pc, GETARG_sBx(*pc) + 1); 565 else dojump(pc, GETARG_sBx(*pc) + 1);
566 break; 566 break;
567 } 567 }
568 case OP_LE: { 568 case OP_LE: {
569 if (luaV_lessequal(L, ra, RKC(i)) != GETARG_B(i)) pc++; 569 if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++;
570 else dojump(pc, GETARG_sBx(*pc) + 1);
571 break;
572 }
573 case OP_GT: {
574 if (luaV_lessthan(L, RKC(i), ra) != GETARG_B(i)) pc++;
575 else dojump(pc, GETARG_sBx(*pc) + 1);
576 break;
577 }
578 case OP_GE: {
579 if (luaV_lessequal(L, RKC(i), ra) != GETARG_B(i)) pc++;
580 else dojump(pc, GETARG_sBx(*pc) + 1); 570 else dojump(pc, GETARG_sBx(*pc) + 1);
581 break; 571 break;
582 } 572 }
583 case OP_TEST: { 573 case OP_TEST: {
584 StkId rc = RKC(i); 574 TObject *rb = RB(i);
585 if (l_isfalse(rc) == GETARG_B(i)) pc++; 575 if (l_isfalse(rb) == GETARG_C(i)) pc++;
586 else { 576 else {
587 setobj(ra, rc); 577 setobj(ra, rb);
588 dojump(pc, GETARG_sBx(*pc) + 1); 578 dojump(pc, GETARG_sBx(*pc) + 1);
589 } 579 }
590 break; 580 break;