Type correction and opcode implementations

This commit is contained in:
vegowotenks 2024-09-10 17:15:20 +02:00
parent c6e4ecec3d
commit b053461e74
5 changed files with 307 additions and 148 deletions

View file

@ -290,6 +290,14 @@ impl JavaLangClass {
}
}
struct JavaLangStringUTF16 {}
impl JavaLangStringUTF16 {
pub fn is_big_endian(_jvm: &mut JVM) -> Result<JVMCallbackOperation, Error> {
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Int(if cfg!(target_endian = "big") {1} else {0})))
}
}
struct JdkInternalMiscUnsafe {}
impl JdkInternalMiscUnsafe {
@ -357,8 +365,19 @@ impl JdkInternalUtilSystemPropsRaw {
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(array_reference)))
}
// command-line configured properties, should return at least java.home
pub fn vm_properties(jvm: &mut JVM) -> Result<JVMCallbackOperation, Error> {
let array_reference = jvm.heap_area.make_empty_array(&jvm.class_store, AbstractTypeDescription { array_level: 0, kind: AbstractTypeKind::Classname("java/lang/String".into()) }, 2);
let array_length = 4;
let array_reference = jvm.heap_area.make_empty_array(&jvm.class_store, AbstractTypeDescription { array_level: 0, kind: AbstractTypeKind::Classname("java/lang/String".into()) }, array_length);
{
// TODO: Actual java home path
let java_home_key_reference = jvm.heap_area.make_handmade_string(&String::from("java.home"), &jvm.class_store);
let java_home_value_reference = jvm.heap_area.make_handmade_string(&String::from("./"), &jvm.class_store);
jvm.heap_area.object_area.set_array_element(array_reference, 0, java_home_key_reference.into());
jvm.heap_area.object_area.set_array_element(array_reference, 1, java_home_value_reference.into());
}
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(array_reference)))
}
@ -896,6 +915,20 @@ pub fn function_for(class_name: &str, m: &crate::classfile::MethodInfo) -> Resul
Ok(todo_call)
}
("java/lang/StringUTF16", "isBigEndian") => {
// until JDK 23
let expected_descriptor = MethodDescriptor {
argument_types: Box::new([]),
return_type: AbstractTypeDescription { array_level: 0, kind: AbstractTypeKind::Boolean() },
};
if m.descriptor != expected_descriptor {
return Err(Error::RunTimeError(format!("Native descriptor mismatch for method '{class_name}.{method_name}': found '{}' but expected '{}'", m.descriptor.source_string(), expected_descriptor.source_string())));
}
Ok(JavaLangStringUTF16::is_big_endian)
}
("java/lang/Object", "clone") => {
let expected_descriptor = MethodDescriptor {
argument_types: Box::new([]),