Ver Fonte

OP_SETTABLE OP_SETI OP_SETFIELD OP_NEWTABLE

Hugo Musso Gualandi há 5 anos atrás
pai
commit
fa2cb7d684
1 ficheiros alterados com 58 adições e 4 exclusões
  1. 58 4
      src/luaot.c

+ 58 - 4
src/luaot.c

@@ -701,10 +701,64 @@ void create_function(Proto *p)
                 break;
             }
             // case OP_SETTABUP
-            // case OP_SETTABLE
-            // case OP_SETI
-            // case OP_SETFIELD
-            // case OP_NEWTABLE
+            case OP_SETTABLE: {
+                println("    const TValue *slot;");
+                println("    TValue *rb = vRB(i);  /* key (table is in 'ra') */");
+                println("    TValue *rc = RKC(i);  /* value */");
+                println("    lua_Unsigned n;");
+                println("    if (ttisinteger(rb)  /* fast track for integers? */");
+                println("        ? (cast_void(n = ivalue(rb)), luaV_fastgeti(L, s2v(ra), n, slot))");
+                println("        : luaV_fastget(L, s2v(ra), rb, slot, luaH_get)) {");
+                println("      luaV_finishfastset(L, s2v(ra), slot, rc);");
+                println("    }");
+                println("    else");
+                println("      Protect(luaV_finishset(L, s2v(ra), rb, rc, slot));");
+                break;
+            }
+            case OP_SETI: {
+                println("    const TValue *slot;");
+                println("    int c = GETARG_B(i);");
+                println("    TValue *rc = RKC(i);");
+                println("    if (luaV_fastgeti(L, s2v(ra), c, slot)) {");
+                println("      luaV_finishfastset(L, s2v(ra), slot, rc);");
+                println("    }");
+                println("    else {");
+                println("      TValue key;");
+                println("      setivalue(&key, c);");
+                println("      Protect(luaV_finishset(L, s2v(ra), &key, rc, slot));");
+                println("    }");
+                break;
+            }
+            case OP_SETFIELD: {
+                println("    const TValue *slot;");
+                println("    TValue *rb = KB(i);");
+                println("    TValue *rc = RKC(i);");
+                println("    TString *key = tsvalue(rb);  /* key must be a string */");
+                println("    if (luaV_fastget(L, s2v(ra), key, slot, luaH_getshortstr)) {");
+                println("      luaV_finishfastset(L, s2v(ra), slot, rc);");
+                println("    }");
+                println("    else");
+                println("      Protect(luaV_finishset(L, s2v(ra), rb, rc, slot));");
+                break;
+            }
+            case OP_NEWTABLE: {
+                println("    int b = GETARG_B(i);  /* log2(hash size) + 1 */");
+                println("    int c = GETARG_C(i);  /* array size */");
+                println("    Table *t;");
+                println("    if (b > 0)");
+                println("      b = 1 << (b - 1);  /* size is 2^(b - 1) */");
+                println("    if (TESTARG_k(i))");
+                println("      c += GETARG_Ax(0x%08x) * (MAXARG_C + 1);", p->code[pc+1]);
+                println("    /* skip extra argument */"); // (!)
+                println("    L->top = ra + 1;  /* correct top in case of emergency GC */");
+                println("    t = luaH_new(L);  /* memory allocation */");
+                println("    sethvalue2s(L, ra, t);");
+                println("    if (b != 0 || c != 0)");
+                println("      luaH_resize(L, t, c, b);  /* idem */");
+                println("    checkGC(L, ra + 1);");
+                println("    goto LUA_AOT_SKIP1;"); // (!)
+                break;
+            }
             // case OP_SELF
             case OP_ADDI: {
                 println("    op_arithI(L, l_addi, luai_numadd, TM_ADD, GETARG_k(i));");