From 6ffb4d465326331f1404ceca1c66a2cf7ee0e4ed Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Mon, 21 Sep 2026 16:35:17 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20matchAll=20flags=20=E8=AF=BB=E8=B5=B0=20?= =?UTF-8?q?Get=20=E8=AF=AD=E4=B9=89=E4=BC=A0=E6=92=AD=20getter=20=E6=8A=9B?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_builtins/src/regexp.rs | 2 +- crates/oxide_builtins/src/string/regex.rs | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/crates/oxide_builtins/src/regexp.rs b/crates/oxide_builtins/src/regexp.rs index 65a0b672..a4d89830 100644 --- a/crates/oxide_builtins/src/regexp.rs +++ b/crates/oxide_builtins/src/regexp.rs @@ -105,7 +105,7 @@ fn rx_set_prop( /// live 语义读 flags 串:ToString(Get(rx, "flags")),getter 抛错与 /// ToString 抛错均传播原异常。 -fn rx_get_flags(vm: &mut H, rx: *mut JsObject, this_val: JsValue) -> Result { +pub fn rx_get_flags(vm: &mut H, rx: *mut JsObject, this_val: JsValue) -> Result { let val = rx_get_prop(vm, rx, "flags", this_val)?; // 回退文案用原始文本("TypeError: " 前缀恢复错误种类)。 let s = match oxide_runtime_api::to_string_value_full(val, vm) { diff --git a/crates/oxide_builtins/src/string/regex.rs b/crates/oxide_builtins/src/string/regex.rs index 29d142ba..9cf64a94 100644 --- a/crates/oxide_builtins/src/string/regex.rs +++ b/crates/oxide_builtins/src/string/regex.rs @@ -789,9 +789,12 @@ pub fn string_match_all(vm: &mut H, args: &[u8]) -> NativeResult { let re_obj = if is_regexp_obj(pattern_val, vm) { let re_ptr = pattern_val.as_js_object_ptr(); - let re = unsafe { &*re_ptr }; - let is_global = crate::regexp::regexp_has_flag(vm, re, 'g'); - if !is_global { + // 规范:Get(rx, "flags") → ToString → 含 "g" 判定;getter 抛错传播。 + let flags = match crate::regexp::rx_get_flags(vm, re_ptr, pattern_val) { + Ok(f) => f, + Err(e) => return NativeResult::Err(e), + }; + if !flags.contains('g') { return NativeResult::Err(crate::error::create_type_error( vm, "String.prototype.matchAll: regex must have global flag",