Bladeren bron

Fixed an issue with self parameter in complex postfix expressions.

Revert a recent change to the way some comparisons was performed.
Unit test added and modified.
Marco Bambini 6 jaren geleden
bovenliggende
commit
e94af5fa06

+ 1 - 0
src/compiler/gravity_codegen.c

@@ -1519,6 +1519,7 @@ static void visit_postfix_expr (gvisitor_t *self, gnode_postfix_expr_t *node) {
                     report_error(self, (gnode_t *)subnode->expr, "Unexpected register error.");
                     return;
                 }
+                marray_push(uint32_t, self_list, rtemp);
             }
         }
 

+ 5 - 5
src/runtime/gravity_core.c

@@ -1685,7 +1685,7 @@ static bool operator_float_cmp (gravity_vm *vm, gravity_value_t *args, uint16_t
     #pragma unused(vm, nargs)
 
     DECLARE_2VARIABLES(v1, v2, 0, 1);
-    INTERNAL_CONVERT_FLOAT(v2, false);
+    INTERNAL_CONVERT_FLOAT(v2, true);
     
     // simpler equality test
     if (VALUE_ISA_VALID(v2)) {
@@ -1852,7 +1852,7 @@ static bool operator_int_cmp (gravity_vm *vm, gravity_value_t *args, uint16_t na
     }
 
     DECLARE_2VARIABLES(v1, v2, 0, 1);
-    INTERNAL_CONVERT_INT(v2, false);
+    INTERNAL_CONVERT_INT(v2, true);
     
     if (VALUE_ISA_VALID(v2)) {
         if (v1.n == v2.n) RETURN_VALUE(VALUE_FROM_INT(0), rindex);
@@ -1867,8 +1867,8 @@ static bool int_loop (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uin
     if (!VALUE_ISA_CLOSURE(GET_VALUE(1))) RETURN_ERROR("Argument must be a Closure.");
 
     gravity_closure_t *closure = VALUE_AS_CLOSURE(GET_VALUE(1));    // closure to execute
-    gravity_value_t value = GET_VALUE(0);                            // self parameter
-    register gravity_int_t n = value.n;                                // times to execute the loop
+    gravity_value_t value = GET_VALUE(0);                           // self parameter
+    register gravity_int_t n = value.n;                             // times to execute the loop
     register gravity_int_t i = 0;
 
     nanotime_t t1 = nanotime();
@@ -2124,7 +2124,7 @@ static bool operator_string_cmp (gravity_vm *vm, gravity_value_t *args, uint16_t
     #pragma unused(vm, nargs)
 
     DECLARE_2VARIABLES(v1, v2, 0, 1);
-    INTERNAL_CONVERT_STRING(v2, false);
+    INTERNAL_CONVERT_STRING(v2, true);
 
     if (VALUE_ISA_VALID(v2)) {
         gravity_string_t *s1 = VALUE_AS_STRING(v1);

+ 2 - 2
src/shared/gravity_value.h

@@ -66,8 +66,8 @@
 extern "C" {
 #endif
 
-#define GRAVITY_VERSION						"0.6.6"     // git tag 0.6.6
-#define GRAVITY_VERSION_NUMBER				0x000606    // git push --tags
+#define GRAVITY_VERSION						"0.6.7"     // git tag 0.6.7
+#define GRAVITY_VERSION_NUMBER				0x000607    // git push --tags
 #define GRAVITY_BUILD_DATE                  __DATE__
 
 #ifndef GRAVITY_ENABLE_DOUBLE

+ 18 - 0
test/unittest/check_self_postfix.gravity

@@ -0,0 +1,18 @@
+#unittest {
+    name: "Self check in complex postfix.";
+    result: 1;
+};
+
+class Foo {
+    func f1() {
+        if (self is Foo) return 1;
+        return 0;
+    }
+}
+
+func main() {
+    var f1 = Foo();
+    var f2 = Foo();
+    var l = [f1, f2]
+    return l[0].f1();
+}

+ 2 - 4
test/unittest/comparison.gravity

@@ -1,5 +1,5 @@
 #unittest {
-    name: "New comparison algorithm.";
+    name: "Comparison with type checking.";
     result: false;
 };
 
@@ -17,9 +17,7 @@ func main() {
     var d = "";
     var e = undefined;
     
-    // when comparing different objects no runtime error should be raised if target
-    // cannot be converted to the destination type
-    if ((a == target) && (b == target) && (c == target) && (d == target) && (e == target)) {
+    if ((a === target) && (b === target) && (c === target) && (d === target) && (e === target)) {
         return true;
     } else {
         return false;