From a458889ccdb5385be4326b3763e67e08a07a810e Mon Sep 17 00:00:00 2001 From: Dean Srebnik <49134864+load1n9@users.noreply.github.com> Date: Mon, 27 Jan 2025 14:41:26 -0500 Subject: [PATCH] feat: move set behind a feature --- nova_vm/Cargo.toml | 4 +- nova_vm/src/ecmascript/builtins.rs | 1 + .../ecmascript/builtins/keyed_collections.rs | 1 + nova_vm/src/ecmascript/builtins/ordinary.rs | 25 +++--- nova_vm/src/ecmascript/execution/realm.rs | 24 +++--- .../ecmascript/execution/realm/intrinsics.rs | 28 ++++--- nova_vm/src/ecmascript/types/language.rs | 6 +- .../src/ecmascript/types/language/object.rs | 84 +++++++++++++++++-- .../src/ecmascript/types/language/value.rs | 26 ++++-- nova_vm/src/engine/bytecode/vm.rs | 5 +- nova_vm/src/engine/rootable.rs | 37 +++++--- nova_vm/src/heap.rs | 15 ++-- nova_vm/src/heap/heap_bits.rs | 31 +++++-- nova_vm/src/heap/heap_gc.rs | 68 ++++++++------- nova_vm/src/heap/indexes.rs | 23 +++-- 15 files changed, 263 insertions(+), 115 deletions(-) diff --git a/nova_vm/Cargo.toml b/nova_vm/Cargo.toml index 6200fc72c..cb5f75f78 100644 --- a/nova_vm/Cargo.toml +++ b/nova_vm/Cargo.toml @@ -40,7 +40,8 @@ default = [ "shared-array-buffer", "weak-refs", "atomics", - "regexp" + "regexp", + "set" ] array-buffer = [] atomics = ["array-buffer", "shared-array-buffer"] @@ -51,6 +52,7 @@ math = [] regexp = [] shared-array-buffer = [] weak-refs = [] +set = [] typescript = [] [build-dependencies] diff --git a/nova_vm/src/ecmascript/builtins.rs b/nova_vm/src/ecmascript/builtins.rs index 43d0e21b3..ade9f5628 100644 --- a/nova_vm/src/ecmascript/builtins.rs +++ b/nova_vm/src/ecmascript/builtins.rs @@ -39,6 +39,7 @@ pub(crate) mod proxy; pub(crate) mod reflection; #[cfg(feature = "regexp")] pub(crate) mod regexp; +#[cfg(feature = "set")] pub(crate) mod set; #[cfg(feature = "shared-array-buffer")] pub(crate) mod shared_array_buffer; diff --git a/nova_vm/src/ecmascript/builtins/keyed_collections.rs b/nova_vm/src/ecmascript/builtins/keyed_collections.rs index 85dacf765..f8eda512e 100644 --- a/nova_vm/src/ecmascript/builtins/keyed_collections.rs +++ b/nova_vm/src/ecmascript/builtins/keyed_collections.rs @@ -3,6 +3,7 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. pub(crate) mod map_objects; +#[cfg(feature = "set")] pub(crate) mod set_objects; #[cfg(feature = "weak-refs")] pub(crate) mod weak_map_objects; diff --git a/nova_vm/src/ecmascript/builtins/ordinary.rs b/nova_vm/src/ecmascript/builtins/ordinary.rs index ff5c28e6b..69cac9bae 100644 --- a/nova_vm/src/ecmascript/builtins/ordinary.rs +++ b/nova_vm/src/ecmascript/builtins/ordinary.rs @@ -38,25 +38,22 @@ use super::regexp::RegExpHeapData; #[cfg(feature = "shared-array-buffer")] use super::shared_array_buffer::data::SharedArrayBufferHeapData; use super::{ - control_abstraction_objects::generator_objects::GeneratorHeapData, - error::ErrorHeapData, + control_abstraction_objects::generator_objects::GeneratorHeapData, error::ErrorHeapData, finalization_registry::data::FinalizationRegistryHeapData, indexed_collections::array_objects::array_iterator_objects::array_iterator::ArrayIteratorHeapData, - keyed_collections::{ - map_objects::map_iterator_objects::map_iterator::MapIteratorHeapData, - set_objects::set_iterator_objects::set_iterator::SetIteratorHeapData, - }, - map::data::MapHeapData, - module::Module, - primitive_objects::PrimitiveObjectHeapData, - promise::data::PromiseHeapData, - set::data::SetHeapData, - ArrayHeapData, + keyed_collections::map_objects::map_iterator_objects::map_iterator::MapIteratorHeapData, + map::data::MapHeapData, module::Module, primitive_objects::PrimitiveObjectHeapData, + promise::data::PromiseHeapData, ArrayHeapData, }; #[cfg(feature = "array-buffer")] use super::{ data_view::data::DataViewHeapData, typed_array::data::TypedArrayHeapData, ArrayBufferHeapData, }; +#[cfg(feature = "set")] +use super::{ + keyed_collections::set_objects::set_iterator_objects::set_iterator::SetIteratorHeapData, + set::data::SetHeapData, +}; #[cfg(feature = "weak-refs")] use super::{ weak_map::data::WeakMapHeapData, weak_ref::data::WeakRefHeapData, @@ -1274,7 +1271,9 @@ pub(crate) fn ordinary_object_create_with_intrinsics<'a>( ProtoIntrinsics::Promise => agent.heap.create(PromiseHeapData::default()).into_object(), #[cfg(feature = "regexp")] ProtoIntrinsics::RegExp => agent.heap.create(RegExpHeapData::default()).into_object(), + #[cfg(feature = "set")] ProtoIntrinsics::Set => agent.heap.create(SetHeapData::default()).into_object(), + #[cfg(feature = "set")] ProtoIntrinsics::SetIterator => agent .heap .create(SetIteratorHeapData::default()) @@ -1440,7 +1439,9 @@ pub(crate) fn get_prototype_from_constructor<'a>( ProtoIntrinsics::ReferenceError => Some(intrinsics.reference_error().into_function()), #[cfg(feature = "regexp")] ProtoIntrinsics::RegExp => Some(intrinsics.reg_exp().into_function()), + #[cfg(feature = "set")] ProtoIntrinsics::Set => Some(intrinsics.set().into_function()), + #[cfg(feature = "set")] ProtoIntrinsics::SetIterator => None, #[cfg(feature = "shared-array-buffer")] ProtoIntrinsics::SharedArrayBuffer => { diff --git a/nova_vm/src/ecmascript/execution/realm.rs b/nova_vm/src/ecmascript/execution/realm.rs index 17872a754..77016974c 100644 --- a/nova_vm/src/ecmascript/execution/realm.rs +++ b/nova_vm/src/ecmascript/execution/realm.rs @@ -833,17 +833,19 @@ pub(crate) fn set_default_global_bindings<'a>( } // 19.3.27 Set ( . . . ) - let name = PropertyKey::from(BUILTIN_STRING_MEMORY.Set); - let value = agent.get_realm(realm_id).intrinsics().set(); - let desc = PropertyDescriptor { - value: Some(value.into_value()), - writable: Some(true), - enumerable: Some(false), - configurable: Some(true), - ..Default::default() - }; - define_property_or_throw(agent, global, name, desc, gc.reborrow())?; - + #[cfg(feature = "set")] + { + let name = PropertyKey::from(BUILTIN_STRING_MEMORY.Set); + let value = agent.get_realm(realm_id).intrinsics().set(); + let desc = PropertyDescriptor { + value: Some(value.into_value()), + writable: Some(true), + enumerable: Some(false), + configurable: Some(true), + ..Default::default() + }; + define_property_or_throw(agent, global, name, desc, gc.reborrow())?; + } // 19.3.28 SharedArrayBuffer ( . . . ) #[cfg(feature = "shared-array-buffer")] { diff --git a/nova_vm/src/ecmascript/execution/realm/intrinsics.rs b/nova_vm/src/ecmascript/execution/realm/intrinsics.rs index 3d48b7c72..505eb5895 100644 --- a/nova_vm/src/ecmascript/execution/realm/intrinsics.rs +++ b/nova_vm/src/ecmascript/execution/realm/intrinsics.rs @@ -3,6 +3,12 @@ // file, You can obtain one at https://mozilla.org/MPL/2.0/. use super::RealmIdentifier; +#[cfg(feature = "set")] +use crate::ecmascript::builtins::keyed_collections::set_objects::{ + set_constructor::SetConstructor, + set_iterator_objects::set_iterator_prototype::SetIteratorPrototype, + set_prototype::SetPrototype, +}; #[cfg(feature = "weak-refs")] use crate::ecmascript::builtins::keyed_collections::{ weak_map_objects::{ @@ -85,17 +91,10 @@ use crate::{ array_iterator_objects::array_iterator_prototype::ArrayIteratorPrototype, array_prototype::ArrayPrototype, }, - keyed_collections::{ - map_objects::{ - map_constructor::MapConstructor, - map_iterator_objects::map_iterator_prototype::MapIteratorPrototype, - map_prototype::MapPrototype, - }, - set_objects::{ - set_constructor::SetConstructor, - set_iterator_objects::set_iterator_prototype::SetIteratorPrototype, - set_prototype::SetPrototype, - }, + keyed_collections::map_objects::{ + map_constructor::MapConstructor, + map_iterator_objects::map_iterator_prototype::MapIteratorPrototype, + map_prototype::MapPrototype, }, managing_memory::finalization_registry_objects::{ finalization_registry_constructor::FinalizationRegistryConstructor, @@ -206,7 +205,9 @@ pub enum ProtoIntrinsics { ReferenceError, #[cfg(feature = "regexp")] RegExp, + #[cfg(feature = "set")] Set, + #[cfg(feature = "set")] SetIterator, #[cfg(feature = "shared-array-buffer")] SharedArrayBuffer, @@ -312,8 +313,11 @@ impl Intrinsics { MapPrototype::create_intrinsic(agent, realm); MapConstructor::create_intrinsic(agent, realm); MapIteratorPrototype::create_intrinsic(agent, realm); + #[cfg(feature = "set")] SetPrototype::create_intrinsic(agent, realm); + #[cfg(feature = "set")] SetConstructor::create_intrinsic(agent, realm); + #[cfg(feature = "set")] SetIteratorPrototype::create_intrinsic(agent, realm); #[cfg(feature = "weak-refs")] WeakMapPrototype::create_intrinsic(agent, realm); @@ -419,7 +423,9 @@ impl Intrinsics { ProtoIntrinsics::Promise => self.promise_prototype().into(), #[cfg(feature = "regexp")] ProtoIntrinsics::RegExp => self.reg_exp_prototype().into(), + #[cfg(feature = "set")] ProtoIntrinsics::Set => self.set_prototype().into(), + #[cfg(feature = "set")] ProtoIntrinsics::SetIterator => self.set_iterator_prototype().into(), #[cfg(feature = "shared-array-buffer")] ProtoIntrinsics::SharedArrayBuffer => self.shared_array_buffer_prototype().into(), diff --git a/nova_vm/src/ecmascript/types/language.rs b/nova_vm/src/ecmascript/types/language.rs index 44512614a..25cd484db 100644 --- a/nova_vm/src/ecmascript/types/language.rs +++ b/nova_vm/src/ecmascript/types/language.rs @@ -56,8 +56,8 @@ pub(crate) use value::{ FINALIZATION_REGISTRY_DISCRIMINANT, FLOAT_DISCRIMINANT, GENERATOR_DISCRIMINANT, INTEGER_DISCRIMINANT, ITERATOR_DISCRIMINANT, MAP_DISCRIMINANT, MAP_ITERATOR_DISCRIMINANT, MODULE_DISCRIMINANT, NUMBER_DISCRIMINANT, OBJECT_DISCRIMINANT, PROMISE_DISCRIMINANT, - PROXY_DISCRIMINANT, SET_DISCRIMINANT, SET_ITERATOR_DISCRIMINANT, SMALL_BIGINT_DISCRIMINANT, - SMALL_STRING_DISCRIMINANT, STRING_DISCRIMINANT, SYMBOL_DISCRIMINANT, + PROXY_DISCRIMINANT, SMALL_BIGINT_DISCRIMINANT, SMALL_STRING_DISCRIMINANT, STRING_DISCRIMINANT, + SYMBOL_DISCRIMINANT, }; #[cfg(feature = "array-buffer")] pub(crate) use value::{ @@ -67,5 +67,7 @@ pub(crate) use value::{ UINT_16_ARRAY_DISCRIMINANT, UINT_32_ARRAY_DISCRIMINANT, UINT_8_ARRAY_DISCRIMINANT, UINT_8_CLAMPED_ARRAY_DISCRIMINANT, }; +#[cfg(feature = "set")] +pub(crate) use value::{SET_DISCRIMINANT, SET_ITERATOR_DISCRIMINANT}; #[cfg(feature = "weak-refs")] pub(crate) use value::{WEAK_MAP_DISCRIMINANT, WEAK_REF_DISCRIMINANT, WEAK_SET_DISCRIMINANT}; diff --git a/nova_vm/src/ecmascript/types/language/object.rs b/nova_vm/src/ecmascript/types/language/object.rs index bca0fbbd9..2a4dd086c 100644 --- a/nova_vm/src/ecmascript/types/language/object.rs +++ b/nova_vm/src/ecmascript/types/language/object.rs @@ -38,8 +38,7 @@ use super::{ ECMASCRIPT_FUNCTION_DISCRIMINANT, EMBEDDER_OBJECT_DISCRIMINANT, ERROR_DISCRIMINANT, FINALIZATION_REGISTRY_DISCRIMINANT, GENERATOR_DISCRIMINANT, ITERATOR_DISCRIMINANT, MAP_DISCRIMINANT, MAP_ITERATOR_DISCRIMINANT, MODULE_DISCRIMINANT, OBJECT_DISCRIMINANT, - PRIMITIVE_OBJECT_DISCRIMINANT, PROMISE_DISCRIMINANT, PROXY_DISCRIMINANT, SET_DISCRIMINANT, - SET_ITERATOR_DISCRIMINANT, + PRIMITIVE_OBJECT_DISCRIMINANT, PROMISE_DISCRIMINANT, PROXY_DISCRIMINANT, }, Function, IntoValue, Value, }; @@ -51,6 +50,13 @@ use crate::ecmascript::builtins::regexp::RegExp; use crate::ecmascript::builtins::shared_array_buffer::SharedArrayBuffer; #[cfg(feature = "weak-refs")] use crate::ecmascript::builtins::{weak_map::WeakMap, weak_ref::WeakRef, weak_set::WeakSet}; +#[cfg(feature = "set")] +use crate::ecmascript::{ + builtins::{ + keyed_collections::set_objects::set_iterator_objects::set_iterator::SetIterator, set::Set, + }, + types::{SET_DISCRIMINANT, SET_ITERATOR_DISCRIMINANT}, +}; #[cfg(feature = "array-buffer")] use crate::{ ecmascript::builtins::{data_view::DataView, typed_array::TypedArray, ArrayBuffer}, @@ -69,16 +75,12 @@ use crate::{ error::Error, finalization_registry::FinalizationRegistry, indexed_collections::array_objects::array_iterator_objects::array_iterator::ArrayIterator, - keyed_collections::{ - map_objects::map_iterator_objects::map_iterator::MapIterator, - set_objects::set_iterator_objects::set_iterator::SetIterator, - }, + keyed_collections::map_objects::map_iterator_objects::map_iterator::MapIterator, map::Map, module::Module, primitive_objects::PrimitiveObject, promise::Promise, proxy::Proxy, - set::Set, ArgumentsList, Array, BuiltinConstructorFunction, BuiltinFunction, ECMAScriptFunction, }, execution::{Agent, JsResult}, @@ -136,6 +138,7 @@ pub enum Object<'a> { Proxy(Proxy<'a>) = PROXY_DISCRIMINANT, #[cfg(feature = "regexp")] RegExp(RegExp<'a>) = REGEXP_DISCRIMINANT, + #[cfg(feature = "set")] Set(Set<'a>) = SET_DISCRIMINANT, #[cfg(feature = "shared-array-buffer")] SharedArrayBuffer(SharedArrayBuffer<'a>) = SHARED_ARRAY_BUFFER_DISCRIMINANT, @@ -171,6 +174,7 @@ pub enum Object<'a> { AsyncIterator = ASYNC_ITERATOR_DISCRIMINANT, Iterator = ITERATOR_DISCRIMINANT, ArrayIterator(ArrayIterator<'a>) = ARRAY_ITERATOR_DISCRIMINANT, + #[cfg(feature = "set")] SetIterator(SetIterator<'a>) = SET_ITERATOR_DISCRIMINANT, MapIterator(MapIterator<'a>) = MAP_ITERATOR_DISCRIMINANT, Generator(Generator<'a>) = GENERATOR_DISCRIMINANT, @@ -213,6 +217,7 @@ impl IntoValue for Object<'_> { Object::Proxy(data) => Value::Proxy(data.unbind()), #[cfg(feature = "regexp")] Object::RegExp(data) => Value::RegExp(data.unbind()), + #[cfg(feature = "set")] Object::Set(data) => Value::Set(data.unbind()), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => Value::SharedArrayBuffer(data.unbind()), @@ -248,6 +253,7 @@ impl IntoValue for Object<'_> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => Value::ArrayIterator(data.unbind()), + #[cfg(feature = "set")] Object::SetIterator(data) => Value::SetIterator(data.unbind()), Object::MapIterator(data) => Value::MapIterator(data.unbind()), Object::Generator(data) => Value::Generator(data.unbind()), @@ -434,6 +440,7 @@ impl From> for Value { Object::Proxy(data) => Value::Proxy(data.unbind()), #[cfg(feature = "regexp")] Object::RegExp(data) => Value::RegExp(data.unbind()), + #[cfg(feature = "set")] Object::Set(data) => Value::Set(data.unbind()), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => Value::SharedArrayBuffer(data.unbind()), @@ -469,6 +476,7 @@ impl From> for Value { Object::AsyncIterator => Value::AsyncIterator, Object::Iterator => Value::Iterator, Object::ArrayIterator(data) => Value::ArrayIterator(data.unbind()), + #[cfg(feature = "set")] Object::SetIterator(data) => Value::SetIterator(data.unbind()), Object::MapIterator(data) => Value::MapIterator(data.unbind()), Object::Generator(data) => Value::Generator(data.unbind()), @@ -520,6 +528,7 @@ impl TryFrom for Object<'_> { Value::Proxy(data) => Ok(Object::Proxy(data)), #[cfg(feature = "regexp")] Value::RegExp(idx) => Ok(Object::RegExp(idx)), + #[cfg(feature = "set")] Value::Set(data) => Ok(Object::Set(data)), #[cfg(feature = "shared-array-buffer")] Value::SharedArrayBuffer(data) => Ok(Object::SharedArrayBuffer(data)), @@ -555,6 +564,7 @@ impl TryFrom for Object<'_> { Value::AsyncIterator => Ok(Object::AsyncIterator), Value::Iterator => Ok(Object::Iterator), Value::ArrayIterator(data) => Ok(Object::ArrayIterator(data)), + #[cfg(feature = "set")] Value::SetIterator(data) => Ok(Object::SetIterator(data)), Value::MapIterator(data) => Ok(Object::MapIterator(data)), Value::Generator(data) => Ok(Object::Generator(data)), @@ -631,6 +641,7 @@ impl Hash for Object<'_> { Object::Proxy(data) => data.get_index().hash(state), #[cfg(feature = "regexp")] Object::RegExp(data) => data.get_index().hash(state), + #[cfg(feature = "set")] Object::Set(data) => data.get_index().hash(state), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.get_index().hash(state), @@ -666,6 +677,7 @@ impl Hash for Object<'_> { Object::AsyncIterator => {} Object::Iterator => {} Object::ArrayIterator(data) => data.get_index().hash(state), + #[cfg(feature = "set")] Object::SetIterator(data) => data.get_index().hash(state), Object::MapIterator(data) => data.get_index().hash(state), Object::Generator(data) => data.get_index().hash(state), @@ -715,6 +727,7 @@ impl<'a> InternalSlots<'a> for Object<'a> { Object::Proxy(data) => data.internal_extensible(agent), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_extensible(agent), + #[cfg(feature = "set")] Object::Set(data) => data.internal_extensible(agent), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_extensible(agent), @@ -756,6 +769,7 @@ impl<'a> InternalSlots<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_extensible(agent), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_extensible(agent), Object::MapIterator(data) => data.internal_extensible(agent), Object::Generator(data) => data.internal_extensible(agent), @@ -793,6 +807,7 @@ impl<'a> InternalSlots<'a> for Object<'a> { Object::Proxy(data) => data.internal_set_extensible(agent, value), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_set_extensible(agent, value), + #[cfg(feature = "set")] Object::Set(data) => data.internal_set_extensible(agent, value), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_set_extensible(agent, value), @@ -850,6 +865,7 @@ impl<'a> InternalSlots<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_set_extensible(agent, value), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_set_extensible(agent, value), Object::MapIterator(data) => data.internal_set_extensible(agent, value), Object::Generator(data) => data.internal_set_extensible(agent, value), @@ -885,6 +901,7 @@ impl<'a> InternalSlots<'a> for Object<'a> { Object::Proxy(data) => data.internal_prototype(agent), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_prototype(agent), + #[cfg(feature = "set")] Object::Set(data) => data.internal_prototype(agent), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_prototype(agent), @@ -926,6 +943,7 @@ impl<'a> InternalSlots<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_prototype(agent), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_prototype(agent), Object::MapIterator(data) => data.internal_prototype(agent), Object::Generator(data) => data.internal_prototype(agent), @@ -965,6 +983,7 @@ impl<'a> InternalSlots<'a> for Object<'a> { Object::Proxy(data) => data.internal_set_prototype(agent, prototype), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_set_prototype(agent, prototype), + #[cfg(feature = "set")] Object::Set(data) => data.internal_set_prototype(agent, prototype), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_set_prototype(agent, prototype), @@ -1022,6 +1041,7 @@ impl<'a> InternalSlots<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_set_prototype(agent, prototype), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_set_prototype(agent, prototype), Object::MapIterator(data) => data.internal_set_prototype(agent, prototype), Object::Generator(data) => data.internal_set_prototype(agent, prototype), @@ -1063,6 +1083,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.try_get_prototype_of(agent, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.try_get_prototype_of(agent, gc), + #[cfg(feature = "set")] Object::Set(data) => data.try_get_prototype_of(agent, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.try_get_prototype_of(agent, gc), @@ -1118,6 +1139,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.try_get_prototype_of(agent, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.try_get_prototype_of(agent, gc), Object::MapIterator(data) => data.try_get_prototype_of(agent, gc), Object::Generator(data) => data.try_get_prototype_of(agent, gc), @@ -1159,6 +1181,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.internal_get_prototype_of(agent, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_get_prototype_of(agent, gc), + #[cfg(feature = "set")] Object::Set(data) => data.internal_get_prototype_of(agent, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_get_prototype_of(agent, gc), @@ -1216,6 +1239,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_get_prototype_of(agent, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_get_prototype_of(agent, gc), Object::MapIterator(data) => data.internal_get_prototype_of(agent, gc), Object::Generator(data) => data.internal_get_prototype_of(agent, gc), @@ -1260,6 +1284,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.try_set_prototype_of(agent, prototype, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.try_set_prototype_of(agent, prototype, gc), + #[cfg(feature = "set")] Object::Set(data) => data.try_set_prototype_of(agent, prototype, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.try_set_prototype_of(agent, prototype, gc), @@ -1317,6 +1342,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.try_set_prototype_of(agent, prototype, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.try_set_prototype_of(agent, prototype, gc), Object::MapIterator(data) => data.try_set_prototype_of(agent, prototype, gc), Object::Generator(data) => data.try_set_prototype_of(agent, prototype, gc), @@ -1365,6 +1391,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.internal_set_prototype_of(agent, prototype, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_set_prototype_of(agent, prototype, gc), + #[cfg(feature = "set")] Object::Set(data) => data.internal_set_prototype_of(agent, prototype, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_set_prototype_of(agent, prototype, gc), @@ -1422,6 +1449,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_set_prototype_of(agent, prototype, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_set_prototype_of(agent, prototype, gc), Object::MapIterator(data) => data.internal_set_prototype_of(agent, prototype, gc), Object::Generator(data) => data.internal_set_prototype_of(agent, prototype, gc), @@ -1457,6 +1485,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.try_is_extensible(agent, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.try_is_extensible(agent, gc), + #[cfg(feature = "set")] Object::Set(data) => data.try_is_extensible(agent, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.try_is_extensible(agent, gc), @@ -1502,6 +1531,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.try_is_extensible(agent, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.try_is_extensible(agent, gc), Object::MapIterator(data) => data.try_is_extensible(agent, gc), Object::Generator(data) => data.try_is_extensible(agent, gc), @@ -1537,6 +1567,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.internal_is_extensible(agent, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_is_extensible(agent, gc), + #[cfg(feature = "set")] Object::Set(data) => data.internal_is_extensible(agent, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_is_extensible(agent, gc), @@ -1594,6 +1625,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_is_extensible(agent, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_is_extensible(agent, gc), Object::MapIterator(data) => data.internal_is_extensible(agent, gc), Object::Generator(data) => data.internal_is_extensible(agent, gc), @@ -1629,6 +1661,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.try_prevent_extensions(agent, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.try_prevent_extensions(agent, gc), + #[cfg(feature = "set")] Object::Set(data) => data.try_prevent_extensions(agent, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.try_prevent_extensions(agent, gc), @@ -1686,6 +1719,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.try_prevent_extensions(agent, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.try_prevent_extensions(agent, gc), Object::MapIterator(data) => data.try_prevent_extensions(agent, gc), Object::Generator(data) => data.try_prevent_extensions(agent, gc), @@ -1723,6 +1757,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.internal_prevent_extensions(agent, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_prevent_extensions(agent, gc), + #[cfg(feature = "set")] Object::Set(data) => data.internal_prevent_extensions(agent, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_prevent_extensions(agent, gc), @@ -1780,6 +1815,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_prevent_extensions(agent, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_prevent_extensions(agent, gc), Object::MapIterator(data) => data.internal_prevent_extensions(agent, gc), Object::Generator(data) => data.internal_prevent_extensions(agent, gc), @@ -1826,6 +1862,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.try_get_own_property(agent, property_key, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.try_get_own_property(agent, property_key, gc), + #[cfg(feature = "set")] Object::Set(data) => data.try_get_own_property(agent, property_key, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.try_get_own_property(agent, property_key, gc), @@ -1883,6 +1920,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.try_get_own_property(agent, property_key, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.try_get_own_property(agent, property_key, gc), Object::MapIterator(data) => data.try_get_own_property(agent, property_key, gc), Object::Generator(data) => data.try_get_own_property(agent, property_key, gc), @@ -1935,6 +1973,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.internal_get_own_property(agent, property_key, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_get_own_property(agent, property_key, gc), + #[cfg(feature = "set")] Object::Set(data) => data.internal_get_own_property(agent, property_key, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => { @@ -1993,6 +2032,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_get_own_property(agent, property_key, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_get_own_property(agent, property_key, gc), Object::MapIterator(data) => data.internal_get_own_property(agent, property_key, gc), Object::Generator(data) => data.internal_get_own_property(agent, property_key, gc), @@ -2070,6 +2110,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::RegExp(data) => { data.try_define_own_property(agent, property_key, property_descriptor, gc) } + #[cfg(feature = "set")] Object::Set(data) => { data.try_define_own_property(agent, property_key, property_descriptor, gc) } @@ -2164,6 +2205,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::ArrayIterator(data) => { data.try_define_own_property(agent, property_key, property_descriptor, gc) } + #[cfg(feature = "set")] Object::SetIterator(data) => { data.try_define_own_property(agent, property_key, property_descriptor, gc) } @@ -2251,6 +2293,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::RegExp(data) => { data.internal_define_own_property(agent, property_key, property_descriptor, gc) } + #[cfg(feature = "set")] Object::Set(data) => { data.internal_define_own_property(agent, property_key, property_descriptor, gc) } @@ -2325,6 +2368,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::ArrayIterator(data) => { data.internal_define_own_property(agent, property_key, property_descriptor, gc) } + #[cfg(feature = "set")] Object::SetIterator(data) => { data.internal_define_own_property(agent, property_key, property_descriptor, gc) } @@ -2379,6 +2423,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.try_has_property(agent, property_key, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.try_has_property(agent, property_key, gc), + #[cfg(feature = "set")] Object::Set(data) => data.try_has_property(agent, property_key, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.try_has_property(agent, property_key, gc), @@ -2436,6 +2481,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.try_has_property(agent, property_key, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.try_has_property(agent, property_key, gc), Object::MapIterator(data) => data.try_has_property(agent, property_key, gc), Object::Generator(data) => data.try_has_property(agent, property_key, gc), @@ -2482,6 +2528,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.internal_has_property(agent, property_key, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_has_property(agent, property_key, gc), + #[cfg(feature = "set")] Object::Set(data) => data.internal_has_property(agent, property_key, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_has_property(agent, property_key, gc), @@ -2539,6 +2586,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_has_property(agent, property_key, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_has_property(agent, property_key, gc), Object::MapIterator(data) => data.internal_has_property(agent, property_key, gc), Object::Generator(data) => data.internal_has_property(agent, property_key, gc), @@ -2584,6 +2632,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.try_get(agent, property_key, receiver, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.try_get(agent, property_key, receiver, gc), + #[cfg(feature = "set")] Object::Set(data) => data.try_get(agent, property_key, receiver, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.try_get(agent, property_key, receiver, gc), @@ -2641,6 +2690,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.try_get(agent, property_key, receiver, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.try_get(agent, property_key, receiver, gc), Object::MapIterator(data) => data.try_get(agent, property_key, receiver, gc), Object::Generator(data) => data.try_get(agent, property_key, receiver, gc), @@ -2690,6 +2740,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.internal_get(agent, property_key, receiver, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_get(agent, property_key, receiver, gc), + #[cfg(feature = "set")] Object::Set(data) => data.internal_get(agent, property_key, receiver, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_get(agent, property_key, receiver, gc), @@ -2747,6 +2798,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_get(agent, property_key, receiver, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_get(agent, property_key, receiver, gc), Object::MapIterator(data) => data.internal_get(agent, property_key, receiver, gc), Object::Generator(data) => data.internal_get(agent, property_key, receiver, gc), @@ -2797,6 +2849,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.try_set(agent, property_key, value, receiver, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.try_set(agent, property_key, value, receiver, gc), + #[cfg(feature = "set")] Object::Set(data) => data.try_set(agent, property_key, value, receiver, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => { @@ -2860,6 +2913,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.try_set(agent, property_key, value, receiver, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.try_set(agent, property_key, value, receiver, gc), Object::MapIterator(data) => data.try_set(agent, property_key, value, receiver, gc), Object::Generator(data) => data.try_set(agent, property_key, value, receiver, gc), @@ -2918,6 +2972,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.internal_set(agent, property_key, value, receiver, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_set(agent, property_key, value, receiver, gc), + #[cfg(feature = "set")] Object::Set(data) => data.internal_set(agent, property_key, value, receiver, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => { @@ -2999,6 +3054,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::ArrayIterator(data) => { data.internal_set(agent, property_key, value, receiver, gc) } + #[cfg(feature = "set")] Object::SetIterator(data) => { data.internal_set(agent, property_key, value, receiver, gc) } @@ -3047,6 +3103,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.try_delete(agent, property_key, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.try_delete(agent, property_key, gc), + #[cfg(feature = "set")] Object::Set(data) => data.try_delete(agent, property_key, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.try_delete(agent, property_key, gc), @@ -3104,6 +3161,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.try_delete(agent, property_key, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.try_delete(agent, property_key, gc), Object::MapIterator(data) => data.try_delete(agent, property_key, gc), Object::Generator(data) => data.try_delete(agent, property_key, gc), @@ -3148,6 +3206,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.internal_delete(agent, property_key, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_delete(agent, property_key, gc), + #[cfg(feature = "set")] Object::Set(data) => data.internal_delete(agent, property_key, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_delete(agent, property_key, gc), @@ -3205,6 +3264,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_delete(agent, property_key, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_delete(agent, property_key, gc), Object::MapIterator(data) => data.internal_delete(agent, property_key, gc), Object::Generator(data) => data.internal_delete(agent, property_key, gc), @@ -3244,6 +3304,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.try_own_property_keys(agent, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.try_own_property_keys(agent, gc), + #[cfg(feature = "set")] Object::Set(data) => data.try_own_property_keys(agent, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.try_own_property_keys(agent, gc), @@ -3299,6 +3360,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.try_own_property_keys(agent, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.try_own_property_keys(agent, gc), Object::MapIterator(data) => data.try_own_property_keys(agent, gc), Object::Generator(data) => data.try_own_property_keys(agent, gc), @@ -3340,6 +3402,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::Proxy(data) => data.internal_own_property_keys(agent, gc), #[cfg(feature = "regexp")] Object::RegExp(data) => data.internal_own_property_keys(agent, gc), + #[cfg(feature = "set")] Object::Set(data) => data.internal_own_property_keys(agent, gc), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.internal_own_property_keys(agent, gc), @@ -3397,6 +3460,7 @@ impl<'a> InternalMethods<'a> for Object<'a> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.internal_own_property_keys(agent, gc), + #[cfg(feature = "set")] Object::SetIterator(data) => data.internal_own_property_keys(agent, gc), Object::MapIterator(data) => data.internal_own_property_keys(agent, gc), Object::Generator(data) => data.internal_own_property_keys(agent, gc), @@ -3477,6 +3541,7 @@ impl HeapMarkAndSweep for Object<'static> { Object::Proxy(data) => data.mark_values(queues), #[cfg(feature = "regexp")] Object::RegExp(data) => data.mark_values(queues), + #[cfg(feature = "set")] Object::Set(data) => data.mark_values(queues), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.mark_values(queues), @@ -3512,6 +3577,7 @@ impl HeapMarkAndSweep for Object<'static> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.mark_values(queues), + #[cfg(feature = "set")] Object::SetIterator(data) => data.mark_values(queues), Object::MapIterator(data) => data.mark_values(queues), Object::Generator(data) => data.mark_values(queues), @@ -3547,6 +3613,7 @@ impl HeapMarkAndSweep for Object<'static> { Object::Proxy(data) => data.sweep_values(compactions), #[cfg(feature = "regexp")] Object::RegExp(data) => data.sweep_values(compactions), + #[cfg(feature = "set")] Object::Set(data) => data.sweep_values(compactions), #[cfg(feature = "shared-array-buffer")] Object::SharedArrayBuffer(data) => data.sweep_values(compactions), @@ -3582,6 +3649,7 @@ impl HeapMarkAndSweep for Object<'static> { Object::AsyncIterator => todo!(), Object::Iterator => todo!(), Object::ArrayIterator(data) => data.sweep_values(compactions), + #[cfg(feature = "set")] Object::SetIterator(data) => data.sweep_values(compactions), Object::MapIterator(data) => data.sweep_values(compactions), Object::Generator(data) => data.sweep_values(compactions), @@ -3671,6 +3739,7 @@ impl TryFrom for Object<'_> { HeapRootData::Proxy(proxy) => Ok(Self::Proxy(proxy)), #[cfg(feature = "regexp")] HeapRootData::RegExp(reg_exp) => Ok(Self::RegExp(reg_exp)), + #[cfg(feature = "set")] HeapRootData::Set(set) => Ok(Self::Set(set)), #[cfg(feature = "shared-array-buffer")] HeapRootData::SharedArrayBuffer(shared_array_buffer) => { @@ -3708,6 +3777,7 @@ impl TryFrom for Object<'_> { HeapRootData::AsyncIterator => Ok(Self::AsyncIterator), HeapRootData::Iterator => Ok(Self::Iterator), HeapRootData::ArrayIterator(array_iterator) => Ok(Self::ArrayIterator(array_iterator)), + #[cfg(feature = "set")] HeapRootData::SetIterator(set_iterator) => Ok(Self::SetIterator(set_iterator)), HeapRootData::MapIterator(map_iterator) => Ok(Self::MapIterator(map_iterator)), HeapRootData::Generator(generator) => Ok(Self::Generator(generator)), diff --git a/nova_vm/src/ecmascript/types/language/value.rs b/nova_vm/src/ecmascript/types/language/value.rs index 67e6ab33f..767c653c8 100644 --- a/nova_vm/src/ecmascript/types/language/value.rs +++ b/nova_vm/src/ecmascript/types/language/value.rs @@ -15,6 +15,10 @@ use crate::ecmascript::builtins::date::Date; use crate::ecmascript::builtins::regexp::RegExp; #[cfg(feature = "shared-array-buffer")] use crate::ecmascript::builtins::shared_array_buffer::SharedArrayBuffer; +#[cfg(feature = "set")] +use crate::ecmascript::builtins::{ + keyed_collections::set_objects::set_iterator_objects::set_iterator::SetIterator, set::Set, +}; #[cfg(feature = "weak-refs")] use crate::ecmascript::builtins::{weak_map::WeakMap, weak_ref::WeakRef, weak_set::WeakSet}; #[cfg(feature = "array-buffer")] @@ -38,16 +42,12 @@ use crate::{ error::Error, finalization_registry::FinalizationRegistry, indexed_collections::array_objects::array_iterator_objects::array_iterator::ArrayIterator, - keyed_collections::{ - map_objects::map_iterator_objects::map_iterator::MapIterator, - set_objects::set_iterator_objects::set_iterator::SetIterator, - }, + keyed_collections::map_objects::map_iterator_objects::map_iterator::MapIterator, map::Map, module::Module, primitive_objects::PrimitiveObject, promise::Promise, proxy::Proxy, - set::Set, Array, BuiltinConstructorFunction, BuiltinFunction, ECMAScriptFunction, }, execution::{Agent, JsResult}, @@ -168,6 +168,7 @@ pub enum Value { Proxy(Proxy<'static>), #[cfg(feature = "regexp")] RegExp(RegExp<'static>), + #[cfg(feature = "set")] Set(Set<'static>), #[cfg(feature = "shared-array-buffer")] SharedArrayBuffer(SharedArrayBuffer<'static>), @@ -208,6 +209,7 @@ pub enum Value { AsyncIterator, Iterator, ArrayIterator(ArrayIterator<'static>), + #[cfg(feature = "set")] SetIterator(SetIterator<'static>), MapIterator(MapIterator<'static>), Generator(Generator<'static>), @@ -293,6 +295,7 @@ pub(crate) const FINALIZATION_REGISTRY_DISCRIMINANT: u8 = pub(crate) const MAP_DISCRIMINANT: u8 = value_discriminant(Value::Map(Map::_def())); pub(crate) const PROMISE_DISCRIMINANT: u8 = value_discriminant(Value::Promise(Promise::_def())); pub(crate) const PROXY_DISCRIMINANT: u8 = value_discriminant(Value::Proxy(Proxy::_def())); +#[cfg(feature = "set")] pub(crate) const SET_DISCRIMINANT: u8 = value_discriminant(Value::Set(Set::_def())); #[cfg(feature = "shared-array-buffer")] pub(crate) const SHARED_ARRAY_BUFFER_DISCRIMINANT: u8 = @@ -342,6 +345,7 @@ pub(crate) const ASYNC_ITERATOR_DISCRIMINANT: u8 = value_discriminant(Value::Asy pub(crate) const ITERATOR_DISCRIMINANT: u8 = value_discriminant(Value::Iterator); pub(crate) const ARRAY_ITERATOR_DISCRIMINANT: u8 = value_discriminant(Value::ArrayIterator(ArrayIterator::_def())); +#[cfg(feature = "set")] pub(crate) const SET_ITERATOR_DISCRIMINANT: u8 = value_discriminant(Value::SetIterator(SetIterator::_def())); pub(crate) const MAP_ITERATOR_DISCRIMINANT: u8 = @@ -734,6 +738,7 @@ impl Value { discriminant.hash(hasher); data.get_index().hash(hasher); } + #[cfg(feature = "set")] Value::Set(data) => { discriminant.hash(hasher); data.get_index().hash(hasher); @@ -820,6 +825,7 @@ impl Value { discriminant.hash(hasher); data.get_index().hash(hasher); } + #[cfg(feature = "set")] Value::SetIterator(data) => { discriminant.hash(hasher); data.get_index().hash(hasher); @@ -955,6 +961,7 @@ impl Value { discriminant.hash(hasher); data.get_index().hash(hasher); } + #[cfg(feature = "set")] Value::Set(data) => { discriminant.hash(hasher); data.get_index().hash(hasher); @@ -1041,6 +1048,7 @@ impl Value { discriminant.hash(hasher); data.get_index().hash(hasher); } + #[cfg(feature = "set")] Value::SetIterator(data) => { discriminant.hash(hasher); data.get_index().hash(hasher); @@ -1208,6 +1216,7 @@ impl Rootable for Value { Self::Proxy(proxy) => Err(HeapRootData::Proxy(proxy)), #[cfg(feature = "regexp")] Self::RegExp(reg_exp) => Err(HeapRootData::RegExp(reg_exp)), + #[cfg(feature = "set")] Self::Set(set) => Err(HeapRootData::Set(set)), #[cfg(feature = "shared-array-buffer")] Self::SharedArrayBuffer(shared_array_buffer) => { @@ -1245,6 +1254,7 @@ impl Rootable for Value { Self::AsyncIterator => Err(HeapRootData::AsyncIterator), Self::Iterator => Err(HeapRootData::Iterator), Self::ArrayIterator(array_iterator) => Err(HeapRootData::ArrayIterator(array_iterator)), + #[cfg(feature = "set")] Self::SetIterator(set_iterator) => Err(HeapRootData::SetIterator(set_iterator)), Self::MapIterator(map_iterator) => Err(HeapRootData::MapIterator(map_iterator)), Self::Generator(generator) => Err(HeapRootData::Generator(generator)), @@ -1322,6 +1332,7 @@ impl Rootable for Value { HeapRootData::Proxy(proxy) => Some(Self::Proxy(proxy)), #[cfg(feature = "regexp")] HeapRootData::RegExp(reg_exp) => Some(Self::RegExp(reg_exp)), + #[cfg(feature = "set")] HeapRootData::Set(set) => Some(Self::Set(set)), #[cfg(feature = "shared-array-buffer")] HeapRootData::SharedArrayBuffer(shared_array_buffer) => { @@ -1363,6 +1374,7 @@ impl Rootable for Value { HeapRootData::ArrayIterator(array_iterator) => { Some(Self::ArrayIterator(array_iterator)) } + #[cfg(feature = "set")] HeapRootData::SetIterator(set_iterator) => Some(Self::SetIterator(set_iterator)), HeapRootData::MapIterator(map_iterator) => Some(Self::MapIterator(map_iterator)), HeapRootData::Generator(generator) => Some(Self::Generator(generator)), @@ -1426,6 +1438,7 @@ impl HeapMarkAndSweep for Value { Value::Map(data) => data.mark_values(queues), Value::Proxy(data) => data.mark_values(queues), Value::Promise(data) => data.mark_values(queues), + #[cfg(feature = "set")] Value::Set(data) => data.mark_values(queues), #[cfg(feature = "shared-array-buffer")] Value::SharedArrayBuffer(data) => data.mark_values(queues), @@ -1466,6 +1479,7 @@ impl HeapMarkAndSweep for Value { Value::AsyncIterator => todo!(), Value::Iterator => todo!(), Value::ArrayIterator(data) => data.mark_values(queues), + #[cfg(feature = "set")] Value::SetIterator(data) => data.mark_values(queues), Value::MapIterator(data) => data.mark_values(queues), Value::Generator(data) => data.mark_values(queues), @@ -1509,6 +1523,7 @@ impl HeapMarkAndSweep for Value { Value::Map(data) => data.sweep_values(compactions), Value::Proxy(data) => data.sweep_values(compactions), Value::Promise(data) => data.sweep_values(compactions), + #[cfg(feature = "set")] Value::Set(data) => data.sweep_values(compactions), #[cfg(feature = "shared-array-buffer")] Value::SharedArrayBuffer(data) => data.sweep_values(compactions), @@ -1549,6 +1564,7 @@ impl HeapMarkAndSweep for Value { Value::AsyncIterator => todo!(), Value::Iterator => todo!(), Value::ArrayIterator(data) => data.sweep_values(compactions), + #[cfg(feature = "set")] Value::SetIterator(data) => data.sweep_values(compactions), Value::MapIterator(data) => data.sweep_values(compactions), Value::Generator(data) => data.sweep_values(compactions), diff --git a/nova_vm/src/engine/bytecode/vm.rs b/nova_vm/src/engine/bytecode/vm.rs index fb98d4a7d..43b4ef3d0 100644 --- a/nova_vm/src/engine/bytecode/vm.rs +++ b/nova_vm/src/engine/bytecode/vm.rs @@ -2271,12 +2271,10 @@ fn typeof_operator(_: &mut Agent, val: Value) -> String { Value::FinalizationRegistry(_) | Value::Map(_) | Value::Promise(_) | - Value::Set(_) | Value::AsyncFromSyncIterator | Value::AsyncIterator | Value::Iterator | Value::ArrayIterator(_) | - Value::SetIterator(_) | Value::MapIterator(_) | Value::Generator(_) | Value::Module(_) | @@ -2287,6 +2285,9 @@ fn typeof_operator(_: &mut Agent, val: Value) -> String { Value::WeakMap(_) | Value::WeakRef(_) | Value::WeakSet(_) => BUILTIN_STRING_MEMORY.object, + #[cfg(feature = "set")] + Value::Set(_) | + Value::SetIterator(_) => BUILTIN_STRING_MEMORY.object, #[cfg(feature = "shared-array-buffer")] Value::SharedArrayBuffer(_) => BUILTIN_STRING_MEMORY.object, #[cfg(feature = "array-buffer")] diff --git a/nova_vm/src/engine/rootable.rs b/nova_vm/src/engine/rootable.rs index 3aaa23825..6b1da3fd3 100644 --- a/nova_vm/src/engine/rootable.rs +++ b/nova_vm/src/engine/rootable.rs @@ -35,6 +35,13 @@ use crate::ecmascript::types::{ use crate::ecmascript::types::{ WEAK_MAP_DISCRIMINANT, WEAK_REF_DISCRIMINANT, WEAK_SET_DISCRIMINANT, }; +#[cfg(feature = "set")] +use crate::ecmascript::{ + builtins::{ + keyed_collections::set_objects::set_iterator_objects::set_iterator::SetIterator, set::Set, + }, + types::{SET_DISCRIMINANT, SET_ITERATOR_DISCRIMINANT}, +}; #[cfg(feature = "array-buffer")] use crate::heap::indexes::TypedArrayIndex; use crate::{ @@ -46,10 +53,7 @@ use crate::{ finalization_registry::FinalizationRegistry, generator_objects::Generator, indexed_collections::array_objects::array_iterator_objects::array_iterator::ArrayIterator, - keyed_collections::{ - map_objects::map_iterator_objects::map_iterator::MapIterator, - set_objects::set_iterator_objects::set_iterator::SetIterator, - }, + keyed_collections::map_objects::map_iterator_objects::map_iterator::MapIterator, map::Map, module::Module, primitive_objects::PrimitiveObject, @@ -59,7 +63,6 @@ use crate::{ promise_resolving_functions::BuiltinPromiseResolvingFunction, }, proxy::Proxy, - set::Set, Array, BuiltinConstructorFunction, BuiltinFunction, ECMAScriptFunction, }, types::{ @@ -74,8 +77,8 @@ use crate::{ ECMASCRIPT_FUNCTION_DISCRIMINANT, EMBEDDER_OBJECT_DISCRIMINANT, ERROR_DISCRIMINANT, FINALIZATION_REGISTRY_DISCRIMINANT, GENERATOR_DISCRIMINANT, ITERATOR_DISCRIMINANT, MAP_DISCRIMINANT, MAP_ITERATOR_DISCRIMINANT, MODULE_DISCRIMINANT, NUMBER_DISCRIMINANT, - OBJECT_DISCRIMINANT, PROMISE_DISCRIMINANT, PROXY_DISCRIMINANT, SET_DISCRIMINANT, - SET_ITERATOR_DISCRIMINANT, STRING_DISCRIMINANT, SYMBOL_DISCRIMINANT, + OBJECT_DISCRIMINANT, PROMISE_DISCRIMINANT, PROXY_DISCRIMINANT, STRING_DISCRIMINANT, + SYMBOL_DISCRIMINANT, }, }, heap::HeapMarkAndSweep, @@ -90,6 +93,10 @@ mod private { use crate::ecmascript::builtins::shared_array_buffer::SharedArrayBuffer; #[cfg(feature = "array-buffer")] use crate::ecmascript::builtins::{data_view::DataView, typed_array::TypedArray, ArrayBuffer}; + #[cfg(feature = "set")] + use crate::ecmascript::builtins::{ + keyed_collections::set_objects::set_iterator_objects::set_iterator::SetIterator, set::Set, + }; #[cfg(feature = "weak-refs")] use crate::ecmascript::builtins::{weak_map::WeakMap, weak_ref::WeakRef, weak_set::WeakSet}; use crate::ecmascript::{ @@ -100,10 +107,7 @@ mod private { finalization_registry::FinalizationRegistry, generator_objects::Generator, indexed_collections::array_objects::array_iterator_objects::array_iterator::ArrayIterator, - keyed_collections::{ - map_objects::map_iterator_objects::map_iterator::MapIterator, - set_objects::set_iterator_objects::set_iterator::SetIterator, - }, + keyed_collections::map_objects::map_iterator_objects::map_iterator::MapIterator, map::Map, module::Module, primitive_objects::PrimitiveObject, @@ -113,7 +117,6 @@ mod private { promise_resolving_functions::BuiltinPromiseResolvingFunction, }, proxy::Proxy, - set::Set, Array, BuiltinConstructorFunction, BuiltinFunction, ECMAScriptFunction, }, types::{ @@ -158,7 +161,9 @@ mod private { impl RootableSealed for Proxy<'_> {} #[cfg(feature = "regexp")] impl RootableSealed for RegExp<'_> {} + #[cfg(feature = "set")] impl RootableSealed for Set<'_> {} + #[cfg(feature = "set")] impl RootableSealed for SetIterator<'_> {} #[cfg(feature = "shared-array-buffer")] impl RootableSealed for SharedArrayBuffer<'_> {} @@ -275,6 +280,7 @@ pub enum HeapRootData { Proxy(Proxy<'static>) = PROXY_DISCRIMINANT, #[cfg(feature = "regexp")] RegExp(RegExp<'static>) = REGEXP_DISCRIMINANT, + #[cfg(feature = "set")] Set(Set<'static>) = SET_DISCRIMINANT, #[cfg(feature = "shared-array-buffer")] SharedArrayBuffer(SharedArrayBuffer<'static>) = SHARED_ARRAY_BUFFER_DISCRIMINANT, @@ -310,6 +316,7 @@ pub enum HeapRootData { AsyncIterator = ASYNC_ITERATOR_DISCRIMINANT, Iterator = ITERATOR_DISCRIMINANT, ArrayIterator(ArrayIterator<'static>) = ARRAY_ITERATOR_DISCRIMINANT, + #[cfg(feature = "set")] SetIterator(SetIterator<'static>) = SET_ITERATOR_DISCRIMINANT, MapIterator(MapIterator<'static>) = MAP_ITERATOR_DISCRIMINANT, Generator(Generator<'static>) = GENERATOR_DISCRIMINANT, @@ -358,6 +365,7 @@ impl From> for HeapRootData { Object::Promise(promise) => Self::Promise(promise), Object::Proxy(proxy) => Self::Proxy(proxy), Object::RegExp(reg_exp) => Self::RegExp(reg_exp), + #[cfg(feature = "set")] Object::Set(set) => Self::Set(set), Object::SharedArrayBuffer(shared_array_buffer) => { Self::SharedArrayBuffer(shared_array_buffer) @@ -380,6 +388,7 @@ impl From> for HeapRootData { Object::AsyncIterator => Self::AsyncIterator, Object::Iterator => Self::Iterator, Object::ArrayIterator(array_iterator) => Self::ArrayIterator(array_iterator), + #[cfg(feature = "set")] Object::SetIterator(set_iterator) => Self::SetIterator(set_iterator), Object::MapIterator(map_iterator) => Self::MapIterator(map_iterator), Object::Generator(generator) => Self::Generator(generator), @@ -466,6 +475,7 @@ impl HeapMarkAndSweep for HeapRootData { HeapRootData::Proxy(proxy) => proxy.mark_values(queues), #[cfg(feature = "regexp")] HeapRootData::RegExp(reg_exp) => reg_exp.mark_values(queues), + #[cfg(feature = "set")] HeapRootData::Set(set) => set.mark_values(queues), #[cfg(feature = "shared-array-buffer")] HeapRootData::SharedArrayBuffer(shared_array_buffer) => { @@ -503,6 +513,7 @@ impl HeapMarkAndSweep for HeapRootData { HeapRootData::AsyncIterator => todo!(), HeapRootData::Iterator => todo!(), HeapRootData::ArrayIterator(array_iterator) => array_iterator.mark_values(queues), + #[cfg(feature = "set")] HeapRootData::SetIterator(set_iterator) => set_iterator.mark_values(queues), HeapRootData::MapIterator(map_iterator) => map_iterator.mark_values(queues), HeapRootData::Generator(generator) => generator.mark_values(queues), @@ -555,6 +566,7 @@ impl HeapMarkAndSweep for HeapRootData { HeapRootData::Proxy(proxy) => proxy.sweep_values(compactions), #[cfg(feature = "regexp")] HeapRootData::RegExp(reg_exp) => reg_exp.sweep_values(compactions), + #[cfg(feature = "set")] HeapRootData::Set(set) => set.sweep_values(compactions), #[cfg(feature = "shared-array-buffer")] HeapRootData::SharedArrayBuffer(shared_array_buffer) => { @@ -592,6 +604,7 @@ impl HeapMarkAndSweep for HeapRootData { HeapRootData::AsyncIterator => todo!(), HeapRootData::Iterator => todo!(), HeapRootData::ArrayIterator(array_iterator) => array_iterator.sweep_values(compactions), + #[cfg(feature = "set")] HeapRootData::SetIterator(set_iterator) => set_iterator.sweep_values(compactions), HeapRootData::MapIterator(map_iterator) => map_iterator.sweep_values(compactions), HeapRootData::Generator(generator) => generator.sweep_values(compactions), diff --git a/nova_vm/src/heap.rs b/nova_vm/src/heap.rs index 46e74ba28..0c90c4c3b 100644 --- a/nova_vm/src/heap.rs +++ b/nova_vm/src/heap.rs @@ -40,6 +40,11 @@ use crate::ecmascript::builtins::{ typed_array::{data::TypedArrayHeapData, TypedArray}, ArrayBufferHeapData, }; +#[cfg(feature = "set")] +use crate::ecmascript::builtins::{ + keyed_collections::set_objects::set_iterator_objects::set_iterator::SetIteratorHeapData, + set::data::SetHeapData, +}; #[cfg(feature = "weak-refs")] use crate::ecmascript::builtins::{ weak_map::data::WeakMapHeapData, weak_ref::data::WeakRefHeapData, @@ -61,16 +66,12 @@ use crate::{ error::ErrorHeapData, finalization_registry::data::FinalizationRegistryHeapData, indexed_collections::array_objects::array_iterator_objects::array_iterator::ArrayIteratorHeapData, - keyed_collections::{ - map_objects::map_iterator_objects::map_iterator::MapIteratorHeapData, - set_objects::set_iterator_objects::set_iterator::SetIteratorHeapData, - }, + keyed_collections::map_objects::map_iterator_objects::map_iterator::MapIteratorHeapData, map::data::MapHeapData, module::data::ModuleHeapData, primitive_objects::PrimitiveObjectHeapData, promise::data::PromiseHeapData, proxy::data::ProxyHeapData, - set::data::SetHeapData, ArrayBuffer, ArrayHeapData, }, execution::{Environments, Realm, RealmIdentifier}, @@ -138,7 +139,9 @@ pub struct Heap { pub realms: Vec>, #[cfg(feature = "regexp")] pub regexps: Vec>, + #[cfg(feature = "set")] pub sets: Vec>, + #[cfg(feature = "set")] pub set_iterators: Vec>, #[cfg(feature = "shared-array-buffer")] pub shared_array_buffers: Vec>, @@ -250,7 +253,9 @@ impl Heap { #[cfg(feature = "regexp")] regexps: Vec::with_capacity(1024), scripts: Vec::with_capacity(1), + #[cfg(feature = "set")] sets: Vec::with_capacity(128), + #[cfg(feature = "set")] set_iterators: Vec::with_capacity(128), #[cfg(feature = "shared-array-buffer")] shared_array_buffers: Vec::with_capacity(0), diff --git a/nova_vm/src/heap/heap_bits.rs b/nova_vm/src/heap/heap_bits.rs index 7df110128..dedc1befe 100644 --- a/nova_vm/src/heap/heap_bits.rs +++ b/nova_vm/src/heap/heap_bits.rs @@ -20,6 +20,10 @@ use crate::ecmascript::builtins::regexp::RegExp; use crate::ecmascript::builtins::shared_array_buffer::SharedArrayBuffer; #[cfg(feature = "array-buffer")] use crate::ecmascript::builtins::{data_view::DataView, ArrayBuffer}; +#[cfg(feature = "set")] +use crate::ecmascript::builtins::{ + keyed_collections::set_objects::set_iterator_objects::set_iterator::SetIterator, set::Set, +}; #[cfg(feature = "weak-refs")] use crate::ecmascript::builtins::{weak_map::WeakMap, weak_ref::WeakRef, weak_set::WeakSet}; use crate::ecmascript::{ @@ -37,16 +41,12 @@ use crate::ecmascript::{ error::Error, finalization_registry::FinalizationRegistry, indexed_collections::array_objects::array_iterator_objects::array_iterator::ArrayIterator, - keyed_collections::{ - map_objects::map_iterator_objects::map_iterator::MapIterator, - set_objects::set_iterator_objects::set_iterator::SetIterator, - }, + keyed_collections::map_objects::map_iterator_objects::map_iterator::MapIterator, map::Map, module::Module, primitive_objects::PrimitiveObject, promise::Promise, proxy::Proxy, - set::Set, Array, BuiltinConstructorFunction, BuiltinFunction, ECMAScriptFunction, }, execution::{ @@ -109,7 +109,9 @@ pub struct HeapBits { #[cfg(feature = "regexp")] pub regexps: Box<[bool]>, pub scripts: Box<[bool]>, + #[cfg(feature = "set")] pub sets: Box<[bool]>, + #[cfg(feature = "set")] pub set_iterators: Box<[bool]>, #[cfg(feature = "shared-array-buffer")] pub shared_array_buffers: Box<[bool]>, @@ -173,7 +175,9 @@ pub(crate) struct WorkQueues { #[cfg(feature = "regexp")] pub regexps: Vec>, pub scripts: Vec, + #[cfg(feature = "set")] pub sets: Vec>, + #[cfg(feature = "set")] pub set_iterators: Vec>, #[cfg(feature = "shared-array-buffer")] pub shared_array_buffers: Vec>, @@ -237,7 +241,9 @@ impl HeapBits { #[cfg(feature = "regexp")] let regexps = vec![false; heap.regexps.len()]; let scripts = vec![false; heap.scripts.len()]; + #[cfg(feature = "set")] let sets = vec![false; heap.sets.len()]; + #[cfg(feature = "set")] let set_iterators = vec![false; heap.set_iterators.len()]; #[cfg(feature = "shared-array-buffer")] let shared_array_buffers = vec![false; heap.shared_array_buffers.len()]; @@ -298,7 +304,9 @@ impl HeapBits { #[cfg(feature = "regexp")] regexps: regexps.into_boxed_slice(), scripts: scripts.into_boxed_slice(), + #[cfg(feature = "set")] sets: sets.into_boxed_slice(), + #[cfg(feature = "set")] set_iterators: set_iterators.into_boxed_slice(), #[cfg(feature = "shared-array-buffer")] shared_array_buffers: shared_array_buffers.into_boxed_slice(), @@ -367,7 +375,9 @@ impl WorkQueues { #[cfg(feature = "regexp")] regexps: Vec::with_capacity(heap.regexps.len() / 4), scripts: Vec::with_capacity(heap.scripts.len() / 4), + #[cfg(feature = "set")] sets: Vec::with_capacity(heap.sets.len() / 4), + #[cfg(feature = "set")] set_iterators: Vec::with_capacity(heap.set_iterators.len() / 4), #[cfg(feature = "shared-array-buffer")] shared_array_buffers: Vec::with_capacity(heap.shared_array_buffers.len() / 4), @@ -455,7 +465,9 @@ impl WorkQueues { #[cfg(feature = "regexp")] regexps, scripts, + #[cfg(feature = "set")] sets, + #[cfg(feature = "set")] set_iterators, #[cfg(feature = "shared-array-buffer")] shared_array_buffers, @@ -489,7 +501,10 @@ impl WorkQueues { let weak_sets: &[bool; 0] = &[]; #[cfg(not(feature = "regexp"))] let regexps: &[bool; 0] = &[]; - + #[cfg(not(feature = "set"))] + let sets: &[bool; 0] = &[]; + #[cfg(not(feature = "set"))] + let set_iterators: &[bool; 0] = &[]; array_buffers.is_empty() && arrays.is_empty() && array_iterators.is_empty() @@ -743,7 +758,9 @@ pub(crate) struct CompactionLists { #[cfg(feature = "regexp")] pub regexps: CompactionList, pub scripts: CompactionList, + #[cfg(feature = "set")] pub sets: CompactionList, + #[cfg(feature = "set")] pub set_iterators: CompactionList, #[cfg(feature = "shared-array-buffer")] pub shared_array_buffers: CompactionList, @@ -819,7 +836,9 @@ impl CompactionLists { primitive_objects: CompactionList::from_mark_bits(&bits.primitive_objects), #[cfg(feature = "regexp")] regexps: CompactionList::from_mark_bits(&bits.regexps), + #[cfg(feature = "set")] sets: CompactionList::from_mark_bits(&bits.sets), + #[cfg(feature = "set")] set_iterators: CompactionList::from_mark_bits(&bits.set_iterators), strings: CompactionList::from_mark_bits(&bits.strings), #[cfg(feature = "shared-array-buffer")] diff --git a/nova_vm/src/heap/heap_gc.rs b/nova_vm/src/heap/heap_gc.rs index 56f7e3458..1a72874e3 100644 --- a/nova_vm/src/heap/heap_gc.rs +++ b/nova_vm/src/heap/heap_gc.rs @@ -25,6 +25,10 @@ use crate::ecmascript::builtins::regexp::RegExp; use crate::ecmascript::builtins::shared_array_buffer::SharedArrayBuffer; #[cfg(feature = "array-buffer")] use crate::ecmascript::builtins::{data_view::DataView, ArrayBuffer}; +#[cfg(feature = "set")] +use crate::ecmascript::builtins::{ + keyed_collections::set_objects::set_iterator_objects::set_iterator::SetIterator, set::Set, +}; #[cfg(feature = "weak-refs")] use crate::ecmascript::builtins::{weak_map::WeakMap, weak_ref::WeakRef, weak_set::WeakSet}; use crate::{ @@ -43,16 +47,12 @@ use crate::{ error::Error, finalization_registry::FinalizationRegistry, indexed_collections::array_objects::array_iterator_objects::array_iterator::ArrayIterator, - keyed_collections::{ - map_objects::map_iterator_objects::map_iterator::MapIterator, - set_objects::set_iterator_objects::set_iterator::SetIterator, - }, + keyed_collections::map_objects::map_iterator_objects::map_iterator::MapIterator, map::Map, module::Module, primitive_objects::PrimitiveObject, promise::Promise, proxy::Proxy, - set::Set, Array, BuiltinConstructorFunction, BuiltinFunction, ECMAScriptFunction, }, execution::{ @@ -180,7 +180,9 @@ pub fn heap_gc(agent: &mut Agent, root_realms: &mut [Option], g #[cfg(feature = "regexp")] regexps, scripts, + #[cfg(feature = "set")] sets, + #[cfg(feature = "set")] set_iterators, #[cfg(feature = "shared-array-buffer")] shared_array_buffers, @@ -692,33 +694,37 @@ pub fn heap_gc(agent: &mut Agent, root_realms: &mut [Option], g } }); } - let mut set_marks: Box<[Set]> = queues.sets.drain(..).collect(); - set_marks.sort(); - set_marks.iter().for_each(|&idx| { - let index = idx.get_index(); - if let Some(marked) = bits.sets.get_mut(index) { - if *marked { - // Already marked, ignore - return; + #[cfg(feature = "set")] + { + let mut set_marks: Box<[Set]> = queues.sets.drain(..).collect(); + set_marks.sort(); + set_marks.iter().for_each(|&idx| { + let index = idx.get_index(); + if let Some(marked) = bits.sets.get_mut(index) { + if *marked { + // Already marked, ignore + return; + } + *marked = true; + sets.get(index).mark_values(&mut queues); } - *marked = true; - sets.get(index).mark_values(&mut queues); - } - }); + }); - let mut set_iterator_marks: Box<[SetIterator]> = queues.set_iterators.drain(..).collect(); - set_iterator_marks.sort(); - set_iterator_marks.iter().for_each(|&idx| { - let index = idx.get_index(); - if let Some(marked) = bits.set_iterators.get_mut(index) { - if *marked { - // Already marked, ignore - return; + let mut set_iterator_marks: Box<[SetIterator]> = + queues.set_iterators.drain(..).collect(); + set_iterator_marks.sort(); + set_iterator_marks.iter().for_each(|&idx| { + let index = idx.get_index(); + if let Some(marked) = bits.set_iterators.get_mut(index) { + if *marked { + // Already marked, ignore + return; + } + *marked = true; + set_iterators.get(index).mark_values(&mut queues); } - *marked = true; - set_iterators.get(index).mark_values(&mut queues); - } - }); + }); + } #[cfg(feature = "shared-array-buffer")] { let mut shared_array_buffer_marks: Box<[SharedArrayBuffer]> = @@ -1062,7 +1068,9 @@ fn sweep( #[cfg(feature = "regexp")] regexps, scripts, + #[cfg(feature = "set")] sets, + #[cfg(feature = "set")] set_iterators, #[cfg(feature = "shared-array-buffer")] shared_array_buffers, @@ -1421,11 +1429,13 @@ fn sweep( sweep_heap_vector_values(scripts, &compactions, &bits.scripts); }); } + #[cfg(feature = "set")] if !sets.is_empty() { s.spawn(|| { sweep_heap_vector_values(sets, &compactions, &bits.sets); }); } + #[cfg(feature = "set")] if !set_iterators.is_empty() { s.spawn(|| { sweep_heap_vector_values(set_iterators, &compactions, &bits.set_iterators); diff --git a/nova_vm/src/heap/indexes.rs b/nova_vm/src/heap/indexes.rs index 8450c6d31..71efa4d03 100644 --- a/nova_vm/src/heap/indexes.rs +++ b/nova_vm/src/heap/indexes.rs @@ -12,6 +12,11 @@ use crate::ecmascript::builtins::shared_array_buffer::data::SharedArrayBufferHea use crate::ecmascript::builtins::{ data_view::data::DataViewHeapData, typed_array::data::TypedArrayHeapData, ArrayBufferHeapData, }; +#[cfg(feature = "set")] +use crate::ecmascript::builtins::{ + keyed_collections::set_objects::set_iterator_objects::set_iterator::SetIteratorHeapData, + set::data::SetHeapData, +}; #[cfg(feature = "weak-refs")] use crate::ecmascript::builtins::{ weak_map::data::WeakMapHeapData, weak_ref::data::WeakRefHeapData, @@ -21,20 +26,12 @@ use crate::{ ecmascript::{ builtins::{ control_abstraction_objects::generator_objects::GeneratorHeapData, - embedder_object::data::EmbedderObjectHeapData, - error::ErrorHeapData, + embedder_object::data::EmbedderObjectHeapData, error::ErrorHeapData, finalization_registry::data::FinalizationRegistryHeapData, indexed_collections::array_objects::array_iterator_objects::array_iterator::ArrayIteratorHeapData, - keyed_collections::{ - map_objects::map_iterator_objects::map_iterator::MapIteratorHeapData, - set_objects::set_iterator_objects::set_iterator::SetIteratorHeapData, - }, - map::data::MapHeapData, - primitive_objects::PrimitiveObjectHeapData, - promise::data::PromiseHeapData, - proxy::data::ProxyHeapData, - set::data::SetHeapData, - ArrayHeapData, + keyed_collections::map_objects::map_iterator_objects::map_iterator::MapIteratorHeapData, + map::data::MapHeapData, primitive_objects::PrimitiveObjectHeapData, + promise::data::PromiseHeapData, proxy::data::ProxyHeapData, ArrayHeapData, }, types::{ BigIntHeapData, BoundFunctionHeapData, BuiltinConstructorHeapData, @@ -213,7 +210,9 @@ pub type PromiseIndex<'a> = BaseIndex<'a, PromiseHeapData>; pub type ProxyIndex<'a> = BaseIndex<'a, ProxyHeapData>; #[cfg(feature = "regexp")] pub type RegExpIndex<'a> = BaseIndex<'a, RegExpHeapData>; +#[cfg(feature = "set")] pub type SetIndex<'a> = BaseIndex<'a, SetHeapData>; +#[cfg(feature = "set")] pub type SetIteratorIndex<'a> = BaseIndex<'a, SetIteratorHeapData>; #[cfg(feature = "shared-array-buffer")] pub type SharedArrayBufferIndex<'a> = BaseIndex<'a, SharedArrayBufferHeapData>;