diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-04-28 17:57:45 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-04-28 17:57:45 -0300 |
| commit | 502a1d1108d4e3b97e012d2ed9a496fd003b08db (patch) | |
| tree | 0d1daa63ebe8af89a35ec5ecbc48f7e055eb0374 /lvm.c | |
| parent | 173e41b2ebed59a716d299470de25e50aee3b921 (diff) | |
| download | lua-502a1d1108d4e3b97e012d2ed9a496fd003b08db.tar.gz lua-502a1d1108d4e3b97e012d2ed9a496fd003b08db.tar.bz2 lua-502a1d1108d4e3b97e012d2ed9a496fd003b08db.zip | |
new opcodes for table access with constant keys (strings and integers)
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 76 |
1 files changed, 63 insertions, 13 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 2.272 2017/04/24 20:26:39 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.273 2017/04/26 17:46:52 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -658,11 +658,13 @@ void luaV_finishOp (lua_State *L) { | |||
| 658 | Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */ | 658 | Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */ |
| 659 | OpCode op = GET_OPCODE(inst); | 659 | OpCode op = GET_OPCODE(inst); |
| 660 | switch (op) { /* finish its execution */ | 660 | switch (op) { /* finish its execution */ |
| 661 | case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV: case OP_IDIV: | 661 | case OP_ADDI: case OP_ADD: case OP_SUB: |
| 662 | case OP_MUL: case OP_DIV: case OP_IDIV: | ||
| 662 | case OP_BAND: case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: | 663 | case OP_BAND: case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: |
| 663 | case OP_MOD: case OP_POW: | 664 | case OP_MOD: case OP_POW: |
| 664 | case OP_UNM: case OP_BNOT: case OP_LEN: | 665 | case OP_UNM: case OP_BNOT: case OP_LEN: |
| 665 | case OP_GETTABUP: case OP_GETTABLE: case OP_SELF: { | 666 | case OP_GETTABUP: case OP_GETTABLE: case OP_GETI: |
| 667 | case OP_GETFIELD: case OP_SELF: { | ||
| 666 | setobjs2s(L, base + GETARG_A(inst), --L->top); | 668 | setobjs2s(L, base + GETARG_A(inst), --L->top); |
| 667 | break; | 669 | break; |
| 668 | } | 670 | } |
| @@ -704,6 +706,7 @@ void luaV_finishOp (lua_State *L) { | |||
| 704 | break; | 706 | break; |
| 705 | } | 707 | } |
| 706 | case OP_TAILCALL: case OP_SETTABUP: case OP_SETTABLE: | 708 | case OP_TAILCALL: case OP_SETTABUP: case OP_SETTABLE: |
| 709 | case OP_SETI: case OP_SETFIELD: | ||
| 707 | break; | 710 | break; |
| 708 | default: lua_assert(0); | 711 | default: lua_assert(0); |
| 709 | } | 712 | } |
| @@ -726,7 +729,9 @@ void luaV_finishOp (lua_State *L) { | |||
| 726 | 729 | ||
| 727 | #define RA(i) (base+GETARG_A(i)) | 730 | #define RA(i) (base+GETARG_A(i)) |
| 728 | #define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_Br(i)) | 731 | #define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_Br(i)) |
| 732 | #define KB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_B(i)) | ||
| 729 | #define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) | 733 | #define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) |
| 734 | #define KC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, k+GETARG_C(i)) | ||
| 730 | #define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ | 735 | #define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ |
| 731 | (GETARG_Bk(i)) ? k+GETARG_Br(i) : base+GETARG_Br(i)) | 736 | (GETARG_Bk(i)) ? k+GETARG_Br(i) : base+GETARG_Br(i)) |
| 732 | #define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ | 737 | #define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ |
| @@ -837,10 +842,16 @@ void luaV_execute (lua_State *L) { | |||
| 837 | setobj2s(L, ra, cl->upvals[b]->v); | 842 | setobj2s(L, ra, cl->upvals[b]->v); |
| 838 | vmbreak; | 843 | vmbreak; |
| 839 | } | 844 | } |
| 845 | vmcase(OP_SETUPVAL) { | ||
| 846 | UpVal *uv = cl->upvals[GETARG_B(i)]; | ||
| 847 | setobj(L, uv->v, ra); | ||
| 848 | luaC_barrier(L, uv, ra); | ||
| 849 | vmbreak; | ||
| 850 | } | ||
| 840 | vmcase(OP_GETTABUP) { | 851 | vmcase(OP_GETTABUP) { |
| 841 | const TValue *slot; | 852 | const TValue *slot; |
| 842 | TValue *upval = cl->upvals[GETARG_B(i)]->v; | 853 | TValue *upval = cl->upvals[GETARG_B(i)]->v; |
| 843 | TValue *rc = RKC(i); | 854 | TValue *rc = KC(i); |
| 844 | TString *key = tsvalue(rc); /* key must be a string */ | 855 | TString *key = tsvalue(rc); /* key must be a string */ |
| 845 | if (luaV_fastget(L, upval, key, slot, luaH_getstr)) { | 856 | if (luaV_fastget(L, upval, key, slot, luaH_getstr)) { |
| 846 | setobj2s(L, ra, slot); | 857 | setobj2s(L, ra, slot); |
| @@ -850,32 +861,71 @@ void luaV_execute (lua_State *L) { | |||
| 850 | } | 861 | } |
| 851 | vmcase(OP_GETTABLE) { | 862 | vmcase(OP_GETTABLE) { |
| 852 | StkId rb = RB(i); | 863 | StkId rb = RB(i); |
| 853 | TValue *rc = RKC(i); | 864 | TValue *rc = RC(i); |
| 854 | gettableProtected(L, rb, rc, ra); | 865 | gettableProtected(L, rb, rc, ra); |
| 855 | vmbreak; | 866 | vmbreak; |
| 856 | } | 867 | } |
| 868 | vmcase(OP_GETI) { | ||
| 869 | const TValue *slot; | ||
| 870 | StkId rb = RB(i); | ||
| 871 | int c = GETARG_C(i); | ||
| 872 | if (luaV_fastget(L, rb, c, slot, luaH_getint)) { | ||
| 873 | setobj2s(L, ra, slot); | ||
| 874 | } | ||
| 875 | else { | ||
| 876 | TValue key; | ||
| 877 | setivalue(&key, c); | ||
| 878 | Protect(luaV_finishget(L, rb, &key, ra, slot)); | ||
| 879 | } | ||
| 880 | vmbreak; | ||
| 881 | } | ||
| 882 | vmcase(OP_GETFIELD) { | ||
| 883 | const TValue *slot; | ||
| 884 | StkId rb = RB(i); | ||
| 885 | TValue *rc = KC(i); | ||
| 886 | TString *key = tsvalue(rc); /* key must be a string */ | ||
| 887 | if (luaV_fastget(L, rb, key, slot, luaH_getstr)) { | ||
| 888 | setobj2s(L, ra, slot); | ||
| 889 | } | ||
| 890 | else Protect(luaV_finishget(L, rb, rc, ra, slot)); | ||
| 891 | vmbreak; | ||
| 892 | } | ||
| 857 | vmcase(OP_SETTABUP) { | 893 | vmcase(OP_SETTABUP) { |
| 858 | const TValue *slot; | 894 | const TValue *slot; |
| 859 | TValue *upval = cl->upvals[GETARG_A(i)]->v; | 895 | TValue *upval = cl->upvals[GETARG_A(i)]->v; |
| 860 | TValue *rb = RKB(i); | 896 | TValue *rb = KB(i); |
| 861 | TValue *rc = RKC(i); | 897 | TValue *rc = RKC(i); |
| 862 | TString *key = tsvalue(rb); /* key must be a string */ | 898 | TString *key = tsvalue(rb); /* key must be a string */ |
| 863 | if (!luaV_fastset(L, upval, key, slot, luaH_getstr, rc)) | 899 | if (!luaV_fastset(L, upval, key, slot, luaH_getstr, rc)) |
| 864 | Protect(luaV_finishset(L, upval, rb, rc, slot)); | 900 | Protect(luaV_finishset(L, upval, rb, rc, slot)); |
| 865 | vmbreak; | 901 | vmbreak; |
| 866 | } | 902 | } |
| 867 | vmcase(OP_SETUPVAL) { | ||
| 868 | UpVal *uv = cl->upvals[GETARG_B(i)]; | ||
| 869 | setobj(L, uv->v, ra); | ||
| 870 | luaC_barrier(L, uv, ra); | ||
| 871 | vmbreak; | ||
| 872 | } | ||
| 873 | vmcase(OP_SETTABLE) { | 903 | vmcase(OP_SETTABLE) { |
| 874 | TValue *rb = RKB(i); | 904 | TValue *rb = RB(i); |
| 875 | TValue *rc = RKC(i); | 905 | TValue *rc = RKC(i); |
| 876 | settableProtected(L, ra, rb, rc); | 906 | settableProtected(L, ra, rb, rc); |
| 877 | vmbreak; | 907 | vmbreak; |
| 878 | } | 908 | } |
| 909 | vmcase(OP_SETI) { | ||
| 910 | const TValue *slot; | ||
| 911 | int c = GETARG_B(i); | ||
| 912 | TValue *rc = RKC(i); | ||
| 913 | if (!luaV_fastset(L, ra, c, slot, luaH_getint, rc)) { | ||
| 914 | TValue key; | ||
| 915 | setivalue(&key, c); | ||
| 916 | Protect(luaV_finishset(L, ra, &key, rc, slot)); | ||
| 917 | } | ||
| 918 | vmbreak; | ||
| 919 | } | ||
| 920 | vmcase(OP_SETFIELD) { | ||
| 921 | const TValue *slot; | ||
| 922 | TValue *rb = KB(i); | ||
| 923 | TValue *rc = RKC(i); | ||
| 924 | TString *key = tsvalue(rb); /* key must be a string */ | ||
| 925 | if (!luaV_fastset(L, ra, key, slot, luaH_getstr, rc)) | ||
| 926 | Protect(luaV_finishset(L, ra, rb, rc, slot)); | ||
| 927 | vmbreak; | ||
| 928 | } | ||
| 879 | vmcase(OP_NEWTABLE) { | 929 | vmcase(OP_NEWTABLE) { |
| 880 | int b = GETARG_B(i); | 930 | int b = GETARG_B(i); |
| 881 | int c = GETARG_C(i); | 931 | int c = GETARG_C(i); |
