feat: substr 显式 undefined 长度取剩余全部,NaN 与负值归零

This commit is contained in:
2026-10-09 10:23:01 +00:00
parent 0c277aac10
commit bd969b4552
3 changed files with 29 additions and 22 deletions
Generated
+19 -19
View File
@@ -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",
+1 -1
View File
@@ -23,7 +23,7 @@ members = [
]
[workspace.package]
version = "0.8.98"
version = "0.8.99"
edition = "2021"
license = "MIT"
rust-version = "1.80"
+9 -2
View File
@@ -555,14 +555,21 @@ pub fn string_substr<H: VmHost>(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,
};