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