From 9e685bc569a0c950570b359012b2a8c76c15e4a3 Mon Sep 17 00:00:00 2001 From: John Doty Date: Sat, 24 Jun 2023 11:03:07 -0700 Subject: [PATCH] [oden-js] Fix various bugs in module loader --- oden-js/src/module/loader.rs | 6 +++--- oden-js/src/runtime.rs | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/oden-js/src/module/loader.rs b/oden-js/src/module/loader.rs index f21c61f1..d95d5eb8 100644 --- a/oden-js/src/module/loader.rs +++ b/oden-js/src/module/loader.rs @@ -9,7 +9,7 @@ pub enum ModuleSource<'a> { } pub trait ModuleLoader { - fn load(&mut self, context: &ContextRef, name: &str) -> Result; + fn load(&self, context: &ContextRef, name: &str) -> Result; } pub struct DefaultModuleLoader {} @@ -21,7 +21,7 @@ impl DefaultModuleLoader { } impl ModuleLoader for DefaultModuleLoader { - fn load(&mut self, _context: &ContextRef, name: &str) -> Result { + fn load(&self, _context: &ContextRef, name: &str) -> Result { // Attempt to open the file. let path = Path::new(name); match std::fs::read_to_string(path) { @@ -34,7 +34,7 @@ impl ModuleLoader for DefaultModuleLoader { pub(crate) fn load_module( context: &ContextRef, name: &str, - loader: &mut Box, + loader: &Box, ) -> *mut sys::JSModuleDef { match loader.load(context, name) { Ok(ModuleSource::Native(native)) => native.module, diff --git a/oden-js/src/runtime.rs b/oden-js/src/runtime.rs index 4250ffff..0e92e095 100644 --- a/oden-js/src/runtime.rs +++ b/oden-js/src/runtime.rs @@ -3,10 +3,11 @@ use crate::ContextRef; use oden_js_sys as sys; use std::cell::RefCell; use std::ffi::CStr; +use std::sync::Arc; struct PrivateState { refs: u64, - loader: Box, + loader: Arc>, } impl PrivateState { @@ -20,9 +21,16 @@ impl PrivateState { Err(_) => return std::ptr::null_mut(), }; - let state = opaque as *mut PrivateState; + let loader = unsafe { + let ptr = opaque as *const RefCell; + ptr.as_ref() + .expect("We already know this runtime is one of ours!") + .borrow() + .loader + .clone() + }; let context = ContextRef::from_raw(ctx); - load_module(&context, path, &mut (*state).loader) + load_module(&context, path, &loader) } } @@ -39,7 +47,7 @@ impl Runtime { pub fn with_loader(loader: TLoader) -> Runtime { let state = Box::new(RefCell::new(PrivateState { refs: 1, - loader: Box::new(loader), + loader: Arc::new(Box::new(loader)), })); let rt = unsafe { let rt = sys::JS_NewRuntime();