diff --git a/nova_vm/src/ecmascript/builtins.rs b/nova_vm/src/ecmascript/builtins.rs index 4791edeca..5daa34c17 100644 --- a/nova_vm/src/ecmascript/builtins.rs +++ b/nova_vm/src/ecmascript/builtins.rs @@ -54,4 +54,5 @@ pub use builtin_function::{ BuiltinFunctionArgs, BuiltinGetter, ConstructorFn, RegularFn as JsFunction, RegularFn, }; pub(crate) use builtin_function::{BuiltinIntrinsic, BuiltinIntrinsicConstructor}; +pub use control_abstraction_objects::*; pub(crate) use ecmascript_function::*; diff --git a/nova_vm/src/ecmascript/builtins/control_abstraction_objects.rs b/nova_vm/src/ecmascript/builtins/control_abstraction_objects.rs index 6308b216c..863f3d1b0 100644 --- a/nova_vm/src/ecmascript/builtins/control_abstraction_objects.rs +++ b/nova_vm/src/ecmascript/builtins/control_abstraction_objects.rs @@ -8,4 +8,4 @@ pub(crate) mod async_generator_objects; pub(crate) mod generator_function_objects; pub(crate) mod generator_objects; pub(crate) mod iteration; -pub(crate) mod promise_objects; +pub mod promise_objects; diff --git a/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects.rs b/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects.rs index 838f90253..59b4ff8bd 100644 --- a/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects.rs +++ b/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects.rs @@ -2,6 +2,6 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -pub(crate) mod promise_abstract_operations; -pub(crate) mod promise_constructor; -pub(crate) mod promise_prototype; +pub mod promise_abstract_operations; +pub mod promise_constructor; +pub mod promise_prototype; diff --git a/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects/promise_abstract_operations.rs b/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects/promise_abstract_operations.rs index b97e014c3..18ebe0695 100644 --- a/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects/promise_abstract_operations.rs +++ b/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects/promise_abstract_operations.rs @@ -2,7 +2,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -pub(crate) mod promise_capability_records; -pub(crate) mod promise_jobs; -pub(crate) mod promise_reaction_records; -pub(crate) mod promise_resolving_functions; +pub mod promise_capability_records; +pub mod promise_jobs; +pub mod promise_reaction_records; +pub mod promise_resolving_functions; diff --git a/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects/promise_abstract_operations/promise_capability_records.rs b/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects/promise_abstract_operations/promise_capability_records.rs index 8c022c07c..9a2c20dcc 100644 --- a/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects/promise_abstract_operations/promise_capability_records.rs +++ b/nova_vm/src/ecmascript/builtins/control_abstraction_objects/promise_objects/promise_abstract_operations/promise_capability_records.rs @@ -38,7 +38,7 @@ use super::promise_jobs::new_promise_resolve_thenable_job; /// state is Fulfilled or Rejected. If true, it also counts as already resolved /// if it's Pending but `is_resolved` is set to true. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub(crate) struct PromiseCapability { +pub struct PromiseCapability { promise: Promise, must_be_unresolved: bool, } @@ -47,18 +47,18 @@ impl PromiseCapability { /// [27.2.1.5 NewPromiseCapability ( C )](https://tc39.es/ecma262/#sec-newpromisecapability) /// NOTE: Our implementation doesn't take C as a parameter, since we don't /// yet support promise subclassing. - pub(crate) fn new(agent: &mut Agent) -> Self { + pub fn new(agent: &mut Agent) -> Self { Self::from_promise(agent.heap.create(PromiseHeapData::default()), true) } - pub(crate) fn from_promise(promise: Promise, must_be_unresolved: bool) -> Self { + pub fn from_promise(promise: Promise, must_be_unresolved: bool) -> Self { Self { promise, must_be_unresolved, } } - pub(crate) fn promise(&self) -> Promise { + pub fn promise(&self) -> Promise { self.promise } diff --git a/nova_vm/src/ecmascript/execution/agent.rs b/nova_vm/src/ecmascript/execution/agent.rs index d105e2d42..a380f6813 100644 --- a/nova_vm/src/ecmascript/execution/agent.rs +++ b/nova_vm/src/ecmascript/execution/agent.rs @@ -7,6 +7,8 @@ //! - This is inspired by and/or copied from Kiesel engine: //! Copyright (c) 2023-2024 Linus Groh +use oxc_ast::ast; + use super::{ environments::get_identifier_reference, EnvironmentIndex, ExecutionContext, Realm, RealmIdentifier, @@ -21,7 +23,7 @@ use crate::{ heap::CreateHeapData, Heap, }; -use std::collections::HashMap; +use std::{any::Any, collections::HashMap}; #[derive(Debug, Default)] pub struct Options { @@ -122,6 +124,20 @@ pub trait HostHooks: std::fmt::Debug { ) { // The default implementation of HostPromiseRejectionTracker is to return unused. } + + /// Handle import declarations. + /// + /// Note: This will panic if not implemented manually. + fn import_module(&self, _import: &ast::ImportDeclaration<'_>, _agent: &mut Agent) { + unimplemented!() + } + + /// Get access to the Host data, useful to share state between calls of built-in functions. + /// + /// Note: This will panic if not implemented manually. + fn get_host_data(&self) -> &dyn Any { + unimplemented!() + } } /// ### [9.7 Agents](https://tc39.es/ecma262/#sec-agents) @@ -182,13 +198,20 @@ impl Agent { JsError(self.create_exception(kind, message)) } - pub(crate) fn running_execution_context(&self) -> &ExecutionContext { + pub fn running_execution_context(&self) -> &ExecutionContext { self.execution_context_stack.last().unwrap() } pub(crate) fn running_execution_context_mut(&mut self) -> &mut ExecutionContext { self.execution_context_stack.last_mut().unwrap() } + + /// Get access to the Host data, useful to share state between calls of built-in functions. + /// + /// Note: This will panic if not implemented manually. + pub fn get_host_data(&self) -> &dyn Any { + self.host_hooks.get_host_data() + } } /// ### [9.4.1 GetActiveScriptOrModule ()](https://tc39.es/ecma262/#sec-getactivescriptormodule) diff --git a/nova_vm/src/ecmascript/execution/execution_context.rs b/nova_vm/src/ecmascript/execution/execution_context.rs index 6a77d5be8..8275b3e37 100644 --- a/nova_vm/src/ecmascript/execution/execution_context.rs +++ b/nova_vm/src/ecmascript/execution/execution_context.rs @@ -48,12 +48,12 @@ pub(crate) struct ECMAScriptCodeEvaluationState { /// references to the running execution context in this specification denote /// the running execution context of the surrounding agent. #[derive(Debug)] -pub(crate) struct ExecutionContext { +pub struct ExecutionContext { /// ### code evaluation state /// /// Any state needed to perform, suspend, and resume evaluation of the code /// associated with this execution context. - pub ecmascript_code: Option, + pub(crate) ecmascript_code: Option, /// ### Function /// diff --git a/nova_vm/src/ecmascript/execution/realm.rs b/nova_vm/src/ecmascript/execution/realm.rs index e5864b70d..1bebac2a8 100644 --- a/nova_vm/src/ecmascript/execution/realm.rs +++ b/nova_vm/src/ecmascript/execution/realm.rs @@ -152,7 +152,7 @@ pub struct Realm { /// /// Field reserved for use by hosts that need to associate additional /// information with a Realm Record. - pub(crate) host_defined: Option<&'static dyn Any>, + pub host_defined: Option<&'static dyn Any>, } unsafe impl Send for Realm {} diff --git a/nova_vm/src/ecmascript/scripts_and_modules.rs b/nova_vm/src/ecmascript/scripts_and_modules.rs index 0ec517862..34f65a4c4 100644 --- a/nova_vm/src/ecmascript/scripts_and_modules.rs +++ b/nova_vm/src/ecmascript/scripts_and_modules.rs @@ -12,7 +12,7 @@ pub mod module; pub mod script; #[derive(Debug, Clone, Copy)] -pub(crate) enum ScriptOrModule { +pub enum ScriptOrModule { Script(ScriptIdentifier), Module(Module), } diff --git a/nova_vm/src/ecmascript/scripts_and_modules/script.rs b/nova_vm/src/ecmascript/scripts_and_modules/script.rs index 4cefebe49..fc59b44d9 100644 --- a/nova_vm/src/ecmascript/scripts_and_modules/script.rs +++ b/nova_vm/src/ecmascript/scripts_and_modules/script.rs @@ -41,7 +41,7 @@ use std::{ pub type HostDefined = &'static mut dyn Any; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub(crate) struct ScriptIdentifier(u32, PhantomData