From fe2042864c6ac4b9a64f2b0be893724b785fd39e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=E7=89=B9=E6=AF=8F=E7=BE=8A=E9=98=9F?= Date: Sat, 27 Jun 2026 13:22:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=20Object/Array=20?= =?UTF-8?q?=E7=9A=84=20toString=20=E4=B8=8E=20valueOf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_builtins/src/array.rs | 6 ++++++ crates/oxide_builtins/src/object.rs | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/crates/oxide_builtins/src/array.rs b/crates/oxide_builtins/src/array.rs index 66c123e..8dd0ad1 100644 --- a/crates/oxide_builtins/src/array.rs +++ b/crates/oxide_builtins/src/array.rs @@ -342,6 +342,12 @@ pub fn array_join(vm: &mut H, args: &[u8]) -> NativeResult { NativeResult::Ok(result_val) } +pub fn array_to_string(vm: &mut H, args: &[u8]) -> NativeResult { + // Array.prototype.toString() delegates to join with the default "," separator, + // ignoring its own arguments per spec. + array_join(vm, &[args[0]]) +} + pub fn array_index_of(vm: &mut H, args: &[u8]) -> NativeResult { builtins_debug!("Array.prototype.indexOf called with {} args", args.len()); let arr_ptr = array_ptr!(vm, args); diff --git a/crates/oxide_builtins/src/object.rs b/crates/oxide_builtins/src/object.rs index 8758769..654d78f 100644 --- a/crates/oxide_builtins/src/object.rs +++ b/crates/oxide_builtins/src/object.rs @@ -459,6 +459,18 @@ pub fn object_has_own(vm: &mut H, args: &[u8]) -> NativeResult { NativeResult::Ok(JsValue::bool(vm.get_own_property_slot(obj, key_si).is_some())) } +pub fn object_proto_value_of(vm: &mut H, args: &[u8]) -> NativeResult { + // Object.prototype.valueOf returns the `this` object unchanged; OrdinaryToPrimitive + // then falls through to toString since the result is not primitive. + NativeResult::Ok(vm.reg(args[0])) +} + +pub fn object_proto_to_string(vm: &mut H, _args: &[u8]) -> NativeResult { + // ponytail: minimal [[Class]] string — always "[object Object]". Type-specific + // tags ("[object Array]" etc.) and Symbol.toStringTag are a later refinement. + NativeResult::Ok(vm.new_string("[object Object]")) +} + pub fn object_proto_has_own_property(vm: &mut H, args: &[u8]) -> NativeResult { if args.len() < 2 { return NativeResult::Ok(JsValue::bool(false));