feat: add Fiber.transferError and allow non-string error objects in fiber abort
Refactor runtime error handling to store errors directly in the fiber's error field instead of on the stack, enabling any object (except null) as an error value. Add Fiber.transferError(_) primitive for transferring errors between fibers. Update validation helpers to accept Value arguments directly and modify RETURN_ERROR macro to set fiber error. Adjust GC marking to use wrenMarkValue for the error field. Add tests for aborting with non-string errors and null abort behavior.
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
var fiber = Fiber.new {
|
||||
Fiber.abort(123)
|
||||
}
|
||||
|
||||
System.print(fiber.try()) // expect: 123
|
||||
System.print(fiber.isDone) // expect: true
|
||||
System.print(fiber.error) // expect: 123
|
||||
@@ -0,0 +1,9 @@
|
||||
var fiber = Fiber.new {
|
||||
Fiber.abort(null)
|
||||
System.print("get here") // expect: get here
|
||||
Fiber.yield("value")
|
||||
}
|
||||
|
||||
System.print(fiber.try()) // expect: value
|
||||
System.print(fiber.isDone) // expect: false
|
||||
System.print(fiber.error) // expect: null
|
||||
@@ -1 +0,0 @@
|
||||
Fiber.abort(123) // expect runtime error: Error message must be a string.
|
||||
@@ -0,0 +1,15 @@
|
||||
var A = Fiber.new {
|
||||
System.print("transferred to A")
|
||||
B.transferError("error!")
|
||||
}
|
||||
|
||||
var B = Fiber.new {
|
||||
System.print("started B")
|
||||
A.transfer()
|
||||
System.print("should not get here")
|
||||
}
|
||||
|
||||
B.try()
|
||||
// expect: started B
|
||||
// expect: transferred to A
|
||||
System.print(B.error) // expect: error!
|
||||
@@ -0,0 +1,10 @@
|
||||
var A = Fiber.new {
|
||||
B.transferError(123)
|
||||
}
|
||||
|
||||
var B = Fiber.new {
|
||||
A.transfer()
|
||||
}
|
||||
|
||||
B.try()
|
||||
System.print(B.error) // expect: 123
|
||||
Reference in New Issue
Block a user