From 0efc9e1516c405d363a184584df49eb38ad7f61e Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 9 Oct 2026 16:09:53 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20GetAsyncIterator=20=E5=B7=B2=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E9=9D=9E=E5=8F=AF=E8=B0=83=E7=94=A8=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=8A=9B=20TypeError=EF=BC=8C=E8=A1=A5=E9=BD=90=E4=B8=89?= =?UTF-8?q?=E6=80=81=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 38 ++++----- Cargo.toml | 2 +- crates/oxide_vm/src/async_from_sync.rs | 15 +++- .../tests/async_gen_delegation_tests.rs | 77 +++++++++++++++++++ 4 files changed, 108 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e4ddfc4..9a219c57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.13.9" +version = "0.13.10" dependencies = [ "chrono", "fast-float", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.13.9" +version = "0.13.10" dependencies = [ "num-bigint", "oxide_log", @@ -1193,7 +1193,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.13.9" +version = "0.13.10" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.13.9" +version = "0.13.10" dependencies = [ "ansi_term", "bumpalo", @@ -1226,7 +1226,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.13.9" +version = "0.13.10" dependencies = [ "lru", "oxide_bytecode", @@ -1235,7 +1235,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.13.9" +version = "0.13.10" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1255,7 +1255,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.13.9" +version = "0.13.10" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.13.9" +version = "0.13.10" dependencies = [ "num-bigint", "oxc_allocator", @@ -1284,7 +1284,7 @@ dependencies = [ [[package]] name = "oxide_engine" -version = "0.13.9" +version = "0.13.10" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1296,7 +1296,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.13.9" +version = "0.13.10" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1305,7 +1305,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.13.9" +version = "0.13.10" dependencies = [ "bumpalo", "dashmap", @@ -1319,7 +1319,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.13.9" +version = "0.13.10" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1331,7 +1331,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.13.9" +version = "0.13.10" dependencies = [ "tracing", "tracing-appender", @@ -1340,7 +1340,7 @@ dependencies = [ [[package]] name = "oxide_parser" -version = "0.13.9" +version = "0.13.10" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.13.9" +version = "0.13.10" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1371,7 +1371,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.13.9" +version = "0.13.10" dependencies = [ "num-bigint", "num-traits", @@ -1384,7 +1384,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.13.9" +version = "0.13.10" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1402,7 +1402,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.13.9" +version = "0.13.10" dependencies = [ "bumpalo", "dashmap", @@ -1415,7 +1415,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.13.9" +version = "0.13.10" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index da15246f..ff878789 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ members = [ ] [workspace.package] -version = "0.13.9" +version = "0.13.10" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_vm/src/async_from_sync.rs b/crates/oxide_vm/src/async_from_sync.rs index 3fbc96e8..0129cb24 100644 --- a/crates/oxide_vm/src/async_from_sync.rs +++ b/crates/oxide_vm/src/async_from_sync.rs @@ -19,16 +19,19 @@ const INNER_PROP: &str = "__inner__"; /// `@@asyncIterator` 的 well-known symbol 键序号。 const ASYNC_ITERATOR_SYMBOL_ID: u32 = 8; -/// GetAsyncIterator(ECMA-262):取 `value[@@asyncIterator]`,不可调用时回退同步 -/// 迭代器并包 AsyncFromSyncIterator。 +/// GetAsyncIterator(ECMA-262):取 `value[@@asyncIterator]`,可调用则调用; +/// undefined/null 时回退同步迭代器并包 AsyncFromSyncIterator; +/// 已定义但不可调用时抛 TypeError。 /// /// # 步骤 /// 1. ToObject 后读取 `@@asyncIterator`,可调用则调用并校验结果为对象。 -/// 2. 否则经同步迭代协议取迭代器包装器,包成 AsyncFromSyncIterator。 +/// 2. 已定义但不可调用时抛 TypeError(GetMethod 步 4)。 +/// 3. undefined/null 时经同步迭代协议取迭代器包装器,包成 AsyncFromSyncIterator。 /// /// # 返回值 /// - `Ok(iterator)`:异步迭代器对象; -/// - `Err`:`@@asyncIterator` getter/调用抛错或 ToObject 失败,透传原异常值。 +/// - `Err`:`@@asyncIterator` getter/调用抛错或 ToObject 失败(透传原异常值), +/// 或已定义但不可调用(构造 TypeError)。 pub(crate) fn make_async_iterator(vm: &mut Vm, value: JsValue) -> Result { let obj_value = if value.is_object() { value @@ -69,6 +72,10 @@ pub(crate) fn make_async_iterator(vm: &mut Vm, value: JsValue) -> Result