diff --git a/src/wren_core.c b/src/wren_core.c index 2df1d1b8..d95da080 100644 --- a/src/wren_core.c +++ b/src/wren_core.c @@ -224,6 +224,15 @@ DEF_NATIVE(fiber_new) RETURN_OBJ(newFiber); } +DEF_NATIVE(fiber_abort) +{ + if (!validateString(vm, args, 1, "Error message")) return PRIM_ERROR; + + // Move the error message to the return position. + args[0] = args[1]; + return PRIM_ERROR; +} + DEF_NATIVE(fiber_call) { ObjFiber* runFiber = AS_FIBER(args[0]); @@ -1048,6 +1057,7 @@ void wrenInitializeCore(WrenVM* vm) vm->fiberClass = defineClass(vm, "Fiber"); NATIVE(vm->fiberClass->obj.classObj, " instantiate", fiber_instantiate); NATIVE(vm->fiberClass->obj.classObj, "new ", fiber_new); + NATIVE(vm->fiberClass->obj.classObj, "abort ", fiber_abort); NATIVE(vm->fiberClass->obj.classObj, "yield", fiber_yield); NATIVE(vm->fiberClass->obj.classObj, "yield ", fiber_yield1); NATIVE(vm->fiberClass, "call", fiber_call); diff --git a/test/fiber/abort.wren b/test/fiber/abort.wren new file mode 100644 index 00000000..d122f169 --- /dev/null +++ b/test/fiber/abort.wren @@ -0,0 +1,7 @@ +var fiber = new Fiber { + Fiber.abort("Error message.") +} + +IO.print(fiber.try) // expect: Error message. +IO.print(fiber.isDone) // expect: true +IO.print(fiber.error) // expect: Error message. diff --git a/test/fiber/abort_main_fiber.wren b/test/fiber/abort_main_fiber.wren new file mode 100644 index 00000000..d33aee1c --- /dev/null +++ b/test/fiber/abort_main_fiber.wren @@ -0,0 +1 @@ +Fiber.abort("Abort!") // expect runtime error: Abort! diff --git a/test/fiber/abort_wrong_arg_type.wren b/test/fiber/abort_wrong_arg_type.wren new file mode 100644 index 00000000..40f4caa3 --- /dev/null +++ b/test/fiber/abort_wrong_arg_type.wren @@ -0,0 +1 @@ +Fiber.abort(123) // expect runtime error: Error message must be a string.