Przeglądaj źródła

Comparison operators

Hugo Musso Gualandi 5 lat temu
rodzic
commit
0122915113
1 zmienionych plików z 50 dodań i 9 usunięć
  1. 50 9
      src/luaot.c

+ 50 - 9
src/luaot.c

@@ -856,15 +856,56 @@ void create_function(Proto *p)
                 println("    goto label_%02d;", jump_target(p, pc));
                 break;
             }
-            // case OP_EQ
-            // case OP_LT
-            // case OP_LE
-            // case OP_EQK
-            // case OP_EQI
-            // case OP_LTI
-            // case OP_LEI
-            // case OP_GTI
-            // case OP_GEI
+            case OP_EQ: {
+                println("    int cond;");
+                println("    TValue *rb = vRB(i);");
+                println("    Protect(cond = luaV_equalobj(L, s2v(ra), rb));");
+                println("    docondjump();");
+                break;
+            }
+            case OP_LT: {
+                println("    op_order(L, l_lti, LTnum, lessthanothers);");
+                break;
+            }
+            case OP_LE: {
+                println("    op_order(L, l_lei, LEnum, lessequalothers);");
+                break;
+            }
+            case OP_EQK: {
+                println("    TValue *rb = KB(i);");
+                println("    /* basic types do not use '__eq'; we can use raw equality */");
+                println("    int cond = luaV_equalobj(NULL, s2v(ra), rb);");
+                println("    docondjump();");
+                break;
+            }
+            case OP_EQI: {
+                println("    int cond;");
+                println("    int im = GETARG_sB(i);");
+                println("    if (ttisinteger(s2v(ra)))");
+                println("      cond = (ivalue(s2v(ra)) == im);");
+                println("    else if (ttisfloat(s2v(ra)))");
+                println("      cond = luai_numeq(fltvalue(s2v(ra)), cast_num(im));");
+                println("    else");
+                println("      cond = 0;  /* other types cannot be equal to a number */");
+                println("    docondjump();");
+                break;
+            }
+            case OP_LTI: {
+                println("    op_orderI(L, l_lti, luai_numlt, 0, TM_LT);");
+                break;
+            }
+            case OP_LEI: {
+                println("    op_orderI(L, l_lei, luai_numle, 0, TM_LE);");
+                break;
+            }
+            case OP_GTI: {
+                println("    op_orderI(L, l_gti, luai_numgt, 1, TM_LT);");
+                break;
+            }
+            case OP_GEI: {
+                println("    op_orderI(L, l_gei, luai_numge, 1, TM_LE);");
+                break;
+            }
             case OP_TEST: {
                 println("    int cond = !l_isfalse(s2v(ra));");
                 println("    docondjump();");