diff --git a/src/vm/wren_vm.c b/src/vm/wren_vm.c index 553659e2..39bb925c 100644 --- a/src/vm/wren_vm.c +++ b/src/vm/wren_vm.c @@ -1198,6 +1198,7 @@ static WrenInterpretResult runInterpreter(WrenVM* vm, register ObjFiber* fiber) CASE_CODE(FOREIGN_CONSTRUCT): ASSERT(IS_CLASS(stackStart[0]), "'this' should be a class."); createForeign(vm, fiber, stackStart); + if (wrenHasError(fiber)) RUNTIME_ERROR(); DISPATCH(); CASE_CODE(CLOSURE): diff --git a/test/api/foreign_class.c b/test/api/foreign_class.c index 120c3653..81524804 100644 --- a/test/api/foreign_class.c +++ b/test/api/foreign_class.c @@ -82,6 +82,13 @@ static void resourceFinalize(void* data) finalized++; } +static void badClassAllocate(WrenVM* vm) +{ + wrenEnsureSlots(vm, 1); + wrenSetSlotString(vm, 0, "Something went wrong"); + wrenAbortFiber(vm, 0); +} + WrenForeignMethodFn foreignClassBindMethod(const char* signature) { if (strcmp(signature, "static ForeignClass.finalized") == 0) return apiFinalized; @@ -114,4 +121,10 @@ void foreignClassBindClass( methods->finalize = resourceFinalize; return; } + + if (strcmp(className, "BadClass") == 0) + { + methods->allocate = badClassAllocate; + return; + } } diff --git a/test/api/foreign_class.wren b/test/api/foreign_class.wren index c0b03535..b9005216 100644 --- a/test/api/foreign_class.wren +++ b/test/api/foreign_class.wren @@ -75,3 +75,13 @@ resources.clear() System.gc() System.print(ForeignClass.finalized) // expect: 3 + +// Class that aborts fiber +foreign class BadClass { + construct new() {} +} + +error = Fiber.new { + BadClass.new() +}.try() +System.print(error) // expect: Something went wrong