瀏覽代碼

Unary operators

Hugo Musso Gualandi 3 年之前
父節點
當前提交
984bea7612
共有 2 個文件被更改,包括 45 次插入26 次删除
  1. 40 5
      src/functions_header.c
  2. 5 21
      src/luaot_functions.c

+ 40 - 5
src/functions_header.c

@@ -691,12 +691,47 @@ void luaot_SHL(lua_State *L, LuaotExecuteState *ctx, const Instruction *pc,
     op_bitwise_aux(L, luaV_shiftl);
 }
 
-#if 0
 static
-void luaot_(lua_State *L, LuaotExecuteState *ctx, const Instruction *pc,
-           LuaotExecuteState *ctx, const Instruction *pc,
-           StkId ra, TValue *v1, int c)
+void luaot_UNM(lua_State *L, LuaotExecuteState *ctx, const Instruction *pc,
+               StkId ra, TValue *rb)
 {
+    lua_Number nb;
+    if (ttisinteger(rb)) {
+      lua_Integer ib = ivalue(rb);
+      setivalue(s2v(ra), intop(-, 0, ib));
+    }
+    else if (tonumberns(rb, nb)) {
+      setfltvalue(s2v(ra), luai_numunm(L, nb));
+    }
+    else
+      Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM));
 }
-#endif
 
+static
+void luaot_BNOT(lua_State *L, LuaotExecuteState *ctx, const Instruction *pc,
+                StkId ra, TValue *rb)
+{
+    lua_Integer ib;
+    if (tointegerns(rb, &ib)) {
+      setivalue(s2v(ra), intop(^, ~l_castS2U(0), ib));
+    }
+    else
+      Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT));
+}
+
+static
+void luaot_NOT(lua_State *L, LuaotExecuteState *ctx, const Instruction *pc,
+               StkId ra, TValue *rb)
+{
+    if (l_isfalse(rb))
+      setbtvalue(s2v(ra));
+    else
+      setbfvalue(s2v(ra));
+}
+
+static
+void luaot_LEN(lua_State *L, LuaotExecuteState *ctx, const Instruction *pc,
+               StkId ra, TValue *rb)
+{
+    Protect(luaV_objlen(L, ra, rb));
+}

+ 5 - 21
src/luaot_functions.c

@@ -350,38 +350,22 @@ void create_function(Proto *f)
             }
             case OP_UNM: {
                 println("    TValue *rb = vRB(i);");
-                println("    lua_Number nb;");
-                println("    if (ttisinteger(rb)) {");
-                println("      lua_Integer ib = ivalue(rb);");
-                println("      setivalue(s2v(ra), intop(-, 0, ib));");
-                println("    }");
-                println("    else if (tonumberns(rb, nb)) {");
-                println("      setfltvalue(s2v(ra), luai_numunm(L, nb));");
-                println("    }");
-                println("    else");
-                println("      Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM));");
+                println("    luaot_UNM(L, ctx, pc, ra, rb);");
                 break;
             }
             case OP_BNOT: {
                 println("    TValue *rb = vRB(i);");
-                println("    lua_Integer ib;");
-                println("    if (tointegerns(rb, &ib)) {");
-                println("      setivalue(s2v(ra), intop(^, ~l_castS2U(0), ib));");
-                println("    }");
-                println("    else");
-                println("      Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT));");
+                println("    luaot_BNOT(L, ctx, pc, ra, rb);");
                 break;
             }
             case OP_NOT: {
                 println("    TValue *rb = vRB(i);");
-                println("    if (l_isfalse(rb))");
-                println("      setbtvalue(s2v(ra));");
-                println("    else");
-                println("      setbfvalue(s2v(ra));");
+                println("    luaot_NOT(L, ctx, pc, ra, rb);");
                 break;
             }
             case OP_LEN: {
-                println("    Protect(luaV_objlen(L, ra, vRB(i)));");
+                println("    TValue *rb = vRB(i);");
+                println("    luaot_LEN(L, ctx, pc, ra, rb);");
                 break;
             }
             case OP_CONCAT: {