diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-02-27 18:16:24 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-02-27 18:16:24 -0300 |
commit | 347f0c33d1911cb36f310131e55ad85aee23d44c (patch) | |
tree | a9ae94e4e6f62b22bbc6709523364f5e46c0abbc /lvm.c | |
parent | 622e44871069697b5591235c0362c0977db8c3ea (diff) | |
download | lua-347f0c33d1911cb36f310131e55ad85aee23d44c.tar.gz lua-347f0c33d1911cb36f310131e55ad85aee23d44c.tar.bz2 lua-347f0c33d1911cb36f310131e55ad85aee23d44c.zip |
avoid 'continue' unless necessary
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 102 |
1 files changed, 51 insertions, 51 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 2.103 2010/01/15 16:23:58 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.104 2010/02/26 20:40:29 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 | */ |
@@ -448,10 +448,15 @@ void luaV_finishOp (lua_State *L) { | |||
448 | 448 | ||
449 | void luaV_execute (lua_State *L) { | 449 | void luaV_execute (lua_State *L) { |
450 | CallInfo *ci = L->ci; | 450 | CallInfo *ci = L->ci; |
451 | LClosure *cl = &clvalue(ci->func)->l; | 451 | LClosure *cl; |
452 | TValue *k = cl->p->k; | 452 | TValue *k; |
453 | StkId base = ci->u.l.base; | 453 | StkId base; |
454 | newframe: /* reentry point when frame changes (call/return) */ | ||
454 | lua_assert(isLua(ci)); | 455 | lua_assert(isLua(ci)); |
456 | lua_assert(ci == L->ci); | ||
457 | cl = &clvalue(ci->func)->l; | ||
458 | k = cl->p->k; | ||
459 | base = ci->u.l.base; | ||
455 | /* main loop of interpreter */ | 460 | /* main loop of interpreter */ |
456 | for (;;) { | 461 | for (;;) { |
457 | Instruction i = *(ci->u.l.savedpc++); | 462 | Instruction i = *(ci->u.l.savedpc++); |
@@ -472,29 +477,29 @@ void luaV_execute (lua_State *L) { | |||
472 | switch (GET_OPCODE(i)) { | 477 | switch (GET_OPCODE(i)) { |
473 | case OP_MOVE: { | 478 | case OP_MOVE: { |
474 | setobjs2s(L, ra, RB(i)); | 479 | setobjs2s(L, ra, RB(i)); |
475 | continue; | 480 | break; |
476 | } | 481 | } |
477 | case OP_LOADK: { | 482 | case OP_LOADK: { |
478 | TValue *rb = KBx(i); | 483 | TValue *rb = KBx(i); |
479 | setobj2s(L, ra, rb); | 484 | setobj2s(L, ra, rb); |
480 | continue; | 485 | break; |
481 | } | 486 | } |
482 | case OP_LOADBOOL: { | 487 | case OP_LOADBOOL: { |
483 | setbvalue(ra, GETARG_B(i)); | 488 | setbvalue(ra, GETARG_B(i)); |
484 | if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */ | 489 | if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */ |
485 | continue; | 490 | break; |
486 | } | 491 | } |
487 | case OP_LOADNIL: { | 492 | case OP_LOADNIL: { |
488 | TValue *rb = RB(i); | 493 | TValue *rb = RB(i); |
489 | do { | 494 | do { |
490 | setnilvalue(rb--); | 495 | setnilvalue(rb--); |
491 | } while (rb >= ra); | 496 | } while (rb >= ra); |
492 | continue; | 497 | break; |
493 | } | 498 | } |
494 | case OP_GETUPVAL: { | 499 | case OP_GETUPVAL: { |
495 | int b = GETARG_B(i); | 500 | int b = GETARG_B(i); |
496 | setobj2s(L, ra, cl->upvals[b]->v); | 501 | setobj2s(L, ra, cl->upvals[b]->v); |
497 | continue; | 502 | break; |
498 | } | 503 | } |
499 | case OP_GETGLOBAL: { | 504 | case OP_GETGLOBAL: { |
500 | TValue g; | 505 | TValue g; |
@@ -502,16 +507,16 @@ void luaV_execute (lua_State *L) { | |||
502 | sethvalue(L, &g, cl->env); | 507 | sethvalue(L, &g, cl->env); |
503 | lua_assert(ttisstring(rb)); | 508 | lua_assert(ttisstring(rb)); |
504 | Protect(luaV_gettable(L, &g, rb, ra)); | 509 | Protect(luaV_gettable(L, &g, rb, ra)); |
505 | continue; | 510 | break; |
506 | } | 511 | } |
507 | case OP_GETTABUP: { | 512 | case OP_GETTABUP: { |
508 | int b = GETARG_B(i); | 513 | int b = GETARG_B(i); |
509 | Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra)); | 514 | Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra)); |
510 | continue; | 515 | break; |
511 | } | 516 | } |
512 | case OP_GETTABLE: { | 517 | case OP_GETTABLE: { |
513 | Protect(luaV_gettable(L, RB(i), RKC(i), ra)); | 518 | Protect(luaV_gettable(L, RB(i), RKC(i), ra)); |
514 | continue; | 519 | break; |
515 | } | 520 | } |
516 | case OP_SETGLOBAL: { | 521 | case OP_SETGLOBAL: { |
517 | TValue g; | 522 | TValue g; |
@@ -519,22 +524,22 @@ void luaV_execute (lua_State *L) { | |||
519 | sethvalue(L, &g, cl->env); | 524 | sethvalue(L, &g, cl->env); |
520 | lua_assert(ttisstring(rb)); | 525 | lua_assert(ttisstring(rb)); |
521 | Protect(luaV_settable(L, &g, rb, ra)); | 526 | Protect(luaV_settable(L, &g, rb, ra)); |
522 | continue; | 527 | break; |
523 | } | 528 | } |
524 | case OP_SETTABUP: { | 529 | case OP_SETTABUP: { |
525 | int a = GETARG_A(i); | 530 | int a = GETARG_A(i); |
526 | Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i))); | 531 | Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i))); |
527 | continue; | 532 | break; |
528 | } | 533 | } |
529 | case OP_SETUPVAL: { | 534 | case OP_SETUPVAL: { |
530 | UpVal *uv = cl->upvals[GETARG_B(i)]; | 535 | UpVal *uv = cl->upvals[GETARG_B(i)]; |
531 | setobj(L, uv->v, ra); | 536 | setobj(L, uv->v, ra); |
532 | luaC_barrier(L, uv, ra); | 537 | luaC_barrier(L, uv, ra); |
533 | continue; | 538 | break; |
534 | } | 539 | } |
535 | case OP_SETTABLE: { | 540 | case OP_SETTABLE: { |
536 | Protect(luaV_settable(L, ra, RKB(i), RKC(i))); | 541 | Protect(luaV_settable(L, ra, RKB(i), RKC(i))); |
537 | continue; | 542 | break; |
538 | } | 543 | } |
539 | case OP_NEWTABLE: { | 544 | case OP_NEWTABLE: { |
540 | int b = GETARG_B(i); | 545 | int b = GETARG_B(i); |
@@ -544,37 +549,37 @@ void luaV_execute (lua_State *L) { | |||
544 | if (b != 0 || c != 0) | 549 | if (b != 0 || c != 0) |
545 | luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c)); | 550 | luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c)); |
546 | Protect(luaC_checkGC(L)); | 551 | Protect(luaC_checkGC(L)); |
547 | continue; | 552 | break; |
548 | } | 553 | } |
549 | case OP_SELF: { | 554 | case OP_SELF: { |
550 | StkId rb = RB(i); | 555 | StkId rb = RB(i); |
551 | setobjs2s(L, ra+1, rb); | 556 | setobjs2s(L, ra+1, rb); |
552 | Protect(luaV_gettable(L, rb, RKC(i), ra)); | 557 | Protect(luaV_gettable(L, rb, RKC(i), ra)); |
553 | continue; | 558 | break; |
554 | } | 559 | } |
555 | case OP_ADD: { | 560 | case OP_ADD: { |
556 | arith_op(luai_numadd, TM_ADD); | 561 | arith_op(luai_numadd, TM_ADD); |
557 | continue; | 562 | break; |
558 | } | 563 | } |
559 | case OP_SUB: { | 564 | case OP_SUB: { |
560 | arith_op(luai_numsub, TM_SUB); | 565 | arith_op(luai_numsub, TM_SUB); |
561 | continue; | 566 | break; |
562 | } | 567 | } |
563 | case OP_MUL: { | 568 | case OP_MUL: { |
564 | arith_op(luai_nummul, TM_MUL); | 569 | arith_op(luai_nummul, TM_MUL); |
565 | continue; | 570 | break; |
566 | } | 571 | } |
567 | case OP_DIV: { | 572 | case OP_DIV: { |
568 | arith_op(luai_numdiv, TM_DIV); | 573 | arith_op(luai_numdiv, TM_DIV); |
569 | continue; | 574 | break; |
570 | } | 575 | } |
571 | case OP_MOD: { | 576 | case OP_MOD: { |
572 | arith_op(luai_nummod, TM_MOD); | 577 | arith_op(luai_nummod, TM_MOD); |
573 | continue; | 578 | break; |
574 | } | 579 | } |
575 | case OP_POW: { | 580 | case OP_POW: { |
576 | arith_op(luai_numpow, TM_POW); | 581 | arith_op(luai_numpow, TM_POW); |
577 | continue; | 582 | break; |
578 | } | 583 | } |
579 | case OP_UNM: { | 584 | case OP_UNM: { |
580 | TValue *rb = RB(i); | 585 | TValue *rb = RB(i); |
@@ -585,16 +590,16 @@ void luaV_execute (lua_State *L) { | |||
585 | else { | 590 | else { |
586 | Protect(luaV_arith(L, ra, rb, rb, TM_UNM)); | 591 | Protect(luaV_arith(L, ra, rb, rb, TM_UNM)); |
587 | } | 592 | } |
588 | continue; | 593 | break; |
589 | } | 594 | } |
590 | case OP_NOT: { | 595 | case OP_NOT: { |
591 | int res = l_isfalse(RB(i)); /* next assignment may change this value */ | 596 | int res = l_isfalse(RB(i)); /* next assignment may change this value */ |
592 | setbvalue(ra, res); | 597 | setbvalue(ra, res); |
593 | continue; | 598 | break; |
594 | } | 599 | } |
595 | case OP_LEN: { | 600 | case OP_LEN: { |
596 | Protect(luaV_objlen(L, ra, RB(i))); | 601 | Protect(luaV_objlen(L, ra, RB(i))); |
597 | continue; | 602 | break; |
598 | } | 603 | } |
599 | case OP_CONCAT: { | 604 | case OP_CONCAT: { |
600 | int b = GETARG_B(i); | 605 | int b = GETARG_B(i); |
@@ -603,11 +608,11 @@ void luaV_execute (lua_State *L) { | |||
603 | Protect(luaV_concat(L, c-b+1); luaC_checkGC(L)); | 608 | Protect(luaV_concat(L, c-b+1); luaC_checkGC(L)); |
604 | L->top = ci->top; /* restore top */ | 609 | L->top = ci->top; /* restore top */ |
605 | setobjs2s(L, RA(i), base+b); | 610 | setobjs2s(L, RA(i), base+b); |
606 | continue; | 611 | break; |
607 | } | 612 | } |
608 | case OP_JMP: { | 613 | case OP_JMP: { |
609 | dojump(GETARG_sBx(i)); | 614 | dojump(GETARG_sBx(i)); |
610 | continue; | 615 | break; |
611 | } | 616 | } |
612 | case OP_EQ: { | 617 | case OP_EQ: { |
613 | TValue *rb = RKB(i); | 618 | TValue *rb = RKB(i); |
@@ -617,7 +622,7 @@ void luaV_execute (lua_State *L) { | |||
617 | dojump(GETARG_sBx(*ci->u.l.savedpc)); | 622 | dojump(GETARG_sBx(*ci->u.l.savedpc)); |
618 | ) | 623 | ) |
619 | ci->u.l.savedpc++; | 624 | ci->u.l.savedpc++; |
620 | continue; | 625 | break; |
621 | } | 626 | } |
622 | case OP_LT: { | 627 | case OP_LT: { |
623 | Protect( | 628 | Protect( |
@@ -625,7 +630,7 @@ void luaV_execute (lua_State *L) { | |||
625 | dojump(GETARG_sBx(*ci->u.l.savedpc)); | 630 | dojump(GETARG_sBx(*ci->u.l.savedpc)); |
626 | ) | 631 | ) |
627 | ci->u.l.savedpc++; | 632 | ci->u.l.savedpc++; |
628 | continue; | 633 | break; |
629 | } | 634 | } |
630 | case OP_LE: { | 635 | case OP_LE: { |
631 | Protect( | 636 | Protect( |
@@ -633,13 +638,13 @@ void luaV_execute (lua_State *L) { | |||
633 | dojump(GETARG_sBx(*ci->u.l.savedpc)); | 638 | dojump(GETARG_sBx(*ci->u.l.savedpc)); |
634 | ) | 639 | ) |
635 | ci->u.l.savedpc++; | 640 | ci->u.l.savedpc++; |
636 | continue; | 641 | break; |
637 | } | 642 | } |
638 | case OP_TEST: { | 643 | case OP_TEST: { |
639 | if (GETARG_C(i) ? !l_isfalse(ra) : l_isfalse(ra)) | 644 | if (GETARG_C(i) ? !l_isfalse(ra) : l_isfalse(ra)) |
640 | dojump(GETARG_sBx(*ci->u.l.savedpc)); | 645 | dojump(GETARG_sBx(*ci->u.l.savedpc)); |
641 | ci->u.l.savedpc++; | 646 | ci->u.l.savedpc++; |
642 | continue; | 647 | break; |
643 | } | 648 | } |
644 | case OP_TESTSET: { | 649 | case OP_TESTSET: { |
645 | TValue *rb = RB(i); | 650 | TValue *rb = RB(i); |
@@ -648,7 +653,7 @@ void luaV_execute (lua_State *L) { | |||
648 | dojump(GETARG_sBx(*ci->u.l.savedpc)); | 653 | dojump(GETARG_sBx(*ci->u.l.savedpc)); |
649 | } | 654 | } |
650 | ci->u.l.savedpc++; | 655 | ci->u.l.savedpc++; |
651 | continue; | 656 | break; |
652 | } | 657 | } |
653 | case OP_CALL: { | 658 | case OP_CALL: { |
654 | int b = GETARG_B(i); | 659 | int b = GETARG_B(i); |
@@ -657,12 +662,12 @@ void luaV_execute (lua_State *L) { | |||
657 | if (luaD_precall(L, ra, nresults)) { /* C function? */ | 662 | if (luaD_precall(L, ra, nresults)) { /* C function? */ |
658 | if (nresults >= 0) L->top = ci->top; /* adjust results */ | 663 | if (nresults >= 0) L->top = ci->top; /* adjust results */ |
659 | base = ci->u.l.base; | 664 | base = ci->u.l.base; |
660 | continue; | 665 | break; |
661 | } | 666 | } |
662 | else { /* Lua function */ | 667 | else { /* Lua function */ |
663 | ci = L->ci; | 668 | ci = L->ci; |
664 | ci->callstatus |= CIST_REENTRY; | 669 | ci->callstatus |= CIST_REENTRY; |
665 | break; /* restart luaV_execute over new Lua function */ | 670 | goto newframe; /* restart luaV_execute over new Lua function */ |
666 | } | 671 | } |
667 | } | 672 | } |
668 | case OP_TAILCALL: { | 673 | case OP_TAILCALL: { |
@@ -671,7 +676,7 @@ void luaV_execute (lua_State *L) { | |||
671 | lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); | 676 | lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); |
672 | if (luaD_precall(L, ra, LUA_MULTRET)) { /* C function? */ | 677 | if (luaD_precall(L, ra, LUA_MULTRET)) { /* C function? */ |
673 | base = ci->u.l.base; | 678 | base = ci->u.l.base; |
674 | continue; | 679 | break; |
675 | } | 680 | } |
676 | else { | 681 | else { |
677 | /* tail call: put called frame (n) in place of caller one (o) */ | 682 | /* tail call: put called frame (n) in place of caller one (o) */ |
@@ -693,7 +698,7 @@ void luaV_execute (lua_State *L) { | |||
693 | oci->callstatus |= CIST_TAIL; /* function was tail called */ | 698 | oci->callstatus |= CIST_TAIL; /* function was tail called */ |
694 | ci = L->ci = oci; /* remove new frame */ | 699 | ci = L->ci = oci; /* remove new frame */ |
695 | lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize); | 700 | lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize); |
696 | break; /* restart luaV_execute over new Lua function */ | 701 | goto newframe; /* restart luaV_execute over new Lua function */ |
697 | } | 702 | } |
698 | } | 703 | } |
699 | case OP_RETURN: { | 704 | case OP_RETURN: { |
@@ -708,7 +713,7 @@ void luaV_execute (lua_State *L) { | |||
708 | if (b) L->top = ci->top; | 713 | if (b) L->top = ci->top; |
709 | lua_assert(isLua(ci)); | 714 | lua_assert(isLua(ci)); |
710 | lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL); | 715 | lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL); |
711 | break; /* restart luaV_execute over new Lua function */ | 716 | goto newframe; /* restart luaV_execute over new Lua function */ |
712 | } | 717 | } |
713 | } | 718 | } |
714 | case OP_FORLOOP: { | 719 | case OP_FORLOOP: { |
@@ -721,7 +726,7 @@ void luaV_execute (lua_State *L) { | |||
721 | setnvalue(ra, idx); /* update internal index... */ | 726 | setnvalue(ra, idx); /* update internal index... */ |
722 | setnvalue(ra+3, idx); /* ...and external index */ | 727 | setnvalue(ra+3, idx); /* ...and external index */ |
723 | } | 728 | } |
724 | continue; | 729 | break; |
725 | } | 730 | } |
726 | case OP_FORPREP: { | 731 | case OP_FORPREP: { |
727 | const TValue *init = ra; | 732 | const TValue *init = ra; |
@@ -735,7 +740,7 @@ void luaV_execute (lua_State *L) { | |||
735 | luaG_runerror(L, LUA_QL("for") " step must be a number"); | 740 | luaG_runerror(L, LUA_QL("for") " step must be a number"); |
736 | setnvalue(ra, luai_numsub(L, nvalue(ra), nvalue(pstep))); | 741 | setnvalue(ra, luai_numsub(L, nvalue(ra), nvalue(pstep))); |
737 | dojump(GETARG_sBx(i)); | 742 | dojump(GETARG_sBx(i)); |
738 | continue; | 743 | break; |
739 | } | 744 | } |
740 | case OP_TFORCALL: { | 745 | case OP_TFORCALL: { |
741 | StkId cb = ra + 3; /* call base */ | 746 | StkId cb = ra + 3; /* call base */ |
@@ -755,7 +760,7 @@ void luaV_execute (lua_State *L) { | |||
755 | setobjs2s(L, ra, ra + 1); /* save control variable */ | 760 | setobjs2s(L, ra, ra + 1); /* save control variable */ |
756 | dojump(GETARG_sBx(i)); /* jump back */ | 761 | dojump(GETARG_sBx(i)); /* jump back */ |
757 | } | 762 | } |
758 | continue; | 763 | break; |
759 | } | 764 | } |
760 | case OP_SETLIST: { | 765 | case OP_SETLIST: { |
761 | int n = GETARG_B(i); | 766 | int n = GETARG_B(i); |
@@ -777,11 +782,11 @@ void luaV_execute (lua_State *L) { | |||
777 | luaC_barriert(L, h, val); | 782 | luaC_barriert(L, h, val); |
778 | } | 783 | } |
779 | L->top = ci->top; /* correct top (in case of previous open call) */ | 784 | L->top = ci->top; /* correct top (in case of previous open call) */ |
780 | continue; | 785 | break; |
781 | } | 786 | } |
782 | case OP_CLOSE: { | 787 | case OP_CLOSE: { |
783 | luaF_close(L, ra); | 788 | luaF_close(L, ra); |
784 | continue; | 789 | break; |
785 | } | 790 | } |
786 | case OP_CLOSURE: { | 791 | case OP_CLOSURE: { |
787 | Proto *p = cl->p->p[GETARG_Bx(i)]; /* prototype for new closure */ | 792 | Proto *p = cl->p->p[GETARG_Bx(i)]; /* prototype for new closure */ |
@@ -806,7 +811,7 @@ void luaV_execute (lua_State *L) { | |||
806 | ncl->l.upvals[j] = cl->upvals[uv[j].idx]; | 811 | ncl->l.upvals[j] = cl->upvals[uv[j].idx]; |
807 | } | 812 | } |
808 | Protect(luaC_checkGC(L)); | 813 | Protect(luaC_checkGC(L)); |
809 | continue; | 814 | break; |
810 | } | 815 | } |
811 | case OP_VARARG: { | 816 | case OP_VARARG: { |
812 | int b = GETARG_B(i) - 1; | 817 | int b = GETARG_B(i) - 1; |
@@ -826,18 +831,13 @@ void luaV_execute (lua_State *L) { | |||
826 | setnilvalue(ra + j); | 831 | setnilvalue(ra + j); |
827 | } | 832 | } |
828 | } | 833 | } |
829 | continue; | 834 | break; |
830 | } | 835 | } |
831 | case OP_EXTRAARG: { | 836 | case OP_EXTRAARG: { |
832 | luaG_runerror(L, "bad opcode"); | 837 | luaG_runerror(L, "bad opcode"); |
833 | return; | 838 | return; |
834 | } | 839 | } |
835 | } | 840 | } |
836 | /* function changed (call/return): update pointers */ | ||
837 | lua_assert(ci == L->ci); | ||
838 | cl = &clvalue(ci->func)->l; | ||
839 | k = cl->p->k; | ||
840 | base = ci->u.l.base; | ||
841 | } | 841 | } |
842 | } | 842 | } |
843 | 843 | ||