Native method registry java.lang.Class wtf

This commit is contained in:
vegowotenks 2024-09-09 15:43:26 +02:00
parent 3282694b32
commit b4c428685f
9 changed files with 987 additions and 40 deletions

View file

@ -1,4 +1,5 @@
use crate::classfile::{ JavaClassFile, AttributeData };
use crate::accessmasks::MethodAccessFlag;
use crate::classfile::{ AttributeData, JavaClassFile };
use crate::heap_area::{ ObjectReference, FieldValue };
#[derive(Copy, Clone, Debug)]
@ -63,6 +64,10 @@ impl OperandStack {
self.push(StackValue::Int(b as i32))
}
FieldValue::Int(i) => {
self.push(StackValue::Int(i))
}
_ => {
println!("{value:?}");
todo!();
@ -244,11 +249,19 @@ pub struct StackFrame {
impl StackFrame {
pub fn new(classfile: &JavaClassFile, class_index: usize, method_index: u16, arguments: &[StackValue]) -> Self {
let method_info = &classfile.methods[method_index as usize];
let code_data = match &method_info.attributes[method_info.code_attribute_index].data {
AttributeData::Code(data) => data,
_ => unreachable!(),
let (max_locals, max_stack) = if method_info.access_flags & MethodAccessFlag::Native {
(arguments.len(), 1)
} else {
let code_data = match &method_info.attributes[method_info.code_attribute_index].data {
AttributeData::Code(data) => data,
_ => unreachable!(),
};
(code_data.max_locals as usize, code_data.max_stack)
};
let mut locals = vec![StackValue::Empty(); code_data.max_locals.into()].into_boxed_slice();
let mut locals = vec![StackValue::Empty(); max_locals].into_boxed_slice();
assert!(locals.len() >= arguments.len());
@ -258,7 +271,7 @@ impl StackFrame {
StackFrame {
locals,
operand_stack: OperandStack::new(code_data.max_stack),
operand_stack: OperandStack::new(max_stack),
class_index,
method_index,
instruction_pointer: 0,