Browse Source

Fixed a possible GC issue (unit test added)

Marco Bambini 6 years ago
parent
commit
63fa9bf039
2 changed files with 25 additions and 2 deletions
  1. 1 2
      src/runtime/gravity_vm.c
  2. 24 0
      test/unittest/closure_gc_test.gravity

+ 1 - 2
src/runtime/gravity_vm.c

@@ -1452,9 +1452,8 @@ static bool gravity_vm_exec (gravity_vm *vm) {
                     closure->upvalue[i] = (p2) ? gravity_capture_upvalue (vm, fiber, &stackstart[p1]) : frame->closure->upvalue[p1];
                     closure->upvalue[i] = (p2) ? gravity_capture_upvalue (vm, fiber, &stackstart[p1]) : frame->closure->upvalue[p1];
                 }
                 }
                 
                 
-                // re-start GC
-                gravity_gc_setenabled(vm, true);
                 SETVALUE(r1, VALUE_FROM_OBJECT(closure));
                 SETVALUE(r1, VALUE_FROM_OBJECT(closure));
+                gravity_gc_setenabled(vm, true);
                 DISPATCH();
                 DISPATCH();
             }
             }
 
 

+ 24 - 0
test/unittest/closure_gc_test.gravity

@@ -0,0 +1,24 @@
+#unittest {
+	name: "Closure gc test.";
+	result: 0;
+};
+
+func main() {
+    for (var i in 0...100000) {
+        if (0 == (i % 1000)) {
+            //System.print("i = " + i);
+        }
+        var get_x = (func() {
+            var _x = 10;
+            func _get_x() {
+                return _x;
+            }
+            return _get_x;
+        })();
+        if(!(get_x is Closure)) {
+            return -1;
+        }
+    }
+    
+    return 0;
+}