** Ensure that expression 'e' is not a variable (nor a ). ** (Expression still may have jump lists.) */
| 817 | ** (Expression still may have jump lists.) |
| 818 | */ |
| 819 | void luaK_dischargevars (FuncState *fs, expdesc *e) { |
| 820 | switch (e->k) { |
| 821 | case VCONST: { |
| 822 | const2exp(const2val(fs, e), e); |
| 823 | break; |
| 824 | } |
| 825 | case VVARGVAR: { |
| 826 | luaK_vapar2local(fs, e); /* turn it into a local variable */ |
| 827 | } /* FALLTHROUGH */ |
| 828 | case VLOCAL: { /* already in a register */ |
| 829 | int temp = e->u.var.ridx; |
| 830 | e->u.info = temp; /* (can't do a direct assignment; values overlap) */ |
| 831 | e->k = VNONRELOC; /* becomes a non-relocatable value */ |
| 832 | break; |
| 833 | } |
| 834 | case VUPVAL: { /* move value to some (pending) register */ |
| 835 | e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); |
| 836 | e->k = VRELOC; |
| 837 | break; |
| 838 | } |
| 839 | case VINDEXUP: { |
| 840 | e->u.info = luaK_codeABC(fs, OP_GETTABUP, 0, e->u.ind.t, e->u.ind.idx); |
| 841 | e->k = VRELOC; |
| 842 | break; |
| 843 | } |
| 844 | case VINDEXI: { |
| 845 | freereg(fs, e->u.ind.t); |
| 846 | e->u.info = luaK_codeABC(fs, OP_GETI, 0, e->u.ind.t, e->u.ind.idx); |
| 847 | e->k = VRELOC; |
| 848 | break; |
| 849 | } |
| 850 | case VINDEXSTR: { |
| 851 | freereg(fs, e->u.ind.t); |
| 852 | e->u.info = luaK_codeABC(fs, OP_GETFIELD, 0, e->u.ind.t, e->u.ind.idx); |
| 853 | e->k = VRELOC; |
| 854 | break; |
| 855 | } |
| 856 | case VINDEXED: { |
| 857 | freeregs(fs, e->u.ind.t, e->u.ind.idx); |
| 858 | e->u.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.ind.t, e->u.ind.idx); |
| 859 | e->k = VRELOC; |
| 860 | break; |
| 861 | } |
| 862 | case VVARGIND: { |
| 863 | freeregs(fs, e->u.ind.t, e->u.ind.idx); |
| 864 | e->u.info = luaK_codeABC(fs, OP_GETVARG, 0, e->u.ind.t, e->u.ind.idx); |
| 865 | e->k = VRELOC; |
| 866 | break; |
| 867 | } |
| 868 | case VVARARG: case VCALL: { |
| 869 | luaK_setoneret(fs, e); |
| 870 | break; |
| 871 | } |
| 872 | default: break; /* there is one value available (somewhere) */ |
| 873 | } |
| 874 | } |
| 875 | |
| 876 |
no test coverage detected