瀏覽代碼

Fixed a Fiver issue (unit test added)

Marco Bambini 8 年之前
父節點
當前提交
6e59d782ea
共有 2 個文件被更改,包括 25 次插入1 次删除
  1. 3 1
      src/runtime/gravity_core.c
  2. 22 0
      test/fiber.gravity

+ 3 - 1
src/runtime/gravity_core.c

@@ -1767,7 +1767,6 @@ static bool fiber_run (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
 	#pragma unused(nargs, rindex)
 	
 	gravity_fiber_t *fiber = VALUE_AS_FIBER(GET_VALUE(0));
-	
 	if (fiber->caller != NULL) RETURN_ERROR("Fiber has already been called.");
 	
 	// remember who ran the fiber
@@ -1793,6 +1792,9 @@ static bool fiber_try (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
 static bool fiber_yield (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
 	#pragma unused(args, nargs, rindex)
 	
+    // set rindex slot to NULL in order to falsify the if closure check performed by the VM
+    gravity_vm_setslot(vm, VALUE_FROM_NULL, rindex);
+    
 	gravity_fiber_t *fiber = gravity_vm_fiber(vm);
 	gravity_vm_setfiber(vm, fiber->caller);
 	

+ 22 - 0
test/fiber.gravity

@@ -0,0 +1,22 @@
+#unittest {
+	name: "Fiber basic usage.";
+	result: 23;
+};
+
+var g = 0;
+
+func main() {
+    var fiber = Fiber.create({
+        g += 10;
+        Fiber.yield()
+        g += 10;
+    });
+    
+    g += 1;
+    fiber()
+    g += 1;
+    fiber()
+    g += 1;
+    
+    return g;
+}