Refactor library loading logic and add IntelliJ run configurations

This commit is contained in:
james 2025-12-18 19:03:19 +10:30
parent 025e6633be
commit 70d3d94d65
No known key found for this signature in database
GPG Key ID: E1FFBA228F4CAD87
3 changed files with 95 additions and 6 deletions

20
.idea/runConfigurations/Build.xml generated Normal file
View File

@ -0,0 +1,20 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Build" type="CargoCommandRunConfiguration" factoryName="Cargo Command" nameIsGenerated="true">
<option name="buildProfileId" value="Custom:dev-opt" />
<option name="command" value="build" />
<option name="workingDirectory" value="file://$PROJECT_DIR$" />
<envs />
<option name="emulateTerminal" value="true" />
<option name="channel" value="DEFAULT" />
<option name="requiredFeatures" value="true" />
<option name="allFeatures" value="false" />
<option name="withSudo" value="false" />
<option name="buildTarget" value="REMOTE" />
<option name="backtrace" value="SHORT" />
<option name="isRedirectInput" value="false" />
<option name="redirectInputPath" value="" />
<method v="2">
<option name="CARGO.BUILD_TASK_PROVIDER" enabled="true" />
</method>
</configuration>
</component>

20
.idea/runConfigurations/Run_roast.xml generated Normal file
View File

@ -0,0 +1,20 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run roast" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
<option name="buildProfileId" value="Custom:dev-opt" />
<option name="command" value="run --bin roast" />
<option name="workingDirectory" value="file://$PROJECT_DIR$" />
<envs />
<option name="emulateTerminal" value="true" />
<option name="channel" value="DEFAULT" />
<option name="requiredFeatures" value="true" />
<option name="allFeatures" value="false" />
<option name="withSudo" value="false" />
<option name="buildTarget" value="REMOTE" />
<option name="backtrace" value="SHORT" />
<option name="isRedirectInput" value="false" />
<option name="redirectInputPath" value="" />
<method v="2">
<option name="RunConfigurationTask" enabled="false" run_configuration_name="Build" run_configuration_type="CargoCommandRunConfiguration" run_configuration_target="RsBuildProfile:Custom:dev-opt" />
</method>
</configuration>
</component>

View File

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