aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lvm.c204
1 files changed, 83 insertions, 121 deletions
diff --git a/lvm.c b/lvm.c
index de434e29..0339c6fc 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.117 2010/05/05 18:49:56 roberto Exp roberto $ 2** $Id: lvm.c,v 2.118 2010/05/12 20:31:33 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*/
@@ -436,11 +436,10 @@ void luaV_finishOp (lua_State *L) {
436 lua_Number nb = nvalue(rb), nc = nvalue(rc); \ 436 lua_Number nb = nvalue(rb), nc = nvalue(rc); \
437 setnvalue(ra, op(L, nb, nc)); \ 437 setnvalue(ra, op(L, nb, nc)); \
438 } \ 438 } \
439 else \ 439 else { Protect(luaV_arith(L, ra, rb, rc, tm)); } }
440 Protect(luaV_arith(L, ra, rb, rc, tm)); \
441 }
442 440
443 441
442#define vmcase(l,b) case l: {b} break;
444 443
445void luaV_execute (lua_State *L) { 444void luaV_execute (lua_State *L) {
446 CallInfo *ci = L->ci; 445 CallInfo *ci = L->ci;
@@ -466,57 +465,47 @@ void luaV_execute (lua_State *L) {
466 lua_assert(base == ci->u.l.base); 465 lua_assert(base == ci->u.l.base);
467 lua_assert(base <= L->top && L->top < L->stack + L->stacksize); 466 lua_assert(base <= L->top && L->top < L->stack + L->stacksize);
468 switch (GET_OPCODE(i)) { 467 switch (GET_OPCODE(i)) {
469 case OP_MOVE: { 468 vmcase(OP_MOVE,
470 setobjs2s(L, ra, RB(i)); 469 setobjs2s(L, ra, RB(i));
471 break; 470 )
472 } 471 vmcase(OP_LOADK,
473 case OP_LOADK: {
474 TValue *rb = KBx(i); 472 TValue *rb = KBx(i);
475 setobj2s(L, ra, rb); 473 setobj2s(L, ra, rb);
476 break; 474 )
477 } 475 vmcase(OP_LOADBOOL,
478 case OP_LOADBOOL: {
479 setbvalue(ra, GETARG_B(i)); 476 setbvalue(ra, GETARG_B(i));
480 if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */ 477 if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */
481 break; 478 )
482 } 479 vmcase(OP_LOADNIL,
483 case OP_LOADNIL: {
484 TValue *rb = RB(i); 480 TValue *rb = RB(i);
485 do { 481 do {
486 setnilvalue(rb--); 482 setnilvalue(rb--);
487 } while (rb >= ra); 483 } while (rb >= ra);
488 break; 484 )
489 } 485 vmcase(OP_GETUPVAL,
490 case OP_GETUPVAL: {
491 int b = GETARG_B(i); 486 int b = GETARG_B(i);
492 setobj2s(L, ra, cl->upvals[b]->v); 487 setobj2s(L, ra, cl->upvals[b]->v);
493 break; 488 )
494 } 489 vmcase(OP_GETTABUP,
495 case OP_GETTABUP: {
496 int b = GETARG_B(i); 490 int b = GETARG_B(i);
497 Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra)); 491 Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra));
498 break; 492 )
499 } 493 vmcase(OP_GETTABLE,
500 case OP_GETTABLE: {
501 Protect(luaV_gettable(L, RB(i), RKC(i), ra)); 494 Protect(luaV_gettable(L, RB(i), RKC(i), ra));
502 break; 495 )
503 } 496 vmcase(OP_SETTABUP,
504 case OP_SETTABUP: {
505 int a = GETARG_A(i); 497 int a = GETARG_A(i);
506 Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i))); 498 Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i)));
507 break; 499 )
508 } 500 vmcase(OP_SETUPVAL,
509 case OP_SETUPVAL: {
510 UpVal *uv = cl->upvals[GETARG_B(i)]; 501 UpVal *uv = cl->upvals[GETARG_B(i)];
511 setobj(L, uv->v, ra); 502 setobj(L, uv->v, ra);
512 luaC_barrier(L, uv, ra); 503 luaC_barrier(L, uv, ra);
513 break; 504 )
514 } 505 vmcase(OP_SETTABLE,
515 case OP_SETTABLE: {
516 Protect(luaV_settable(L, ra, RKB(i), RKC(i))); 506 Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
517 break; 507 )
518 } 508 vmcase(OP_NEWTABLE,
519 case OP_NEWTABLE: {
520 int b = GETARG_B(i); 509 int b = GETARG_B(i);
521 int c = GETARG_C(i); 510 int c = GETARG_C(i);
522 Table *t = luaH_new(L); 511 Table *t = luaH_new(L);
@@ -524,39 +513,31 @@ void luaV_execute (lua_State *L) {
524 if (b != 0 || c != 0) 513 if (b != 0 || c != 0)
525 luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c)); 514 luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c));
526 checkGC(L); 515 checkGC(L);
527 break; 516 )
528 } 517 vmcase(OP_SELF,
529 case OP_SELF: {
530 StkId rb = RB(i); 518 StkId rb = RB(i);
531 setobjs2s(L, ra+1, rb); 519 setobjs2s(L, ra+1, rb);
532 Protect(luaV_gettable(L, rb, RKC(i), ra)); 520 Protect(luaV_gettable(L, rb, RKC(i), ra));
533 break; 521 )
534 } 522 vmcase(OP_ADD,
535 case OP_ADD: {
536 arith_op(luai_numadd, TM_ADD); 523 arith_op(luai_numadd, TM_ADD);
537 break; 524 )
538 } 525 vmcase(OP_SUB,
539 case OP_SUB: {
540 arith_op(luai_numsub, TM_SUB); 526 arith_op(luai_numsub, TM_SUB);
541 break; 527 )
542 } 528 vmcase(OP_MUL,
543 case OP_MUL: {
544 arith_op(luai_nummul, TM_MUL); 529 arith_op(luai_nummul, TM_MUL);
545 break; 530 )
546 } 531 vmcase(OP_DIV,
547 case OP_DIV: {
548 arith_op(luai_numdiv, TM_DIV); 532 arith_op(luai_numdiv, TM_DIV);
549 break; 533 )
550 } 534 vmcase(OP_MOD,
551 case OP_MOD: {
552 arith_op(luai_nummod, TM_MOD); 535 arith_op(luai_nummod, TM_MOD);
553 break; 536 )
554 } 537 vmcase(OP_POW,
555 case OP_POW: {
556 arith_op(luai_numpow, TM_POW); 538 arith_op(luai_numpow, TM_POW);
557 break; 539 )
558 } 540 vmcase(OP_UNM,
559 case OP_UNM: {
560 TValue *rb = RB(i); 541 TValue *rb = RB(i);
561 if (ttisnumber(rb)) { 542 if (ttisnumber(rb)) {
562 lua_Number nb = nvalue(rb); 543 lua_Number nb = nvalue(rb);
@@ -565,31 +546,26 @@ void luaV_execute (lua_State *L) {
565 else { 546 else {
566 Protect(luaV_arith(L, ra, rb, rb, TM_UNM)); 547 Protect(luaV_arith(L, ra, rb, rb, TM_UNM));
567 } 548 }
568 break; 549 )
569 } 550 vmcase(OP_NOT,
570 case OP_NOT: {
571 int res = l_isfalse(RB(i)); /* next assignment may change this value */ 551 int res = l_isfalse(RB(i)); /* next assignment may change this value */
572 setbvalue(ra, res); 552 setbvalue(ra, res);
573 break; 553 )
574 } 554 vmcase(OP_LEN,
575 case OP_LEN: {
576 Protect(luaV_objlen(L, ra, RB(i))); 555 Protect(luaV_objlen(L, ra, RB(i)));
577 break; 556 )
578 } 557 vmcase(OP_CONCAT,
579 case OP_CONCAT: {
580 int b = GETARG_B(i); 558 int b = GETARG_B(i);
581 int c = GETARG_C(i); 559 int c = GETARG_C(i);
582 L->top = base + c + 1; /* mark the end of concat operands */ 560 L->top = base + c + 1; /* mark the end of concat operands */
583 Protect(luaV_concat(L, c-b+1); checkGC(L);) 561 Protect(luaV_concat(L, c-b+1); checkGC(L);)
584 L->top = ci->top; /* restore top */ 562 L->top = ci->top; /* restore top */
585 setobjs2s(L, RA(i), base+b); 563 setobjs2s(L, RA(i), base+b);
586 break; 564 )
587 } 565 vmcase(OP_JMP,
588 case OP_JMP: {
589 dojump(GETARG_sBx(i)); 566 dojump(GETARG_sBx(i));
590 break; 567 )
591 } 568 vmcase(OP_EQ,
592 case OP_EQ: {
593 TValue *rb = RKB(i); 569 TValue *rb = RKB(i);
594 TValue *rc = RKC(i); 570 TValue *rc = RKC(i);
595 Protect( 571 Protect(
@@ -597,40 +573,35 @@ void luaV_execute (lua_State *L) {
597 dojump(GETARG_sBx(*ci->u.l.savedpc)); 573 dojump(GETARG_sBx(*ci->u.l.savedpc));
598 ) 574 )
599 ci->u.l.savedpc++; 575 ci->u.l.savedpc++;
600 break; 576 )
601 } 577 vmcase(OP_LT,
602 case OP_LT: {
603 Protect( 578 Protect(
604 if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i)) 579 if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i))
605 dojump(GETARG_sBx(*ci->u.l.savedpc)); 580 dojump(GETARG_sBx(*ci->u.l.savedpc));
606 ) 581 )
607 ci->u.l.savedpc++; 582 ci->u.l.savedpc++;
608 break; 583 )
609 } 584 vmcase(OP_LE,
610 case OP_LE: {
611 Protect( 585 Protect(
612 if (luaV_lessequal(L, RKB(i), RKC(i)) == GETARG_A(i)) 586 if (luaV_lessequal(L, RKB(i), RKC(i)) == GETARG_A(i))
613 dojump(GETARG_sBx(*ci->u.l.savedpc)); 587 dojump(GETARG_sBx(*ci->u.l.savedpc));
614 ) 588 )
615 ci->u.l.savedpc++; 589 ci->u.l.savedpc++;
616 break; 590 )
617 } 591 vmcase(OP_TEST,
618 case OP_TEST: {
619 if (GETARG_C(i) ? !l_isfalse(ra) : l_isfalse(ra)) 592 if (GETARG_C(i) ? !l_isfalse(ra) : l_isfalse(ra))
620 dojump(GETARG_sBx(*ci->u.l.savedpc)); 593 dojump(GETARG_sBx(*ci->u.l.savedpc));
621 ci->u.l.savedpc++; 594 ci->u.l.savedpc++;
622 break; 595 )
623 } 596 vmcase(OP_TESTSET,
624 case OP_TESTSET: {
625 TValue *rb = RB(i); 597 TValue *rb = RB(i);
626 if (GETARG_C(i) ? !l_isfalse(rb) : l_isfalse(rb)) { 598 if (GETARG_C(i) ? !l_isfalse(rb) : l_isfalse(rb)) {
627 setobjs2s(L, ra, rb); 599 setobjs2s(L, ra, rb);
628 dojump(GETARG_sBx(*ci->u.l.savedpc)); 600 dojump(GETARG_sBx(*ci->u.l.savedpc));
629 } 601 }
630 ci->u.l.savedpc++; 602 ci->u.l.savedpc++;
631 break; 603 )
632 } 604 vmcase(OP_CALL,
633 case OP_CALL: {
634 int b = GETARG_B(i); 605 int b = GETARG_B(i);
635 int nresults = GETARG_C(i) - 1; 606 int nresults = GETARG_C(i) - 1;
636 if (b != 0) L->top = ra+b; /* else previous instruction set top */ 607 if (b != 0) L->top = ra+b; /* else previous instruction set top */
@@ -643,9 +614,8 @@ void luaV_execute (lua_State *L) {
643 ci->callstatus |= CIST_REENTRY; 614 ci->callstatus |= CIST_REENTRY;
644 goto newframe; /* restart luaV_execute over new Lua function */ 615 goto newframe; /* restart luaV_execute over new Lua function */
645 } 616 }
646 break; 617 )
647 } 618 vmcase(OP_TAILCALL,
648 case OP_TAILCALL: {
649 int b = GETARG_B(i); 619 int b = GETARG_B(i);
650 if (b != 0) L->top = ra+b; /* else previous instruction set top */ 620 if (b != 0) L->top = ra+b; /* else previous instruction set top */
651 lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); 621 lua_assert(GETARG_C(i) - 1 == LUA_MULTRET);
@@ -673,9 +643,8 @@ void luaV_execute (lua_State *L) {
673 lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize); 643 lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize);
674 goto newframe; /* restart luaV_execute over new Lua function */ 644 goto newframe; /* restart luaV_execute over new Lua function */
675 } 645 }
676 break; 646 )
677 } 647 vmcase(OP_RETURN,
678 case OP_RETURN: {
679 int b = GETARG_B(i); 648 int b = GETARG_B(i);
680 if (b != 0) L->top = ra+b-1; 649 if (b != 0) L->top = ra+b-1;
681 if (cl->p->sizep > 0) luaF_close(L, base); 650 if (cl->p->sizep > 0) luaF_close(L, base);
@@ -689,8 +658,8 @@ void luaV_execute (lua_State *L) {
689 lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL); 658 lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL);
690 goto newframe; /* restart luaV_execute over new Lua function */ 659 goto newframe; /* restart luaV_execute over new Lua function */
691 } 660 }
692 } 661 )
693 case OP_FORLOOP: { 662 vmcase(OP_FORLOOP,
694 lua_Number step = nvalue(ra+2); 663 lua_Number step = nvalue(ra+2);
695 lua_Number idx = luai_numadd(L, nvalue(ra), step); /* increment index */ 664 lua_Number idx = luai_numadd(L, nvalue(ra), step); /* increment index */
696 lua_Number limit = nvalue(ra+1); 665 lua_Number limit = nvalue(ra+1);
@@ -700,9 +669,8 @@ void luaV_execute (lua_State *L) {
700 setnvalue(ra, idx); /* update internal index... */ 669 setnvalue(ra, idx); /* update internal index... */
701 setnvalue(ra+3, idx); /* ...and external index */ 670 setnvalue(ra+3, idx); /* ...and external index */
702 } 671 }
703 break; 672 )
704 } 673 vmcase(OP_FORPREP,
705 case OP_FORPREP: {
706 const TValue *init = ra; 674 const TValue *init = ra;
707 const TValue *plimit = ra+1; 675 const TValue *plimit = ra+1;
708 const TValue *pstep = ra+2; 676 const TValue *pstep = ra+2;
@@ -714,9 +682,8 @@ void luaV_execute (lua_State *L) {
714 luaG_runerror(L, LUA_QL("for") " step must be a number"); 682 luaG_runerror(L, LUA_QL("for") " step must be a number");
715 setnvalue(ra, luai_numsub(L, nvalue(ra), nvalue(pstep))); 683 setnvalue(ra, luai_numsub(L, nvalue(ra), nvalue(pstep)));
716 dojump(GETARG_sBx(i)); 684 dojump(GETARG_sBx(i));
717 break; 685 )
718 } 686 vmcase(OP_TFORCALL,
719 case OP_TFORCALL: {
720 StkId cb = ra + 3; /* call base */ 687 StkId cb = ra + 3; /* call base */
721 setobjs2s(L, cb+2, ra+2); 688 setobjs2s(L, cb+2, ra+2);
722 setobjs2s(L, cb+1, ra+1); 689 setobjs2s(L, cb+1, ra+1);
@@ -728,16 +695,15 @@ void luaV_execute (lua_State *L) {
728 ra = RA(i); 695 ra = RA(i);
729 lua_assert(GET_OPCODE(i) == OP_TFORLOOP); 696 lua_assert(GET_OPCODE(i) == OP_TFORLOOP);
730 goto l_tforloop; 697 goto l_tforloop;
731 } 698 )
732 case OP_TFORLOOP: { 699 vmcase(OP_TFORLOOP,
733 l_tforloop: 700 l_tforloop:
734 if (!ttisnil(ra + 1)) { /* continue loop? */ 701 if (!ttisnil(ra + 1)) { /* continue loop? */
735 setobjs2s(L, ra, ra + 1); /* save control variable */ 702 setobjs2s(L, ra, ra + 1); /* save control variable */
736 dojump(GETARG_sBx(i)); /* jump back */ 703 dojump(GETARG_sBx(i)); /* jump back */
737 } 704 }
738 break; 705 )
739 } 706 vmcase(OP_SETLIST,
740 case OP_SETLIST: {
741 int n = GETARG_B(i); 707 int n = GETARG_B(i);
742 int c = GETARG_C(i); 708 int c = GETARG_C(i);
743 int last; 709 int last;
@@ -757,13 +723,11 @@ void luaV_execute (lua_State *L) {
757 luaC_barriert(L, h, val); 723 luaC_barriert(L, h, val);
758 } 724 }
759 L->top = ci->top; /* correct top (in case of previous open call) */ 725 L->top = ci->top; /* correct top (in case of previous open call) */
760 break; 726 )
761 } 727 vmcase(OP_CLOSE,
762 case OP_CLOSE: {
763 luaF_close(L, ra); 728 luaF_close(L, ra);
764 break; 729 )
765 } 730 vmcase(OP_CLOSURE,
766 case OP_CLOSURE: {
767 Proto *p = cl->p->p[GETARG_Bx(i)]; /* prototype for new closure */ 731 Proto *p = cl->p->p[GETARG_Bx(i)]; /* prototype for new closure */
768 int nup = p->sizeupvalues; 732 int nup = p->sizeupvalues;
769 Closure *ncl = luaF_newLclosure(L, nup); 733 Closure *ncl = luaF_newLclosure(L, nup);
@@ -778,9 +742,8 @@ void luaV_execute (lua_State *L) {
778 ncl->l.upvals[j] = cl->upvals[uv[j].idx]; 742 ncl->l.upvals[j] = cl->upvals[uv[j].idx];
779 } 743 }
780 checkGC(L); 744 checkGC(L);
781 break; 745 )
782 } 746 vmcase(OP_VARARG,
783 case OP_VARARG: {
784 int b = GETARG_B(i) - 1; 747 int b = GETARG_B(i) - 1;
785 int j; 748 int j;
786 int n = cast_int(base - ci->func) - cl->p->numparams - 1; 749 int n = cast_int(base - ci->func) - cl->p->numparams - 1;
@@ -798,11 +761,10 @@ void luaV_execute (lua_State *L) {
798 setnilvalue(ra + j); 761 setnilvalue(ra + j);
799 } 762 }
800 } 763 }
801 break; 764 )
802 } 765 vmcase(OP_EXTRAARG,
803 case OP_EXTRAARG: {
804 lua_assert(0); 766 lua_assert(0);
805 } 767 )
806 } 768 }
807 } 769 }
808} 770}