diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-05-12 17:40:35 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-05-12 17:40:35 -0300 |
commit | b6e9fcbd70b8e006417ef771f9789d54d075b552 (patch) | |
tree | 789abbc9b43a1696f59a85ba4b18c81b20dad739 /lvm.c | |
parent | 8554baeacf8e2af3e87d5f1c0e033fc9d1f9dc8e (diff) | |
download | lua-b6e9fcbd70b8e006417ef771f9789d54d075b552.tar.gz lua-b6e9fcbd70b8e006417ef771f9789d54d075b552.tar.bz2 lua-b6e9fcbd70b8e006417ef771f9789d54d075b552.zip |
use of macro ('vmcase') to format all cases in main switch of
'luaV_execute' (to facilitate experiences with direct threading)
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 204 |
1 files changed, 83 insertions, 121 deletions
@@ -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 | ||
445 | void luaV_execute (lua_State *L) { | 444 | void 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 | } |