fix: 排序默认比较改 UTF-16 码元序

This commit is contained in:
2026-10-05 09:55:41 +00:00
parent 88107f45c5
commit a1cbb82fb6
5 changed files with 44 additions and 23 deletions
+1 -1
View File
@@ -75,7 +75,7 @@ pub fn array_with<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
/// # 边界与前提
/// - 先校验 compareFn 可调用(非 undefined 且不可调用则抛 TypeError),再读取
/// this/length;
/// - 未提供比较回调时按 ToString 结果的字符串字典序排序;底层 `sort_by` 为稳定
/// - 未提供比较回调时按 ToString 结果的 UTF-16 码元字典序排序;底层 `sort_by` 为稳定
/// 排序,比较结果相等的元素保持原有相对次序。
pub fn array_to_sorted<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
builtins_debug!("Array.prototype.toSorted called with {} args", args.len());
@@ -16,7 +16,7 @@ use super::common::{
/// 对元素向量执行 `Array.prototype.sort` 的比较语义(原地排序)。
///
/// 默认按 ToString 结果的字符串字典序比较;提供比较回调时按其返回值
/// 默认按 ToString 结果的 UTF-16 码元字典序比较;提供比较回调时按其返回值
///(<0/=0/>0)决定次序,回调抛错则中止并把异常原样返回。
pub(crate) fn sort_values_inner<H: VmHost>(
vm: &mut H, vals: &mut [JsValue], comparator: Option<JsValue>,
@@ -48,9 +48,12 @@ pub(crate) fn sort_values_inner<H: VmHost>(
}
}
} else {
// 规范 CompareArrayElements 对 ToString 结果做关系比较,字符串按
// UTF-16 码元字典序;码元序列比较与码点序在补充平面字符处分歧,
// 此处以码元序为准。
let sa = oxide_runtime_api::to_string(*a);
let sb = oxide_runtime_api::to_string(*b);
sa.cmp(&sb)
sa.encode_utf16().cmp(sb.encode_utf16())
}
});
if let Some(err) = sort_error {
@@ -72,7 +75,7 @@ pub(crate) fn parse_sort_comparator<H: VmHost>(vm: &mut H, candidate: JsValue) -
/// 原地排序数组元素并返回原数组(`Array.prototype.sort`)。
///
/// 未提供比较回调时按 ToString 结果的字符串字典序排序;底层 `sort_by` 为稳定
/// 未提供比较回调时按 ToString 结果的 UTF-16 码元字典序排序;底层 `sort_by` 为稳定
/// 排序,比较结果相等(含 NaN)的元素保持原有相对次序。洞位不参与比较:
/// present 值稳定排序后自索引 0 紧凑写回,尾部空位转为洞。
///