From bd969b455203730c2e4a0f142719dda760a54cc4 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 9 Oct 2026 10:23:01 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20substr=20=E6=98=BE=E5=BC=8F=20undefined?= =?UTF-8?q?=20=E9=95=BF=E5=BA=A6=E5=8F=96=E5=89=A9=E4=BD=99=E5=85=A8?= =?UTF-8?q?=E9=83=A8=EF=BC=8CNaN=20=E4=B8=8E=E8=B4=9F=E5=80=BC=E5=BD=92?= =?UTF-8?q?=E9=9B=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 38 +++++++++++------------ Cargo.toml | 2 +- crates/oxide_builtins/src/string/basic.rs | 11 +++++-- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 92cb6d61..7d5beeeb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.8.98" +version = "0.8.99" dependencies = [ "chrono", "fast-float", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.8.98" +version = "0.8.99" dependencies = [ "num-bigint", "oxide_log", @@ -1193,7 +1193,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.8.98" +version = "0.8.99" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.8.98" +version = "0.8.99" dependencies = [ "ansi_term", "bumpalo", @@ -1226,7 +1226,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.8.98" +version = "0.8.99" dependencies = [ "lru", "oxide_bytecode", @@ -1235,7 +1235,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.8.98" +version = "0.8.99" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1255,7 +1255,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.8.98" +version = "0.8.99" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.8.98" +version = "0.8.99" dependencies = [ "num-bigint", "oxc_allocator", @@ -1284,7 +1284,7 @@ dependencies = [ [[package]] name = "oxide_engine" -version = "0.8.98" +version = "0.8.99" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1296,7 +1296,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.8.98" +version = "0.8.99" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1305,7 +1305,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.8.98" +version = "0.8.99" dependencies = [ "bumpalo", "dashmap", @@ -1319,7 +1319,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.8.98" +version = "0.8.99" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1331,7 +1331,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.8.98" +version = "0.8.99" dependencies = [ "tracing", "tracing-appender", @@ -1340,7 +1340,7 @@ dependencies = [ [[package]] name = "oxide_parser" -version = "0.8.98" +version = "0.8.99" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.8.98" +version = "0.8.99" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1371,7 +1371,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.8.98" +version = "0.8.99" dependencies = [ "num-bigint", "num-traits", @@ -1384,7 +1384,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.8.98" +version = "0.8.99" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1402,7 +1402,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.8.98" +version = "0.8.99" dependencies = [ "bumpalo", "dashmap", @@ -1415,7 +1415,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.8.98" +version = "0.8.99" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 55766950..8755effe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ members = [ ] [workspace.package] -version = "0.8.98" +version = "0.8.99" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_builtins/src/string/basic.rs b/crates/oxide_builtins/src/string/basic.rs index 6eb759a3..c2998fd0 100644 --- a/crates/oxide_builtins/src/string/basic.rs +++ b/crates/oxide_builtins/src/string/basic.rs @@ -555,14 +555,21 @@ pub fn string_substr(vm: &mut H, args: &[u8]) -> NativeResult { } None => 0, }; - // length:负 → 0;+Inf 取剩余全部。 + // length:显式 undefined → 剩余全部(规范步 8,ToIntegerOrInfinity 会把 + // NaN 归零,无法区分显式 undefined 与 NaN,须先判值形态);其余经 + // ToIntegerOrInfinity 传播式,负/NaN → 0、+Inf → 剩余全部,夹到剩余。 let length = match length_arg { + Some(v) if v.is_undefined() => len - start, Some(v) => { let p = match to_integer_or_infinity_bounded(vm, v) { Ok(p) => p, Err(exc) => return NativeResult::Err(exc), }; - p.max(0.0) as usize + if p > 0.0 && p.is_infinite() { + len - start + } else { + p.max(0.0) as usize + } } None => len - start, };