forked from Mirror/wren
Add support for Fiber.try(_) (#835)
* Add support for Fiber.try(_) * Add documentation for Fiber.try(_) * Add another test for Fiber.try(_)
This commit is contained in:
committed by
GitHub
parent
473392a56a
commit
f5339993ce
@ -174,6 +174,24 @@ System.print("Caught error: " + error)
|
|||||||
|
|
||||||
If the called fiber raises an error, it can no longer be used.
|
If the called fiber raises an error, it can no longer be used.
|
||||||
|
|
||||||
|
### **try**(value)
|
||||||
|
Tries to run the fiber. If a runtime error occurs
|
||||||
|
in the called fiber, the error is captured and is returned as a string.
|
||||||
|
If the fiber is being
|
||||||
|
started for the first time, and its function takes a parameter, `value` is
|
||||||
|
passed to it.
|
||||||
|
|
||||||
|
<pre class="snippet">
|
||||||
|
var fiber = Fiber.new {|value|
|
||||||
|
value.badMethod
|
||||||
|
}
|
||||||
|
|
||||||
|
var error = fiber.try("just a string")
|
||||||
|
System.print("Caught error: " + error)
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
If the called fiber raises an error, it can no longer be used.
|
||||||
|
|
||||||
### **transfer**()
|
### **transfer**()
|
||||||
|
|
||||||
**TODO**
|
**TODO**
|
||||||
|
|||||||
@ -191,6 +191,15 @@ DEF_PRIMITIVE(fiber_try)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEF_PRIMITIVE(fiber_try1)
|
||||||
|
{
|
||||||
|
runFiber(vm, AS_FIBER(args[0]), args, true, true, "try");
|
||||||
|
|
||||||
|
// If we're switching to a valid fiber to try, remember that we're trying it.
|
||||||
|
if (!wrenHasError(vm->fiber)) vm->fiber->state = FIBER_TRY;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
DEF_PRIMITIVE(fiber_yield)
|
DEF_PRIMITIVE(fiber_yield)
|
||||||
{
|
{
|
||||||
ObjFiber* current = vm->fiber;
|
ObjFiber* current = vm->fiber;
|
||||||
@ -1235,6 +1244,7 @@ void wrenInitializeCore(WrenVM* vm)
|
|||||||
PRIMITIVE(vm->fiberClass, "transfer(_)", fiber_transfer1);
|
PRIMITIVE(vm->fiberClass, "transfer(_)", fiber_transfer1);
|
||||||
PRIMITIVE(vm->fiberClass, "transferError(_)", fiber_transferError);
|
PRIMITIVE(vm->fiberClass, "transferError(_)", fiber_transferError);
|
||||||
PRIMITIVE(vm->fiberClass, "try()", fiber_try);
|
PRIMITIVE(vm->fiberClass, "try()", fiber_try);
|
||||||
|
PRIMITIVE(vm->fiberClass, "try(_)", fiber_try1);
|
||||||
|
|
||||||
vm->fnClass = AS_CLASS(wrenFindVariable(vm, coreModule, "Fn"));
|
vm->fnClass = AS_CLASS(wrenFindVariable(vm, coreModule, "Fn"));
|
||||||
PRIMITIVE(vm->fnClass->obj.classObj, "new(_)", fn_new);
|
PRIMITIVE(vm->fnClass->obj.classObj, "new(_)", fn_new);
|
||||||
|
|||||||
12
test/core/fiber/try_value.wren
Normal file
12
test/core/fiber/try_value.wren
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
var fiber = Fiber.new {|v|
|
||||||
|
System.print("before")
|
||||||
|
System.print(v)
|
||||||
|
true.unknownMethod
|
||||||
|
System.print("after")
|
||||||
|
}
|
||||||
|
|
||||||
|
System.print(fiber.try("value"))
|
||||||
|
// expect: before
|
||||||
|
// expect: value
|
||||||
|
// expect: Bool does not implement 'unknownMethod'.
|
||||||
|
System.print("after try") // expect: after try
|
||||||
16
test/core/fiber/try_value_yield.wren
Normal file
16
test/core/fiber/try_value_yield.wren
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
var fiber = Fiber.new {|v|
|
||||||
|
System.print("before")
|
||||||
|
System.print(v)
|
||||||
|
v = Fiber.yield()
|
||||||
|
System.print(v)
|
||||||
|
true.unknownMethod
|
||||||
|
System.print("after")
|
||||||
|
}
|
||||||
|
|
||||||
|
fiber.try("value1")
|
||||||
|
// expect: before
|
||||||
|
// expect: value1
|
||||||
|
System.print(fiber.try("value2"))
|
||||||
|
// expect: value2
|
||||||
|
// expect: Bool does not implement 'unknownMethod'.
|
||||||
|
System.print("after try") // expect: after try
|
||||||
Reference in New Issue
Block a user