Fix enumeration issue

This commit is contained in:
VegOwOtenks 2024-09-06 15:04:21 +02:00
parent 3c4921aa54
commit 9243c0b291
4 changed files with 62 additions and 57 deletions

View file

@ -112,7 +112,7 @@ impl JVM {
self.heap_area.object_area.set_object_field(
class_data_object,
"native_class_descriptor_index",
FieldValue::Int(self.class_store.add_native_class_name(class_name.to_string()) as i32),
FieldValue::Int(self.class_store.add_native_class_descriptor(class_name.to_string()) as i32),
self.class_store.class_idx_from_name(&"::NativeClassData".to_string()).unwrap(),
&self.class_store,
).unwrap();
@ -171,7 +171,7 @@ impl JVM {
self.heap_area.object_area.set_object_field(
array_class_data_object,
"native_class_descriptor_index",
FieldValue::Int(self.class_store.add_native_class_name((&array_type_description).into()) as i32),
FieldValue::Int(self.class_store.add_native_class_descriptor((&array_type_description).into()) as i32),
self.class_store.class_idx_from_name(&"::NativeClassData".to_string()).unwrap(),
&self.class_store,
).unwrap();
@ -288,7 +288,7 @@ impl JVM {
]),
attributes: Box::new([]),
};
let entry_frame = StackFrame::new(&entry_class, 0, 0, &[]);
self.class_store.add_class(entry_class, true)?; // 0
self.class_store.add_class(JVM::class_native_class_data(), true)?; // 1
self.class_store.load_class(&"java/lang/Object".to_string())?; // 2
@ -302,23 +302,16 @@ impl JVM {
self.make_array_class("Ljava/lang/Byte;");
self.make_array_class("Ljava/lang/String;");
let argument_array = self.heap_area.make_empty_array(&self.class_store, AbstractTypeDescription { array_level: 0, kind: AbstractTypeKind::Classname("java/lang/String".into()) }, arguments.len());
for (arg_index, argument) in arguments.iter().enumerate() {
let byte_array = self.heap_area.byte_array_from_rust_string(argument, &self.class_store);
self.stack_frames.push(
StackFrame::new(
self.class_store.get_class(&"::EntryPoint".to_string()).unwrap().0,
self.class_store.class_idx_from_name(&"::EntryPoint".to_string()).unwrap(),
1, // method index
&[StackValue::Reference(byte_array), StackValue::Reference(argument_array), StackValue::Int(arg_index as i32)],
)
);
self.heap_area.fill_byte_cache(&self.class_store);
self.run()?;
}
let string_refs = arguments.iter()
.map(|s| self.heap_area.make_handmade_string(&s.to_string(), &self.class_store))
.collect();
let argument_array_ref = self.heap_area.make_array(&self.class_store, string_refs);
// push the entry frame which will call main
let entry_frame = StackFrame::new(self.class_store.get_class(&String::from("::EntryPoint")).unwrap().0, 0, 0, &[StackValue::Reference(argument_array_ref)]);
self.stack_frames.push(entry_frame);
Ok(())
@ -481,31 +474,7 @@ impl JVM {
if name == "java/lang/String" {
let string_entry = class_file.gather_string(constant_value_info.constant_value_index)?;
let (string_class_file, string_class_index) = self.class_store.get_class(name).unwrap();
let string_object = self.heap_area.make_object(&self.class_store, string_class_index);
// TODO: Review this if it looks like there will be stack
// overflows in initialization
let string_init_function_index = match ClassMethodIterator::new(string_class_index, &self.class_store)
.filter(|( cid, _mid, _minfo)| *cid == string_class_index)
.filter(|(_cid, _mid, minfo)| minfo.name == "<init>")
.filter(|(_cid, _mid, minfo)| minfo.descriptor.argument_types.len() == 1)
.filter(|(_cid, _mid, minfo)| minfo.descriptor.argument_types[0] == AbstractTypeDescription { array_level: 1, kind: AbstractTypeKind::Byte() })
.next() {
Some((_, method_index, _)) => method_index,
None => unreachable!(),
};
let byte_array = self.heap_area.byte_array_from_rust_string(string_entry, &self.class_store);
self.stack_frames.push(
StackFrame::new(
string_class_file,
string_class_index,
string_init_function_index as u16,
&[StackValue::Reference(byte_array)],
)
);
let string_object = self.heap_area.make_handmade_string(string_entry, &self.class_store);
FieldValue::Reference(string_object)
} else {