1
0
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:
Alexander Klingenbeck
2020-12-03 17:21:37 +01:00
committed by GitHub
parent 473392a56a
commit f5339993ce
4 changed files with 56 additions and 0 deletions

View File

@ -174,6 +174,24 @@ System.print("Caught error: " + error)
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**()
**TODO**

View File

@ -191,6 +191,15 @@ DEF_PRIMITIVE(fiber_try)
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)
{
ObjFiber* current = vm->fiber;
@ -1235,6 +1244,7 @@ void wrenInitializeCore(WrenVM* vm)
PRIMITIVE(vm->fiberClass, "transfer(_)", fiber_transfer1);
PRIMITIVE(vm->fiberClass, "transferError(_)", fiber_transferError);
PRIMITIVE(vm->fiberClass, "try()", fiber_try);
PRIMITIVE(vm->fiberClass, "try(_)", fiber_try1);
vm->fnClass = AS_CLASS(wrenFindVariable(vm, coreModule, "Fn"));
PRIMITIVE(vm->fnClass->obj.classObj, "new(_)", fn_new);

View 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

View 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