aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/script_module.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/script_module.rs')
-rw-r--r--components/script/script_module.rs24
1 files changed, 21 insertions, 3 deletions
diff --git a/components/script/script_module.rs b/components/script/script_module.rs
index 8e04fd6622a..4b7b7192654 100644
--- a/components/script/script_module.rs
+++ b/components/script/script_module.rs
@@ -44,6 +44,7 @@ use ipc_channel::router::ROUTER;
use js::jsapi::Handle as RawHandle;
use js::jsapi::HandleObject;
use js::jsapi::HandleValue as RawHandleValue;
+use js::jsapi::Value;
use js::jsapi::{CompileModule, ExceptionStackBehavior, FinishDynamicModuleImport};
use js::jsapi::{GetModuleResolveHook, JSRuntime, SetModuleResolveHook};
use js::jsapi::{GetRequestedModules, SetModuleMetadataHook};
@@ -70,6 +71,7 @@ use net_traits::{ResourceFetchTiming, ResourceTimingType};
use servo_url::ServoUrl;
use std::collections::{HashMap, HashSet};
use std::ffi;
+use std::mem;
use std::rc::Rc;
use std::str::FromStr;
use std::sync::{Arc, Mutex};
@@ -449,11 +451,11 @@ impl ModuleTree {
))));
}
- let module_script_data = Box::new(ModuleScript::new(url.clone(), options, Some(owner)));
+ let module_script_data = Rc::new(ModuleScript::new(url.clone(), options, Some(owner)));
SetModulePrivate(
module_script.get(),
- &PrivateValue(Box::into_raw(module_script_data) as *const _),
+ &PrivateValue(Rc::into_raw(module_script_data) as *const _),
);
debug!("module script of {} compile done", url);
@@ -1214,11 +1216,27 @@ pub unsafe fn EnsureModuleHooksInitialized(rt: *mut JSRuntime) {
SetModuleResolveHook(rt, Some(HostResolveImportedModule));
SetModuleMetadataHook(rt, Some(HostPopulateImportMeta));
- SetScriptPrivateReferenceHooks(rt, None, None);
+ SetScriptPrivateReferenceHooks(
+ rt,
+ Some(host_add_ref_top_level_script),
+ Some(host_release_top_level_script),
+ );
SetModuleDynamicImportHook(rt, Some(host_import_module_dynamically));
}
#[allow(unsafe_code)]
+unsafe extern "C" fn host_add_ref_top_level_script(value: *const Value) {
+ let val = Rc::from_raw((*value).to_private() as *const ModuleScript);
+ mem::forget(val.clone());
+ mem::forget(val);
+}
+
+#[allow(unsafe_code)]
+unsafe extern "C" fn host_release_top_level_script(value: *const Value) {
+ let _val = Rc::from_raw((*value).to_private() as *const ModuleScript);
+}
+
+#[allow(unsafe_code)]
/// <https://html.spec.whatwg.org/multipage/#hostimportmoduledynamically(referencingscriptormodule,-specifier,-promisecapability)>
pub unsafe extern "C" fn host_import_module_dynamically(
cx: *mut JSContext,