** Ensure that expression 'e' is not a variable (nor a constant). ** (Expression still may have jump lists.) */
| 757 | ** (Expression still may have jump lists.) |
| 758 | */ |
| 759 | void luaK_dischargevars (FuncState *fs, expdesc *e) { |
| 760 | switch (e->k) { |
| 761 | case VCONST: { |
| 762 | const2exp(const2val(fs, e), e); |
| 763 | break; |
| 764 | } |
| 765 | case VLOCAL: { /* already in a register */ |
| 766 | e->u.info = e->u.var.sidx; |
| 767 | e->k = VNONRELOC; /* becomes a non-relocatable value */ |
| 768 | break; |
| 769 | } |
| 770 | case VUPVAL: { /* move value to some (pending) register */ |
| 771 | e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); |
| 772 | e->k = VRELOC; |
| 773 | break; |
| 774 | } |
| 775 | case VINDEXUP: { |
| 776 | e->u.info = luaK_codeABC(fs, OP_GETTABUP, 0, e->u.ind.t, e->u.ind.idx); |
| 777 | e->k = VRELOC; |
| 778 | break; |
| 779 | } |
| 780 | case VINDEXI: { |
| 781 | freereg(fs, e->u.ind.t); |
| 782 | e->u.info = luaK_codeABC(fs, OP_GETI, 0, e->u.ind.t, e->u.ind.idx); |
| 783 | e->k = VRELOC; |
| 784 | break; |
| 785 | } |
| 786 | case VINDEXSTR: { |
| 787 | freereg(fs, e->u.ind.t); |
| 788 | e->u.info = luaK_codeABC(fs, OP_GETFIELD, 0, e->u.ind.t, e->u.ind.idx); |
| 789 | e->k = VRELOC; |
| 790 | break; |
| 791 | } |
| 792 | case VINDEXED: { |
| 793 | freeregs(fs, e->u.ind.t, e->u.ind.idx); |
| 794 | e->u.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.ind.t, e->u.ind.idx); |
| 795 | e->k = VRELOC; |
| 796 | break; |
| 797 | } |
| 798 | case VVARARG: case VCALL: { |
| 799 | luaK_setoneret(fs, e); |
| 800 | break; |
| 801 | } |
| 802 | default: break; /* there is one value available (somewhere) */ |
| 803 | } |
| 804 | } |
| 805 | |
| 806 | |
| 807 | /* |
no test coverage detected