From 63d0004802a02ca318b01511ba5c1af5e620155a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Sun, 6 Sep 2026 13:02:08 +0200 Subject: [PATCH 1/2] fix(node:v8): reject constructor calls without new --- .../src/object/native_module_dispatch/dispatch_v_z.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/crates/perry-runtime/src/object/native_module_dispatch/dispatch_v_z.rs b/crates/perry-runtime/src/object/native_module_dispatch/dispatch_v_z.rs index c3e9c250db..199210e86a 100644 --- a/crates/perry-runtime/src/object/native_module_dispatch/dispatch_v_z.rs +++ b/crates/perry-runtime/src/object/native_module_dispatch/dispatch_v_z.rs @@ -39,6 +39,14 @@ pub(crate) unsafe fn nm_dispatch_v8(ctx: &NmCtx, module_name: &str, method_name: typed_kind ); match (module_name, method_name) { + ("v8", name @ ("Serializer" | "Deserializer")) => { + let message = format!("Class constructor {name} cannot be invoked without 'new'"); + crate::fs::validate::throw_type_error_with_code(&message, "ERR_CONSTRUCT_CALL_REQUIRED") + } + ("v8", name @ ("DefaultSerializer" | "DefaultDeserializer" | "GCProfiler")) => { + let message = format!("Class constructor {name} cannot be invoked without 'new'"); + crate::node_submodules::diagnostics::throw_type_error_no_code(message.as_bytes()) + } ("v8", "serialize") => crate::node_v8::js_v8_serialize(arg(0)), ("v8", "deserialize") => crate::node_v8::js_v8_deserialize(arg(0)), ("v8", "getHeapStatistics") => crate::node_v8::js_v8_get_heap_statistics(), From b13ab40e85304f2c26a8e25c99762e9440517c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Sun, 6 Sep 2026 13:02:55 +0200 Subject: [PATCH 2/2] chore: add PR 9876 changeset --- changelog.d/9876-v8-constructor-validation.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/9876-v8-constructor-validation.md diff --git a/changelog.d/9876-v8-constructor-validation.md b/changelog.d/9876-v8-constructor-validation.md new file mode 100644 index 0000000000..fd44026e82 --- /dev/null +++ b/changelog.d/9876-v8-constructor-validation.md @@ -0,0 +1 @@ +Make the `node:v8` class exports throw Node-compatible `TypeError` values when called without `new`, including the expected `ERR_CONSTRUCT_CALL_REQUIRED` code for `Serializer` and `Deserializer`.