From 7d0b57f69664cbdf9ff4862afc9e367a5c9b7753 Mon Sep 17 00:00:00 2001 From: Dean Srebnik <49134864+load1n9@users.noreply.github.com> Date: Tue, 15 Oct 2024 12:50:31 -0400 Subject: [PATCH 1/2] feat: atomics behind atomics feature --- nova_vm/Cargo.toml | 3 ++- .../ecmascript/builtins/structured_data.rs | 1 + nova_vm/src/ecmascript/execution/realm.rs | 24 ++++++++++--------- .../ecmascript/execution/realm/intrinsics.rs | 7 ++++-- nova_vm/src/heap/heap_constants.rs | 1 + 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/nova_vm/Cargo.toml b/nova_vm/Cargo.toml index d2433b3dd..57a6f8b85 100644 --- a/nova_vm/Cargo.toml +++ b/nova_vm/Cargo.toml @@ -24,13 +24,14 @@ unicode-normalization = { workspace = true } wtf8 = { workspace = true } [features] -default = ["math", "json", "date", "array-buffer", "shared-array-buffer", "weak-refs"] +default = ["math", "json", "date", "array-buffer", "shared-array-buffer", "weak-refs", "atomics"] math = [] json = ["sonic-rs"] date = [] array-buffer = [] shared-array-buffer = [] weak-refs = [] +atomics = [] typescript = [] [build-dependencies] diff --git a/nova_vm/src/ecmascript/builtins/structured_data.rs b/nova_vm/src/ecmascript/builtins/structured_data.rs index 7f09afe82..031e9408d 100644 --- a/nova_vm/src/ecmascript/builtins/structured_data.rs +++ b/nova_vm/src/ecmascript/builtins/structured_data.rs @@ -4,6 +4,7 @@ #[cfg(feature = "array-buffer")] pub(crate) mod array_buffer_objects; +#[cfg(feature = "atomics")] pub(crate) mod atomics_object; #[cfg(feature = "array-buffer")] pub(crate) mod data_view_objects; diff --git a/nova_vm/src/ecmascript/execution/realm.rs b/nova_vm/src/ecmascript/execution/realm.rs index 1f7f4a8d8..5fef330bf 100644 --- a/nova_vm/src/ecmascript/execution/realm.rs +++ b/nova_vm/src/ecmascript/execution/realm.rs @@ -982,17 +982,19 @@ pub(crate) fn set_default_global_bindings( // 19.4 Other Properties of the Global Object { // 19.4.1 Atomics - let name = PropertyKey::from(BUILTIN_STRING_MEMORY.Atomics); - let value = agent.get_realm(realm_id).intrinsics().atomics(); - 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)?; - + #[cfg(feature = "atomics")] + { + let name = PropertyKey::from(BUILTIN_STRING_MEMORY.Atomics); + let value = agent.get_realm(realm_id).intrinsics().atomics(); + 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)?; + } // 19.4.2 JSON #[cfg(feature = "json")] { diff --git a/nova_vm/src/ecmascript/execution/realm/intrinsics.rs b/nova_vm/src/ecmascript/execution/realm/intrinsics.rs index ecd2e83bd..39b3cf52a 100644 --- a/nova_vm/src/ecmascript/execution/realm/intrinsics.rs +++ b/nova_vm/src/ecmascript/execution/realm/intrinsics.rs @@ -22,6 +22,8 @@ use crate::ecmascript::builtins::numbers_and_dates::date_objects::{ }; #[cfg(feature = "math")] use crate::ecmascript::builtins::numbers_and_dates::math_object::MathObject; +#[cfg(feature = "atomics")] +use crate::ecmascript::builtins::structured_data::atomics_object::AtomicsObject; #[cfg(feature = "json")] use crate::ecmascript::builtins::structured_data::json_object::JSONObject; #[cfg(feature = "shared-array-buffer")] @@ -96,7 +98,6 @@ use crate::{ }, primitive_objects::PrimitiveObject, reflection::{proxy_constructor::ProxyConstructor, reflect_object::ReflectObject}, - structured_data::atomics_object::AtomicsObject, text_processing::{ regexp_objects::{ regexp_constructor::RegExpConstructor, regexp_prototype::RegExpPrototype, @@ -149,7 +150,6 @@ use crate::{ IntrinsicObjectIndexes, IntrinsicPrimitiveObjectIndexes, WorkQueues, }, }; - #[derive(Debug, Clone)] pub(crate) struct Intrinsics { pub(crate) object_index_base: ObjectIndex, @@ -329,6 +329,7 @@ impl Intrinsics { DataViewPrototype::create_intrinsic(agent, realm); #[cfg(feature = "array-buffer")] DataViewConstructor::create_intrinsic(agent, realm); + #[cfg(feature = "atomics")] AtomicsObject::create_intrinsic(agent, realm); #[cfg(feature = "json")] JSONObject::create_intrinsic(agent, realm); @@ -612,6 +613,7 @@ impl Intrinsics { } /// %Atomics% + #[cfg(feature = "atomics")] pub(crate) fn atomics(&self) -> OrdinaryObject { IntrinsicObjectIndexes::AtomicsObject .get_object_index(self.object_index_base) @@ -1618,6 +1620,7 @@ impl HeapMarkAndSweep for Intrinsics { self.async_generator_function().mark_values(queues); self.async_generator_prototype().mark_values(queues); self.async_iterator_prototype().mark_values(queues); + #[cfg(feature = "atomics")] self.atomics().mark_values(queues); self.big_int_prototype().mark_values(queues); self.big_int().mark_values(queues); diff --git a/nova_vm/src/heap/heap_constants.rs b/nova_vm/src/heap/heap_constants.rs index ce5aa640e..f93e6fd95 100644 --- a/nova_vm/src/heap/heap_constants.rs +++ b/nova_vm/src/heap/heap_constants.rs @@ -74,6 +74,7 @@ pub(crate) enum IntrinsicObjectIndexes { SharedArrayBufferPrototype, #[cfg(feature = "array-buffer")] DataViewPrototype, + #[cfg(feature = "atomics")] AtomicsObject, JSONObject, From 2ce2092333981f727b2911da678c268e30f4d20d Mon Sep 17 00:00:00 2001 From: Dean Srebnik <49134864+load1n9@users.noreply.github.com> Date: Wed, 16 Oct 2024 11:03:12 -0400 Subject: [PATCH 2/2] feat: atomics feat depend on ab and sab --- nova_vm/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nova_vm/Cargo.toml b/nova_vm/Cargo.toml index 57a6f8b85..582fbebb2 100644 --- a/nova_vm/Cargo.toml +++ b/nova_vm/Cargo.toml @@ -31,7 +31,7 @@ date = [] array-buffer = [] shared-array-buffer = [] weak-refs = [] -atomics = [] +atomics = ["array-buffer", "shared-array-buffer"] typescript = [] [build-dependencies]