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.
|
||||
|
||||
### **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**
|
||||
|
||||
@ -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);
|
||||
|
||||
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