diff options
author | CYBAI <cyb.ai.815@gmail.com> | 2020-07-15 18:16:43 +0900 |
---|---|---|
committer | CYBAI <cyb.ai.815@gmail.com> | 2020-07-18 00:43:35 +0900 |
commit | 08723b0e37a83c705810a17f8923882689171345 (patch) | |
tree | 86f91c99ee66488861e0516cf62e6c9185390f0a /components/script/script_module.rs | |
parent | c2feaf14d5b0a943f2128ae5c49e41e776395d14 (diff) | |
download | servo-08723b0e37a83c705810a17f8923882689171345.tar.gz servo-08723b0e37a83c705810a17f8923882689171345.zip |
Handle script private reference hooks properly
Diffstat (limited to 'components/script/script_module.rs')
-rw-r--r-- | components/script/script_module.rs | 24 |
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, |