diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2020-11-21 16:23:35 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-21 16:23:35 +0100 |
commit | ec7f1e399e1c1d74bf7af060a21010138de208df (patch) | |
tree | 885c8e83203d149efbf5d74660fa856590c3c9c3 /core/bindings.rs | |
parent | 04f4201f30b03f5afd183eb79cd3f9329a0426b7 (diff) |
refactor(core): don't depend on get_identity_hash for modules (#8354)
This commit refactors "deno_core::Modules" structure to not depend on
"get_identity_hash" function to identify modules, but instead use default
hash implementation.
Diffstat (limited to 'core/bindings.rs')
-rw-r--r-- | core/bindings.rs | 59 |
1 files changed, 30 insertions, 29 deletions
diff --git a/core/bindings.rs b/core/bindings.rs index acf79a36e..4825ed66d 100644 --- a/core/bindings.rs +++ b/core/bindings.rs @@ -264,10 +264,11 @@ pub extern "C" fn host_initialize_import_meta_object_callback( let state_rc = JsRuntime::state(scope); let state = state_rc.borrow(); - let id = module.get_identity_hash(); - assert_ne!(id, 0); - - let info = state.modules.get_info(id).expect("Module not found"); + let module_global = v8::Global::new(scope, module); + let info = state + .modules + .get_info(&module_global) + .expect("Module not found"); let url_key = v8::String::new(scope, "url").unwrap(); let url_val = v8::String::new(scope, &info.name).unwrap(); @@ -713,6 +714,7 @@ fn shared_getter( rv.set(shared_ab.into()) } +// Called by V8 during `Isolate::mod_instantiate`. pub fn module_resolve_callback<'s>( context: v8::Local<'s, v8::Context>, specifier: v8::Local<'s, v8::String>, @@ -721,39 +723,38 @@ pub fn module_resolve_callback<'s>( let scope = &mut unsafe { v8::CallbackScope::new(context) }; let state_rc = JsRuntime::state(scope); - let mut state = state_rc.borrow_mut(); + let state = state_rc.borrow(); - let referrer_id = referrer.get_identity_hash(); - let referrer_name = state + let referrer_global = v8::Global::new(scope, referrer); + let referrer_info = state .modules - .get_info(referrer_id) - .expect("ModuleInfo not found") - .name - .to_string(); - let len_ = referrer.get_module_requests_length(); + .get_info(&referrer_global) + .expect("ModuleInfo not found"); + let referrer_name = referrer_info.name.to_string(); let specifier_str = specifier.to_rust_string_lossy(scope); - for i in 0..len_ { - let req = referrer.get_module_request(i); - let req_str = req.to_rust_string_lossy(scope); - - if req_str == specifier_str { - let id = state.module_resolve_cb(&req_str, referrer_id); - match state.modules.get_info(id) { - Some(info) => return Some(v8::Local::new(scope, &info.handle)), - None => { - let msg = format!( - r#"Cannot resolve module "{}" from "{}""#, - req_str, referrer_name - ); - throw_type_error(scope, msg); - return None; - } - } + let resolved_specifier = state + .loader + .resolve( + state.op_state.clone(), + &specifier_str, + &referrer_name, + false, + ) + .expect("Module should have been already resolved"); + + if let Some(id) = state.modules.get_id(resolved_specifier.as_str()) { + if let Some(handle) = state.modules.get_handle(id) { + return Some(v8::Local::new(scope, handle)); } } + let msg = format!( + r#"Cannot resolve module "{}" from "{}""#, + specifier_str, referrer_name + ); + throw_type_error(scope, msg); None } |