aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-04-28 17:57:45 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-04-28 17:57:45 -0300
commit502a1d1108d4e3b97e012d2ed9a496fd003b08db (patch)
tree0d1daa63ebe8af89a35ec5ecbc48f7e055eb0374 /lvm.c
parent173e41b2ebed59a716d299470de25e50aee3b921 (diff)
downloadlua-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.c76
1 files changed, 63 insertions, 13 deletions
diff --git a/lvm.c b/lvm.c
index 52a6ca35..9fa9daf5 100644
--- a/lvm.c
+++ b/lvm.c
@@ -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);