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:
Bob Nystrom
2015-09-30 05:57:03 +00:00
parent f6c36ec85b
commit 2dcb3660b5
14 changed files with 285 additions and 269 deletions
+7
View File
@@ -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
+9
View File
@@ -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.
+15
View File
@@ -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