diff options
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 } |