mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-25 03:01:12 +08:00
feat: 实现 Iterator.zip 构造期与 shortest 迭代
This commit is contained in:
@@ -7,7 +7,7 @@ use crate::bindings::{
|
||||
configure_native_constructor, BindEnv,
|
||||
};
|
||||
|
||||
/// 绑定 `Iterator` 全局构造器(`prototype` = %IteratorPrototype%、`from` 方法)。
|
||||
/// 绑定 `Iterator` 全局构造器(`prototype` = %IteratorPrototype%、`from`/`zip` 方法)。
|
||||
///
|
||||
/// 迭代器原型方法(%IteratorPrototype% 的 `@@iterator` 与各集合原型 `next`)由
|
||||
/// `rebind_dirty_builtins` 的 object 分支统一安装,本入口不重复绑定,避免
|
||||
@@ -27,7 +27,10 @@ pub fn bind_iterator(env: BindEnv<'_>, global: &mut JsObject) {
|
||||
apply_binding_table(
|
||||
env,
|
||||
&mut iterator,
|
||||
&[("from", oxide_builtins::iterator::iterator_from::<crate::vm::Vm> as *const (), 1)],
|
||||
&[
|
||||
("from", oxide_builtins::iterator::iterator_from::<crate::vm::Vm> as *const (), 1),
|
||||
("zip", oxide_builtins::iterator::iterator_zip::<crate::vm::Vm> as *const (), 1),
|
||||
],
|
||||
);
|
||||
|
||||
let iterator_ptr = Box::into_raw(iterator);
|
||||
|
||||
@@ -963,7 +963,10 @@ fn bind_iterator_global(env: BindEnv<'_>, global: &mut JsObject) {
|
||||
apply_binding_table(
|
||||
env,
|
||||
&mut iterator,
|
||||
&[("from", oxide_builtins::iterator::iterator_from::<crate::vm::Vm> as *const (), 1)],
|
||||
&[
|
||||
("from", oxide_builtins::iterator::iterator_from::<crate::vm::Vm> as *const (), 1),
|
||||
("zip", oxide_builtins::iterator::iterator_zip::<crate::vm::Vm> as *const (), 1),
|
||||
],
|
||||
);
|
||||
let iterator_ptr = Box::into_raw(iterator);
|
||||
env.world().track_leaked_object(iterator_ptr);
|
||||
|
||||
@@ -577,12 +577,21 @@ impl Vm {
|
||||
callee_mut.set_prop_at(slot, JsValue::undefined());
|
||||
}
|
||||
}
|
||||
// 弹帧后活动镜像切回新栈顶的表(帧空即顶层空切片)。
|
||||
self.active_upvalues = self
|
||||
.frames
|
||||
.last()
|
||||
.map(|f| f.upvalues)
|
||||
.unwrap_or(std::ptr::slice_from_raw_parts(std::ptr::null(), 0));
|
||||
// 弹帧后活动镜像切回新栈顶的表(帧空即顶层空切片)。内联执行期间弹回
|
||||
// 基线时新栈顶不是内联函数本身(它无帧),须恢复内联目标函数的 upvalue
|
||||
// 表,否则其闭包捕获继续读外层帧的表,读到错 cell。
|
||||
let inline_upvalues = self.inline_callee.as_ref().map(|callee| {
|
||||
let obj = unsafe { &*callee.as_js_object_ptr() };
|
||||
obj.upvalues_slice() as *const [*mut Cell]
|
||||
});
|
||||
self.active_upvalues = match (inline_upvalues, self.frames.len() <= self.inline_frames_base) {
|
||||
(Some(up), true) => up,
|
||||
_ => self
|
||||
.frames
|
||||
.last()
|
||||
.map(|f| f.upvalues)
|
||||
.unwrap_or(std::ptr::slice_from_raw_parts(std::ptr::null(), 0)),
|
||||
};
|
||||
if let Some(saved_bc) = self.saved_bytecode_stack.pop() {
|
||||
self.bytecode = saved_bc;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user