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