From 169f4b2984bb7184d0de1fffc3355340ff690f38 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Tue, 22 Sep 2026 07:45:28 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20RegExp=20=E6=9E=84=E9=80=A0=E5=99=A8?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E6=A8=A1=E5=BC=8F=E5=8F=96=E5=8E=9F=E5=A7=8B?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_builtins/src/regexp.rs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/crates/oxide_builtins/src/regexp.rs b/crates/oxide_builtins/src/regexp.rs index a1092abb..75592016 100644 --- a/crates/oxide_builtins/src/regexp.rs +++ b/crates/oxide_builtins/src/regexp.rs @@ -385,20 +385,16 @@ pub fn regexp_constructor(vm: &mut H, args: &[u8]) -> NativeResult { // (lossy `to_string` 会把孤立 surrogate 单元折成 FFFD,破坏 source 往返)。 // regress 编译用 lossy 文本(其匹配语义对孤立 surrogate 本即既有缺口, // 不因本处改变)。 - // 模式为已编译 RegExp 实例时 source/flags 从其实例属性 live 读取(flags - // 参数缺省取实例 flags);其余形态按 ToString 单元序列。 + // 模式为已编译 RegExp 实例时 source/flags 取其原始模式文本(flags 参数 + // 缺省取实例 flags);其余形态按 ToString 单元序列。 let (pattern_units, flags_units) = if args.len() >= 2 { let pattern_val = vm.reg(args[1]); let re_ptr = pattern_val.as_js_object_ptr(); if pattern_val.is_object() && !re_ptr.is_null() && unsafe { &*re_ptr }.is_regexp_obj() { - let source_val = match rx_get_prop(vm, re_ptr, "source", pattern_val) { - Ok(v) => v, - Err(e) => return NativeResult::Err(e), - }; - let source = match oxide_runtime_api::to_string_value_full(source_val, vm) { - Ok(v) => v, - Err(e) => return NativeResult::Err(crate::iterator::engine_error(vm, &e)), - }; + // source 取实例原始模式字段而非 live 属性:source 访问器输出已 + // 转义文本(可安全嵌入字面量),直接编译会破坏模式匹配等价 + // (含反斜杠的模式恒失配);原始文本经同一编译器保持往返一致。 + let source = unsafe { &*re_ptr }.get_regexp_source(); let flags_val = if args.len() >= 3 { vm.reg(args[2]) } else {