Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Serial-ATA committed Jan 20, 2025
1 parent 239e5bc commit c6d46c8
Show file tree
Hide file tree
Showing 39 changed files with 333 additions and 79 deletions.
2 changes: 1 addition & 1 deletion jni/src/env/method.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ impl super::JniEnv {

unsafe {
let invoke_interface = self.as_native_interface();
((*invoke_interface).CallStaticVoidMethod)(
((*invoke_interface).CallStaticVoidMethodA)(
self.0 as _,
class.raw(),
method_id.raw(),
Expand Down
12 changes: 11 additions & 1 deletion jni/src/java_vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,17 @@ fn default_libjvm_path() -> PathBuf {

#[cfg(not(debug_assertions))]
fn default_libjvm_path() -> PathBuf {
todo!("Determine libjvm path")
let target = std::env::var("CARGO_TARGET_DIR").map_or_else(
|_| {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.join("target")
},
PathBuf::from,
);

target.join("release").join("libjvm_runtime.so")
}

/// A wrapper around a built [`jni_sys::JavaVM`]
Expand Down
17 changes: 17 additions & 0 deletions jni/src/objects.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use jni_sys::{jboolean, jbyte, jchar, jdouble, jfloat, jint, jlong, jobject, jshort, jvalue};
use std::fmt::{Debug, Formatter};

#[derive(Copy, Clone)]
pub enum JValue {
Expand All @@ -13,6 +14,22 @@ pub enum JValue {
Object(jobject),
}

impl Debug for JValue {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
match self {
JValue::Boolean(v) => v.fmt(f),
JValue::Byte(v) => v.fmt(f),
JValue::Char(v) => v.fmt(f),
JValue::Short(v) => v.fmt(f),
JValue::Int(v) => v.fmt(f),
JValue::Long(v) => v.fmt(f),
JValue::Float(v) => v.fmt(f),
JValue::Double(v) => v.fmt(f),
JValue::Object(v) => v.fmt(f),
}
}
}

impl JValue {
pub fn raw(self) -> jvalue {
match self {
Expand Down
1 change: 1 addition & 0 deletions runtime/src/globals/fields.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

//! Various offsets for fields of frequently accessed classes
#[allow(dead_code)] // This is used in the `field_constructor!` macro
const MAX_FIELD_COUNT: usize = 8;

macro_rules! get_sym {
Expand Down
2 changes: 1 addition & 1 deletion runtime/src/initialization.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use common::int_types::s4;
use instructions::Operand;
use jni::error::JniError;
use jni::java_vm::JavaVm;
use jni::sys::{JavaVM, JavaVMInitArgs, JNI_ERR, JNI_OK};
use jni::sys::{JavaVMInitArgs, JNI_OK};
use symbols::sym;

pub fn create_java_vm(args: Option<&JavaVMInitArgs>) -> Result<JavaVm, JniError> {
Expand Down
1 change: 1 addition & 0 deletions runtime/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#![allow(warnings)]
#![feature(c_variadic)]
#![feature(box_into_inner)]
#![feature(thread_local)]
Expand Down
1 change: 0 additions & 1 deletion runtime/src/native/java/io/FileDescriptor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ use crate::objects::class::Class;
use crate::objects::instance::Instance;
use crate::objects::reference::Reference;

use std::ptr::NonNull;
use std::sync::atomic::{AtomicBool, Ordering};

use ::jni::env::JniEnv;
Expand Down
1 change: 0 additions & 1 deletion runtime/src/native/java/io/FileInputStream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
use crate::objects::class::Class;
use crate::objects::reference::Reference;

use std::ptr::NonNull;
use std::sync::atomic::{AtomicBool, Ordering};

use ::jni::env::JniEnv;
Expand Down
1 change: 0 additions & 1 deletion runtime/src/native/java/io/FileOutputStream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ use crate::thread::JavaThread;
use std::io::Write;
use std::mem::ManuallyDrop;
use std::os::fd::{FromRawFd, RawFd};
use std::ptr::NonNull;
use std::sync::atomic::{AtomicBool, Ordering};

use ::jni::env::JniEnv;
Expand Down
1 change: 0 additions & 1 deletion runtime/src/native/java/io/UnixFileSystem.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ use crate::objects::instance::Instance;
use crate::objects::reference::Reference;
use crate::string_interner::StringInterner;

use std::ptr::NonNull;
use std::sync::atomic::{AtomicBool, Ordering};

use ::jni::env::JniEnv;
Expand Down
1 change: 0 additions & 1 deletion runtime/src/native/java/lang/Class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ use crate::objects::reference::Reference;
use crate::string_interner::StringInterner;
use crate::thread::JavaThread;

use std::ptr::NonNull;
use std::sync::Arc;

use ::jni::env::JniEnv;
Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/java/lang/ClassLoader.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use crate::objects::class::Class;
use crate::objects::reference::Reference;

use std::ptr::NonNull;

use ::jni::env::JniEnv;
use ::jni::sys::jint;

Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/java/lang/Double.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
use crate::objects::class::Class;

use std::ptr::NonNull;

use ::jni::env::JniEnv;
use common::int_types::{s8, u8};

Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/java/lang/Object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use crate::objects::instance::CloneableInstance;
use crate::objects::reference::Reference;
use crate::thread::JavaThread;

use std::ptr::NonNull;

use ::jni::env::JniEnv;
use ::jni::sys::{jint, jlong};
use common::traits::PtrType;
Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/java/lang/Runtime.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
use crate::objects::reference::Reference;

use std::ptr::NonNull;

use ::jni::env::JniEnv;
use common::int_types::{s4, s8};

Expand Down
1 change: 0 additions & 1 deletion runtime/src/native/java/lang/StackTraceElement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ use crate::string_interner::StringInterner;
use crate::thread::exceptions::throw;
use crate::thread::JavaThread;

use std::ptr::NonNull;
use std::sync::atomic::{AtomicBool, Ordering};

use ::jni::env::JniEnv;
Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/java/lang/StringUTF16.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use crate::include_generated;
use crate::objects::class::Class;

use std::ptr::NonNull;

use ::jni::env::JniEnv;
use common::int_types::s4;

Expand Down
1 change: 0 additions & 1 deletion runtime/src/native/java/lang/System.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ use crate::objects::class::Class;
use crate::objects::reference::Reference;
use crate::thread::JavaThread;

use std::ptr::NonNull;
use std::time::{SystemTime, UNIX_EPOCH};

use ::jni::env::JniEnv;
Expand Down
1 change: 0 additions & 1 deletion runtime/src/native/java/lang/Thread.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ use crate::thread::pool::ThreadPool;
use crate::thread::{java_lang_Thread, JavaThread, JavaThreadBuilder};

use std::cmp;
use std::ptr::NonNull;
use std::sync::atomic::AtomicUsize;

use ::jni::env::JniEnv;
Expand Down
1 change: 0 additions & 1 deletion runtime/src/native/java/lang/Throwable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ use crate::objects::reference::Reference;
use crate::thread::frame::stack::VisibleStackFrame;
use crate::thread::JavaThread;

use std::ptr::NonNull;
use std::sync::atomic::Ordering;
use std::sync::Once;

Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/java/lang/ref/Finalizer.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use crate::objects::class::Class;
use crate::objects::reference::Reference;

use std::ptr::NonNull;

use jni::env::JniEnv;
use jni::sys::jboolean;

Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/java/lang/ref/Reference.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use crate::objects::class::Class;
use crate::objects::instance::Instance;
use crate::objects::reference::Reference;

use std::ptr::NonNull;

use jni::env::JniEnv;
use jni::sys::jboolean;

Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/java/security/AccessController.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use crate::objects::class::Class;
use crate::objects::reference::Reference;

use std::ptr::NonNull;

use jni::env::JniEnv;

include_generated!("native/java/security/def/AccessController.definitions.rs");
Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/jdk/internal/misc/CDS.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use crate::objects::class::Class;
use crate::objects::reference::Reference;

use std::ptr::NonNull;

use ::jni::env::JniEnv;
use ::jni::sys::{jint, jlong};

Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/jdk/internal/misc/ScopedMemoryAccess.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
use crate::objects::reference::Reference;

use std::ptr::NonNull;

use ::jni::env::JniEnv;

include_generated!("native/jdk/internal/misc/def/ScopedMemoryAccess.definitions.rs");
Expand Down
2 changes: 0 additions & 2 deletions runtime/src/native/jdk/internal/misc/VM.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use crate::include_generated;
use crate::objects::class::Class;
use crate::objects::reference::Reference;

use std::ptr::NonNull;

use ::jni::env::JniEnv;
use common::int_types::s8;

Expand Down
35 changes: 33 additions & 2 deletions runtime/src/native/jni/array.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
use super::{classref_from_jclass, reference_from_jobject, IntoJni};
use crate::objects::array::ArrayInstance;
use crate::objects::reference::Reference;

use core::ffi::c_void;
use std::ptr;

use common::int_types::s4;
use common::traits::PtrType;
use instructions::Operand;
use jni::sys::{
jarray, jboolean, jbooleanArray, jbyte, jbyteArray, jchar, jcharArray, jclass, jdouble,
jdoubleArray, jfloat, jfloatArray, jint, jintArray, jlong, jlongArray, jobject, jobjectArray,
Expand All @@ -17,7 +26,16 @@ pub extern "system" fn NewObjectArray(
clazz: jclass,
init: jobject,
) -> jobjectArray {
unimplemented!("jni::NewObjectArray")
let class = unsafe { classref_from_jclass(clazz) };
let Some(class) = class else {
return ptr::null_mut() as jobjectArray;
};

if init.is_null() {
return Reference::array(ArrayInstance::new_reference(len as s4, class)).into_jni();
}

unimplemented!("jni::NewObjectArray with non-null init")
}

#[no_mangle]
Expand All @@ -36,7 +54,20 @@ pub extern "system" fn SetObjectArrayElement(
index: jsize,
val: jobject,
) {
unimplemented!("jni::SetObjectArrayElement")
let array = unsafe { reference_from_jobject(array as jobject) };
let Some(array) = array else {
return; // TODO: NPE?
};

let array = array.extract_array();

let val = unsafe { reference_from_jobject(val) };
let Some(val) = val else {
return; // TODO: ArrayStoreException?
};

let instance = array.get_mut();
instance.store(index as s4, Operand::Reference(val));
}

#[no_mangle]
Expand Down
10 changes: 7 additions & 3 deletions runtime/src/native/jni/class.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use super::{classref_from_jclass, IntoJni};
use crate::classpath::loader::ClassLoader;
use crate::objects::class::Class;
use crate::thread::exceptions::throw_with_ret;
use crate::thread::JavaThread;

use core::ffi::{c_char, CStr};
Expand All @@ -22,23 +23,26 @@ pub unsafe extern "system" fn DefineClass(

#[no_mangle]
pub unsafe extern "system" fn FindClass(env: *mut JNIEnv, name: *const c_char) -> jclass {
let thread = JavaThread::current();
assert_eq!(thread.env().raw(), env);

let name = unsafe { CStr::from_ptr(name) };

// Initially assume the system loader
let mut loader = ClassLoader::bootstrap();

let thread = JavaThread::current();
let frame_stack = thread.frame_stack();
if let Some(current_frame) = frame_stack.current() {
// If we can find a caller frame, use its loader instead
loader = current_frame.method().class().loader();
}

if let Some(class) = loader.lookup_class(Symbol::intern_bytes(name.to_bytes())) {
if let Some(class) = loader.load(Symbol::intern_bytes(name.to_bytes())) {
return class.into_jni();
}

return core::ptr::null::<&'static Class>() as jclass;
let ret = core::ptr::null::<&'static Class>() as jclass;
throw_with_ret!(ret, thread, NoClassDefFoundError, name.to_string_lossy());
}

#[no_mangle]
Expand Down
Loading

0 comments on commit c6d46c8

Please sign in to comment.