瀏覽代碼

OP_GETTABLE OP_GETI OP_GETFIELD

Hugo Musso Gualandi 5 年之前
父節點
當前提交
ae5c069fc7
共有 1 個文件被更改,包括 40 次插入3 次删除
  1. 40 3
      src/luaot.c

+ 40 - 3
src/luaot.c

@@ -660,9 +660,46 @@ void create_function(Proto *p)
             // case OP_GETUPVAL
             // case OP_SETUPVAL
             // case OP_GETTABUP
-            // case OP_GETTABLE
-            // case OP_GETI
-            // case OP_GETFIELD
+            case OP_GETTABLE: {
+                println("    const TValue *slot;");
+                println("    TValue *rb = vRB(i);");
+                println("    TValue *rc = vRC(i);");
+                println("    lua_Unsigned n;");
+                println("    if (ttisinteger(rc)  /* fast track for integers? */");
+                println("        ? (cast_void(n = ivalue(rc)), luaV_fastgeti(L, rb, n, slot))");
+                println("        : luaV_fastget(L, rb, rc, slot, luaH_get)) {");
+                println("      setobj2s(L, ra, slot);");
+                println("    }");
+                println("    else");
+                println("      Protect(luaV_finishget(L, rb, rc, ra, slot));");
+                break;
+            }
+            case OP_GETI: {
+                println("    const TValue *slot;");
+                println("    TValue *rb = vRB(i);");
+                println("    int c = GETARG_C(i);");
+                println("    if (luaV_fastgeti(L, rb, c, slot)) {");
+                println("      setobj2s(L, ra, slot);");
+                println("    }");
+                println("    else {");
+                println("      TValue key;");
+                println("      setivalue(&key, c);");
+                println("      Protect(luaV_finishget(L, rb, &key, ra, slot));");
+                println("    }");
+                break;
+            }
+            case OP_GETFIELD: {
+                println("    const TValue *slot;");
+                println("    TValue *rb = vRB(i);");
+                println("    TValue *rc = KC(i);");
+                println("    TString *key = tsvalue(rc);  /* key must be a string */");
+                println("    if (luaV_fastget(L, rb, key, slot, luaH_getshortstr)) {");
+                println("      setobj2s(L, ra, slot);");
+                println("    }");
+                println("    else");
+                println("      Protect(luaV_finishget(L, rb, rc, ra, slot));");
+                break;
+            }
             // case OP_SETTABUP
             // case OP_SETTABLE
             // case OP_SETI