Type correction and opcode implementations
This commit is contained in:
parent
c6e4ecec3d
commit
b053461e74
5 changed files with 307 additions and 148 deletions
|
@ -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([]),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue