Browse Source

Implement `[[HostDefined]]` for `Module` and `Script` (#3381)

* Implement `[[HostDefined]]` for `Module` and `Script`

* Format
pull/3386/head
arexon 1 year ago committed by GitHub
parent
commit
afb9283ce8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      boa_engine/src/module/mod.rs
  2. 15
      boa_engine/src/script.rs

16
boa_engine/src/module/mod.rs

@ -50,7 +50,7 @@ use crate::{
realm::Realm, realm::Realm,
Context, JsError, JsResult, JsString, JsValue, Context, JsError, JsResult, JsString, JsValue,
}; };
use crate::{js_string, JsNativeError, NativeFunction}; use crate::{js_string, HostDefined, JsNativeError, NativeFunction};
/// The referrer from which a load request of a module originates. /// The referrer from which a load request of a module originates.
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -276,7 +276,6 @@ impl std::fmt::Debug for Module {
.field("environment", &self.inner.environment) .field("environment", &self.inner.environment)
.field("namespace", &self.inner.namespace) .field("namespace", &self.inner.namespace)
.field("kind", &self.inner.kind) .field("kind", &self.inner.kind)
.field("host_defined", &self.inner.host_defined)
.finish() .finish()
} }
} }
@ -287,7 +286,7 @@ struct Inner {
environment: GcRefCell<Option<Gc<DeclarativeEnvironment>>>, environment: GcRefCell<Option<Gc<DeclarativeEnvironment>>>,
namespace: GcRefCell<Option<JsObject>>, namespace: GcRefCell<Option<JsObject>>,
kind: ModuleKind, kind: ModuleKind,
host_defined: (), host_defined: HostDefined,
} }
/// The kind of a [`Module`]. /// The kind of a [`Module`].
@ -372,7 +371,7 @@ impl Module {
environment: GcRefCell::default(), environment: GcRefCell::default(),
namespace: GcRefCell::default(), namespace: GcRefCell::default(),
kind: ModuleKind::SourceText(src.clone()), kind: ModuleKind::SourceText(src.clone()),
host_defined: (), host_defined: HostDefined::default(),
}), }),
}; };
@ -388,6 +387,15 @@ impl Module {
&self.inner.realm &self.inner.realm
} }
/// Returns the [`ECMAScript specification`][spec] defined [`\[\[HostDefined\]\]`][`HostDefined`] field of the [`Module`].
///
/// [spec]: https://tc39.es/ecma262/#sec-abstract-module-records
#[inline]
#[must_use]
pub fn host_defined(&self) -> &HostDefined {
&self.inner.host_defined
}
/// Gets the kind of this `Module`. /// Gets the kind of this `Module`.
pub(crate) fn kind(&self) -> &ModuleKind { pub(crate) fn kind(&self) -> &ModuleKind {
&self.inner.kind &self.inner.kind

15
boa_engine/src/script.rs

@ -20,7 +20,7 @@ use crate::{
bytecompiler::ByteCompiler, bytecompiler::ByteCompiler,
realm::Realm, realm::Realm,
vm::{ActiveRunnable, CallFrame, CodeBlock}, vm::{ActiveRunnable, CallFrame, CodeBlock},
Context, JsResult, JsString, JsValue, Module, Context, HostDefined, JsResult, JsString, JsValue, Module,
}; };
/// ECMAScript's [**Script Record**][spec]. /// ECMAScript's [**Script Record**][spec].
@ -37,7 +37,6 @@ impl std::fmt::Debug for Script {
.field("realm", &self.inner.realm.addr()) .field("realm", &self.inner.realm.addr())
.field("code", &self.inner.source) .field("code", &self.inner.source)
.field("loaded_modules", &self.inner.loaded_modules) .field("loaded_modules", &self.inner.loaded_modules)
.field("host_defined", &self.inner.host_defined)
.finish() .finish()
} }
} }
@ -49,7 +48,7 @@ struct Inner {
source: boa_ast::Script, source: boa_ast::Script,
codeblock: GcRefCell<Option<Gc<CodeBlock>>>, codeblock: GcRefCell<Option<Gc<CodeBlock>>>,
loaded_modules: GcRefCell<FxHashMap<JsString, Module>>, loaded_modules: GcRefCell<FxHashMap<JsString, Module>>,
host_defined: (), host_defined: HostDefined,
} }
impl Script { impl Script {
@ -59,6 +58,14 @@ impl Script {
&self.inner.realm &self.inner.realm
} }
/// Returns the [`ECMAScript specification`][spec] defined [`\[\[HostDefined\]\]`][`HostDefined`] field of the [`Module`].
///
/// [spec]: https://tc39.es/ecma262/#script-record
#[must_use]
pub fn host_defined(&self) -> &HostDefined {
&self.inner.host_defined
}
/// Gets the loaded modules of this script. /// Gets the loaded modules of this script.
pub(crate) fn loaded_modules(&self) -> &GcRefCell<FxHashMap<JsString, Module>> { pub(crate) fn loaded_modules(&self) -> &GcRefCell<FxHashMap<JsString, Module>> {
&self.inner.loaded_modules &self.inner.loaded_modules
@ -91,7 +98,7 @@ impl Script {
source: code, source: code,
codeblock: GcRefCell::default(), codeblock: GcRefCell::default(),
loaded_modules: GcRefCell::default(), loaded_modules: GcRefCell::default(),
host_defined: (), host_defined: HostDefined::default(),
}), }),
}) })
} }

Loading…
Cancel
Save