mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-27 04:01:11 +08:00
fix: pad 目标长度上界对齐 V8 串长上限
This commit is contained in:
@@ -9,6 +9,9 @@ use crate::builtins_error;
|
|||||||
use super::common::try_string;
|
use super::common::try_string;
|
||||||
use super::{as_units, find_units, is_trim_unit, map_well_formed_segments, rfind_units, this_units};
|
use super::{as_units, find_units, is_trim_unit, map_well_formed_segments, rfind_units, this_units};
|
||||||
|
|
||||||
|
// 串长上界(V8 kMaxStringLength,node 20.19.2 逐位核):pad 目标长度越界抛 RangeError。
|
||||||
|
const MAX_STRING_LENGTH: usize = 536870888;
|
||||||
|
|
||||||
// ── 静态方法 / 构造 ─────────────────────────────────────────────────────
|
// ── 静态方法 / 构造 ─────────────────────────────────────────────────────
|
||||||
|
|
||||||
/// `String.fromCharCode(...codes)`:各参数经 ToUint16(ToNumber) 转单元拼接
|
/// `String.fromCharCode(...codes)`:各参数经 ToUint16(ToNumber) 转单元拼接
|
||||||
@@ -655,8 +658,8 @@ pub fn string_pad_start<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
// 可观察操作序由规范钉死:receiver ToString 先行,后 targetLength 转换,
|
// 可观察操作序由规范钉死:receiver ToString 先行,后 targetLength 转换,
|
||||||
// 再 padString ToString。
|
// 再 padString ToString。
|
||||||
let s: Vec<u16> = try_string!(this_units(vm, args)).into_owned();
|
let s: Vec<u16> = try_string!(this_units(vm, args)).into_owned();
|
||||||
// targetLength:ToIntegerOrInfinity 传播式,负值归 0;+Inf 经既有 10000
|
// targetLength:ToIntegerOrInfinity 传播式,负值归 0;+Inf 经既有串长
|
||||||
// 上限检查自然落 RangeError。
|
// 上限(536870888)检查自然落 RangeError。
|
||||||
let target = if args.len() > 1 {
|
let target = if args.len() > 1 {
|
||||||
let p = match to_integer_or_infinity_bounded(vm, vm.reg(args[1])) {
|
let p = match to_integer_or_infinity_bounded(vm, vm.reg(args[1])) {
|
||||||
Ok(p) => p,
|
Ok(p) => p,
|
||||||
@@ -679,8 +682,7 @@ pub fn string_pad_start<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
if s_len >= target {
|
if s_len >= target {
|
||||||
return NativeResult::Ok(vm.new_string_units_owned(s));
|
return NativeResult::Ok(vm.new_string_units_owned(s));
|
||||||
}
|
}
|
||||||
if target > 10000 {
|
if target > MAX_STRING_LENGTH {
|
||||||
builtins_error!("String.prototype.padStart: invalid receiver");
|
|
||||||
return NativeResult::Err(crate::error::create_range_error(vm, "Invalid string length"));
|
return NativeResult::Err(crate::error::create_range_error(vm, "Invalid string length"));
|
||||||
}
|
}
|
||||||
if pad.is_empty() {
|
if pad.is_empty() {
|
||||||
@@ -707,8 +709,8 @@ pub fn string_pad_end<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
// 可观察操作序由规范钉死:receiver ToString 先行,后 targetLength 转换,
|
// 可观察操作序由规范钉死:receiver ToString 先行,后 targetLength 转换,
|
||||||
// 再 padString ToString。
|
// 再 padString ToString。
|
||||||
let s: Vec<u16> = try_string!(this_units(vm, args)).into_owned();
|
let s: Vec<u16> = try_string!(this_units(vm, args)).into_owned();
|
||||||
// targetLength:ToIntegerOrInfinity 传播式,负值归 0;+Inf 经既有 10000
|
// targetLength:ToIntegerOrInfinity 传播式,负值归 0;+Inf 经既有串长
|
||||||
// 上限检查自然落 RangeError。
|
// 上限(536870888)检查自然落 RangeError。
|
||||||
let target = if args.len() > 1 {
|
let target = if args.len() > 1 {
|
||||||
let p = match to_integer_or_infinity_bounded(vm, vm.reg(args[1])) {
|
let p = match to_integer_or_infinity_bounded(vm, vm.reg(args[1])) {
|
||||||
Ok(p) => p,
|
Ok(p) => p,
|
||||||
@@ -731,8 +733,7 @@ pub fn string_pad_end<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
if s_len >= target {
|
if s_len >= target {
|
||||||
return NativeResult::Ok(vm.new_string_units_owned(s));
|
return NativeResult::Ok(vm.new_string_units_owned(s));
|
||||||
}
|
}
|
||||||
if target > 10000 {
|
if target > MAX_STRING_LENGTH {
|
||||||
builtins_error!("String.prototype.padEnd: invalid receiver");
|
|
||||||
return NativeResult::Err(crate::error::create_range_error(vm, "Invalid string length"));
|
return NativeResult::Err(crate::error::create_range_error(vm, "Invalid string length"));
|
||||||
}
|
}
|
||||||
if pad.is_empty() {
|
if pad.is_empty() {
|
||||||
|
|||||||
Reference in New Issue
Block a user