Sfoglia il codice sorgente

More opcodes (LOADF .. GETTABUP)

Hugo Musso Gualandi 3 anni fa
parent
commit
8470e76d17
2 ha cambiato i file con 88 aggiunte e 21 eliminazioni
  1. 76 0
      src/functions_header.c
  2. 12 21
      src/luaot_functions.c

+ 76 - 0
src/functions_header.c

@@ -190,3 +190,79 @@ void luaot_LOADI(lua_State *L,
 {
     setivalue(s2v(ra), b);
 }
+
+static
+void luaot_LOADF(StkId ra, int b)
+{
+    setfltvalue(s2v(ra), cast_num(b));
+}
+
+static
+void luaot_LOADK(lua_State *L,
+                 StkId ra, TValue * rb)
+{
+    setobj2s(L, ra, rb);
+}
+
+static
+void luaot_LOADKX(lua_State *L,
+                  StkId ra, TValue *rb)
+{
+    setobj2s(L, ra, rb);
+}
+
+static
+void luaot_LOADFALSE(StkId ra)
+{
+    setbfvalue(s2v(ra));
+}
+
+static
+void luaot_LFALSESKIP(StkId ra)
+{
+     setbfvalue(s2v(ra));
+}
+
+static
+void luaot_LOADTRUE(StkId ra)
+{
+    setbtvalue(s2v(ra));
+}
+
+static
+void luaot_LOADNIL(StkId ra, int b)
+{
+    do {
+        setnilvalue(s2v(ra++));
+    } while (b--);
+}
+
+static
+void luaot_GETUPVAL(lua_State *L, LuaotExecuteState *ctx,
+                    StkId ra, int b)
+{
+    setobj2s(L, ra, ctx->cl->upvals[b]->v);
+}
+
+static
+void luaot_SETUPVAL(lua_State *L, LuaotExecuteState *ctx,
+                    StkId ra, int b)
+{
+    UpVal *uv = ctx->cl->upvals[b];
+    setobj(L, uv->v, s2v(ra));
+    luaC_barrier(L, uv, s2v(ra));
+}
+
+static
+void luaot_GETTABUP(lua_State *L, LuaotExecuteState *ctx, const Instruction *pc,
+                    StkId ra, int b, TValue *rc)
+{
+    const TValue *slot;
+    TValue *upval = ctx->cl->upvals[b]->v;
+    TString *key = tsvalue(rc);  /* key must be a string */
+    if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) {
+      setobj2s(L, ra, slot);
+    }
+    else
+      Protect(luaV_finishget(L, upval, rc, ra, slot));
+}

+ 12 - 21
src/luaot_functions.c

@@ -114,62 +114,53 @@ void create_function(Proto *f)
             }
             case OP_LOADF: {
                 println("    int b = GETARG_sBx(i);");
-                println("    setfltvalue(s2v(ra), cast_num(b));");
+                println("    luaot_LOADF(ra, b);");
                 break;
             }
             case OP_LOADK: {
                 println("    TValue *rb = ctx->k + GETARG_Bx(i);");
-                println("    setobj2s(L, ra, rb);");
+                println("    luaot_LOADK(L, ra, rb);");
                 break;
             }
             case OP_LOADKX: {
                 println("    TValue *rb;");
                 println("    rb = ctx->k + GETARG_Ax(0x%08x);", f->code[pc+1]);
-                println("    setobj2s(L, ra, rb);");
+                println("    luaot_LOADKX(L, ra, rb);");
                 println("    goto LUAOT_SKIP1;"); //(!)
                 break;
             }
             case OP_LOADFALSE: {
-                println("    setbfvalue(s2v(ra));");
+                println("    luaot_LOADFALSE(ra);");
                 break;
             }
             case OP_LFALSESKIP: {
-                println("    setbfvalue(s2v(ra));");
+                println("    luaot_LFALSESKIP(ra);");
                 println("    goto LUAOT_SKIP1;"); //(!)
                 break;
             }
             case OP_LOADTRUE: {
-                println("    setbtvalue(s2v(ra));");
+                println("    luaot_LOADTRUE(ra)");
                 break;
             }
             case OP_LOADNIL: {
                 println("    int b = GETARG_B(i);");
-                println("    do {");
-                println("      setnilvalue(s2v(ra++));");
-                println("    } while (b--);");
+                println("    luaot_LOADNIL(ra, b);");
                 break;
             }
             case OP_GETUPVAL: {
                 println("    int b = GETARG_B(i);");
-                println("    setobj2s(L, ra, ctx->cl->upvals[b]->v);");
+                println("    luaot_GETUPVAL(L, ctx, ra, b);");
                 break;
             }
             case OP_SETUPVAL: {
-                println("    UpVal *uv = ctx->cl->upvals[GETARG_B(i)];");
-                println("    setobj(L, uv->v, s2v(ra));");
-                println("    luaC_barrier(L, uv, s2v(ra));");
+                println("    int b = GETARG_B(i);");
+                println("    luaot_SETUPVAL(L, ctx, ra, b);");
                 break;
             }
             case OP_GETTABUP: {
-                println("    const TValue *slot;");
-                println("    TValue *upval = ctx->cl->upvals[GETARG_B(i)]->v;");
+                println("    int b = GETARG_B(i);");
                 println("    TValue *rc = KC(i);");
-                println("    TString *key = tsvalue(rc);  /* key must be a string */");
-                println("    if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) {");
-                println("      setobj2s(L, ra, slot);");
-                println("    }");
-                println("    else");
-                println("      Protect(luaV_finishget(L, upval, rc, ra, slot));");
+                println("    luaot_GETTABUP(L, ctx, pc, ra, b, rc);");
                 break;
             }
             case OP_GETTABLE: {