diff --git a/src/jsc/bindings/bindings.cpp b/src/jsc/bindings/bindings.cpp index 57d17e089678..48e9cad873ec 100644 --- a/src/jsc/bindings/bindings.cpp +++ b/src/jsc/bindings/bindings.cpp @@ -2337,13 +2337,19 @@ extern "C" JSC::EncodedJSValue JSC__JSValue__unwrapBoxedPrimitive(JSGlobalObject return JSValue::encode(value); } + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); JSObject* object = asObject(value); if (object->inherits()) { - return JSValue::encode(jsNumber(object->toNumber(globalObject))); + double number = object->toNumber(globalObject); + RETURN_IF_EXCEPTION(scope, {}); + return JSValue::encode(jsNumber(number)); + } + if (object->inherits()) { + JSString* string = object->toString(globalObject); + RETURN_IF_EXCEPTION(scope, {}); + return JSValue::encode(string); } - if (object->inherits()) - return JSValue::encode(object->toString(globalObject)); if (object->inherits() || object->inherits()) return JSValue::encode(uncheckedDowncast(object)->internalValue()); diff --git a/test/js/bun/yaml/yaml.test.ts b/test/js/bun/yaml/yaml.test.ts index 4e99f3643fc6..a000041bb60c 100644 --- a/test/js/bun/yaml/yaml.test.ts +++ b/test/js/bun/yaml/yaml.test.ts @@ -3484,6 +3484,22 @@ config: expect(YAML.stringify(obj, null, 2)).toBe("num: \n 3.14\nstr: world\nbool: \n false"); }); + test("propagates exceptions thrown while unwrapping boxed primitives", () => { + const boxedString = new String("x"); + boxedString.toString = () => { + throw new Error("boom string"); + }; + expect(() => YAML.stringify(boxedString)).toThrow("boom string"); + expect(() => YAML.stringify({ a: boxedString })).toThrow("boom string"); + + const boxedNumber = new Number(5); + boxedNumber.valueOf = () => { + throw new Error("boom number"); + }; + expect(() => YAML.stringify(boxedNumber)).toThrow("boom number"); + expect(() => YAML.stringify([boxedNumber])).toThrow("boom number"); + }); + test("handles Date objects", () => { // Date objects get converted to ISO string via toString() const date = new Date("2024-01-15T10:30:00Z");