From 2252ed7bbcd981d228adf4fb69f2178502529747 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Tue, 22 Sep 2026 16:40:01 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20String=20=E7=9B=92=E8=BF=81=E7=A7=BB=20?= =?UTF-8?q?boxed=5Fvalue=20=E8=BD=BD=E8=8D=B7=E5=B9=B6=E7=89=A9=E5=8C=96?= =?UTF-8?q?=E5=9B=BA=E6=9C=89=E5=B1=9E=E6=80=A7=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_builtins/src/array/common.rs | 10 +- crates/oxide_builtins/src/iterator.rs | 6 +- crates/oxide_builtins/src/json.rs | 6 - crates/oxide_builtins/src/object.rs | 117 +------ crates/oxide_builtins/src/string/basic.rs | 7 +- crates/oxide_kernel/src/builtin/construct.rs | 21 ++ crates/oxide_kernel/src/builtin/rebuild.rs | 8 +- crates/oxide_kernel/src/string_forge.rs | 23 ++ crates/oxide_runtime_api/src/coercion.rs | 54 +++- crates/oxide_runtime_api/src/lib.rs | 10 +- crates/oxide_vm/src/vm_dispatch_misc.rs | 16 +- .../tests/boxed_string_exotic_tests.rs | 299 ++++++++++++++++++ .../oxide_vm/tests/builtins_string_tests.rs | 4 +- 13 files changed, 432 insertions(+), 149 deletions(-) create mode 100644 crates/oxide_vm/tests/boxed_string_exotic_tests.rs diff --git a/crates/oxide_builtins/src/array/common.rs b/crates/oxide_builtins/src/array/common.rs index f0b89a40..a1cbd889 100644 --- a/crates/oxide_builtins/src/array/common.rs +++ b/crates/oxide_builtins/src/array/common.rs @@ -139,12 +139,12 @@ pub(crate) fn arraylike_get(vm: &mut H, ptr: *mut JsObject, i: usize) /// 字符串源的 array-like 单元序列;非字符串源返回 `None`。 /// -/// String exotic 对象的 `length` 与索引属性在引擎内未物化,Array.from / -/// %TypedArray%.from 的 array-like 回退按 UTF-16 单元直接读:原始串取自身单元, -/// 装箱串取其 `[[StringData]]`(槽 0)。单元长度即 `length`,第 i 个索引为第 i 个码元。 +/// Array.from / %TypedArray%.from 的 array-like 回退按 UTF-16 单元直接读: +/// 原始串取自身单元,装箱串取其 `[[StringData]]`(boxed_value 载荷)。 +/// 单元长度即 `length`,第 i 个索引为第 i 个码元。 /// /// # 边界 -/// 装箱串槽 0 非字符串(异常形态)按非字符串源处理;指针为空返回 `None`。 +/// 装箱串载荷非字符串(异常形态)按非字符串源处理;指针为空返回 `None`。 pub(crate) fn string_arraylike_units(vm: &H, value: JsValue) -> Option> { let raw = if value.is_string() { value @@ -158,7 +158,7 @@ pub(crate) fn string_arraylike_units(vm: &H, value: JsValue) -> Optio if !obj.is_string_obj() { return None; } - let data = obj.get_prop_at(0); + let data = obj.boxed_value(); if !data.is_string() { return None; } diff --git a/crates/oxide_builtins/src/iterator.rs b/crates/oxide_builtins/src/iterator.rs index f131fc8b..fc1407e5 100644 --- a/crates/oxide_builtins/src/iterator.rs +++ b/crates/oxide_builtins/src/iterator.rs @@ -1547,10 +1547,10 @@ fn get_iterator(vm: &mut H, value: JsValue) -> Result(vm: &mut H, elem: JsValue) -> Result