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)
}