From 70d3d94d654a95262f39dbd29e1cd50a2d297f27 Mon Sep 17 00:00:00 2001 From: james Date: Thu, 18 Dec 2025 19:03:19 +1030 Subject: [PATCH] Refactor library loading logic and add IntelliJ run configurations --- .idea/runConfigurations/Build.xml | 20 +++++++++ .idea/runConfigurations/Run_roast.xml | 20 +++++++++ crates/core/src/main.rs | 61 ++++++++++++++++++++++++--- 3 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 .idea/runConfigurations/Build.xml create mode 100644 .idea/runConfigurations/Run_roast.xml diff --git a/.idea/runConfigurations/Build.xml b/.idea/runConfigurations/Build.xml new file mode 100644 index 0000000..73b1028 --- /dev/null +++ b/.idea/runConfigurations/Build.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Run_roast.xml b/.idea/runConfigurations/Run_roast.xml new file mode 100644 index 0000000..152c5aa --- /dev/null +++ b/.idea/runConfigurations/Run_roast.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/crates/core/src/main.rs b/crates/core/src/main.rs index f0da5b0..96d2ed1 100644 --- a/crates/core/src/main.rs +++ b/crates/core/src/main.rs @@ -4,6 +4,7 @@ use log::{LevelFilter, error}; use roast_vm_core::error::VmError; use roast_vm_core::stack_used; use roast_vm_core::vm::Vm; +use std::path::PathBuf; use std::time::Instant; fn main() { @@ -25,9 +26,7 @@ fn run() { // .init(); stack_used(); let mut vm = Vm::new(); - vm.load_native_library("roast_vm.dll", load("roast_vm.dll").into()); - vm.load_native_library("jvm.dll", load("jvm.dll").into()); - vm.load_native_library("java.dll", load("java.dll").into()); + fetch_libs(&vm); let start = Instant::now(); match vm.run("org/example/Main") { Ok(_) => { @@ -69,12 +68,62 @@ fn run() { } } -fn load(filename: &str) -> Library { +#[cfg(debug_assertions)] +fn lib_folder() -> PathBuf { let exe_path = std::env::current_exe().expect("get exe path"); - let dll_path = exe_path.parent().unwrap().join(filename); + exe_path + .parent() + .unwrap() + .parent() + .unwrap() + .parent() + .unwrap() + .join("lib") +} - let leeb = unsafe { libloading::os::windows::Library::new(&dll_path) }.expect("load dll"); +#[cfg(not(debug_assertions))] +fn lib_folder() -> PathBuf { + let exe_path = std::env::current_exe().expect("get exe path"); + exe_path.parent().unwrap().join("lib") +} +#[cfg(target_os = "windows")] +fn os_lib_name(name: &str) -> String { + format!("{name}.dll") +} + +#[cfg(target_os = "linux")] +fn os_lib_name(name: &str) -> String { + format!("lib{name}.so") +} + +fn fetch_libs(mut vm: &Vm) { + let exe_path = std::env::current_exe().expect("get exe path"); + let roast_name = os_lib_name("roast_vm"); + let roast_path = exe_path.parent().unwrap().join(roast_name.clone()); + let jvm_name = os_lib_name("jvm"); + let jvm_path = lib_folder().join(jvm_name.clone()); + let java_name = os_lib_name("java"); + let java_path = lib_folder().join(java_name.clone()); + + println!( + "Loading library: {} from path: {:?}", + roast_name, roast_path + ); + vm.load_native_library(&roast_name, load(roast_path).into()); + println!("Loading library: {} from path: {:?}", jvm_name, jvm_path); + vm.load_native_library(&jvm_name, load(jvm_path).into()); + println!("Loading library: {} from path: {:?}", java_name, java_path); + vm.load_native_library(&java_name, load(java_path).into()); +} + +fn load(path: PathBuf) -> Library { + let leeb = unsafe { Library::new(&path) }.expect("load dll"); + Library::from(leeb) +} + +fn linux_load(path: PathBuf) -> Library { + let leeb = unsafe { Library::new(&path) }.expect("load dll"); Library::from(leeb) }