[oden-js] Fix various bugs in module loader
This commit is contained in:
parent
db8a5f8eed
commit
9e685bc569
2 changed files with 15 additions and 7 deletions
|
|
@ -9,7 +9,7 @@ pub enum ModuleSource<'a> {
|
|||
}
|
||||
|
||||
pub trait ModuleLoader {
|
||||
fn load(&mut self, context: &ContextRef, name: &str) -> Result<ModuleSource>;
|
||||
fn load(&self, context: &ContextRef, name: &str) -> Result<ModuleSource>;
|
||||
}
|
||||
|
||||
pub struct DefaultModuleLoader {}
|
||||
|
|
@ -21,7 +21,7 @@ impl DefaultModuleLoader {
|
|||
}
|
||||
|
||||
impl ModuleLoader for DefaultModuleLoader {
|
||||
fn load(&mut self, _context: &ContextRef, name: &str) -> Result<ModuleSource> {
|
||||
fn load(&self, _context: &ContextRef, name: &str) -> Result<ModuleSource> {
|
||||
// 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<dyn ModuleLoader>,
|
||||
loader: &Box<dyn ModuleLoader>,
|
||||
) -> *mut sys::JSModuleDef {
|
||||
match loader.load(context, name) {
|
||||
Ok(ModuleSource::Native(native)) => native.module,
|
||||
|
|
|
|||
|
|
@ -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<dyn ModuleLoader>,
|
||||
loader: Arc<Box<dyn ModuleLoader>>,
|
||||
}
|
||||
|
||||
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<PrivateState>;
|
||||
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<TLoader: ModuleLoader + 'static>(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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue