** Ensure that expression 'e' is not a variable (nor a ). ** (Expression still may have jump lists.) */
| 771 | ** (Expression still may have jump lists.) |
| 772 | */ |
| 773 | void luaK_dischargevars (FuncState *fs, expdesc *e) { |
| 774 | switch (e->k) { |
| 775 | case VCONST: { |
| 776 | const2exp(const2val(fs, e), e); |
| 777 | break; |
| 778 | } |
| 779 | case VLOCAL: { /* already in a register */ |
| 780 | int temp = e->u.var.ridx; |
| 781 | e->u.info = temp; /* (can't do a direct assignment; values overlap) */ |
| 782 | e->k = VNONRELOC; /* becomes a non-relocatable value */ |
| 783 | break; |
| 784 | } |
| 785 | case VUPVAL: { /* move value to some (pending) register */ |
| 786 | e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); |
| 787 | e->k = VRELOC; |
| 788 | break; |
| 789 | } |
| 790 | case VINDEXUP: { |
| 791 | e->u.info = luaK_codeABC(fs, OP_GETTABUP, 0, e->u.ind.t, e->u.ind.idx); |
| 792 | e->k = VRELOC; |
| 793 | break; |
| 794 | } |
| 795 | case VINDEXI: { |
| 796 | freereg(fs, e->u.ind.t); |
| 797 | e->u.info = luaK_codeABC(fs, OP_GETI, 0, e->u.ind.t, e->u.ind.idx); |
| 798 | e->k = VRELOC; |
| 799 | break; |
| 800 | } |
| 801 | case VINDEXSTR: { |
| 802 | freereg(fs, e->u.ind.t); |
| 803 | e->u.info = luaK_codeABC(fs, OP_GETFIELD, 0, e->u.ind.t, e->u.ind.idx); |
| 804 | e->k = VRELOC; |
| 805 | break; |
| 806 | } |
| 807 | case VINDEXED: { |
| 808 | freeregs(fs, e->u.ind.t, e->u.ind.idx); |
| 809 | e->u.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.ind.t, e->u.ind.idx); |
| 810 | e->k = VRELOC; |
| 811 | break; |
| 812 | } |
| 813 | case VVARARG: case VCALL: { |
| 814 | luaK_setoneret(fs, e); |
| 815 | break; |
| 816 | } |
| 817 | default: break; /* there is one value available (somewhere) */ |
| 818 | } |
| 819 | } |
| 820 | |
| 821 | |
| 822 | /* |
no test coverage detected