Char arrays
This commit is contained in:
parent
6610b09c16
commit
c6e4ecec3d
6 changed files with 407 additions and 55 deletions
|
@ -49,6 +49,8 @@ impl JavaLangClass {
|
|||
};
|
||||
// max_locals: 1
|
||||
// max_stack: 1
|
||||
let class = jvm.class_store.class_file_from_idx(frame.class_index).unwrap();
|
||||
let method = &class.methods[frame.method_index as usize];
|
||||
let class_class_index = jvm.class_store.class_idx_from_name(&String::from("java/lang/Class")).unwrap();
|
||||
let (string_class_file, string_class_index) = jvm.class_store.get_class(&String::from("java/lang/String")).unwrap();
|
||||
let string_equals_index = string_class_file.find_method_index(&String::from("equals")).unwrap();
|
||||
|
@ -57,7 +59,9 @@ impl JavaLangClass {
|
|||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
match frame.instruction_pointer {
|
||||
frame.instruction_pointer += 1;
|
||||
|
||||
match frame.instruction_pointer - 1 {
|
||||
0 => {
|
||||
let boolean_class_ref = jvm.class_store.primitive_classes.boolean_class;
|
||||
let boolean_class_name_ref = match jvm.heap_area.object_area.get_object_field(
|
||||
|
@ -77,10 +81,206 @@ impl JavaLangClass {
|
|||
&[StackValue::Reference(boolean_class_name_ref), StackValue::Reference(passed_wanted_string)],
|
||||
);
|
||||
|
||||
frame.instruction_pointer += 1;
|
||||
|
||||
Ok(JVMCallbackOperation::PushFrame(string_compare_frame))
|
||||
},
|
||||
}
|
||||
|
||||
1 => {
|
||||
if wrap_stackframe_error(class, method, frame.operand_stack.pop_int(0))? == 1 {
|
||||
let boolean_class_ref = jvm.class_store.primitive_classes.boolean_class;
|
||||
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(boolean_class_ref)))
|
||||
} else {
|
||||
let byte_class_ref = jvm.class_store.primitive_classes.byte_class;
|
||||
let byte_class_name_ref = match jvm.heap_area.object_area.get_object_field(
|
||||
byte_class_ref,
|
||||
"name",
|
||||
class_class_index,
|
||||
&jvm.class_store
|
||||
).unwrap() {
|
||||
FieldValue::Reference(r) => r,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let string_compare_frame = StackFrame::new(
|
||||
string_class_file,
|
||||
string_class_index,
|
||||
string_equals_index as u16,
|
||||
&[StackValue::Reference(byte_class_name_ref), StackValue::Reference(passed_wanted_string)],
|
||||
);
|
||||
|
||||
Ok(JVMCallbackOperation::PushFrame(string_compare_frame))
|
||||
}
|
||||
}
|
||||
|
||||
2 => {
|
||||
if wrap_stackframe_error(class, method, frame.operand_stack.pop_int(0))? == 1 {
|
||||
let char_class_ref = jvm.class_store.primitive_classes.char_class;
|
||||
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(char_class_ref)))
|
||||
} else {
|
||||
let char_class_ref = jvm.class_store.primitive_classes.char_class;
|
||||
let char_class_name_ref = match jvm.heap_area.object_area.get_object_field(
|
||||
char_class_ref,
|
||||
"name",
|
||||
class_class_index,
|
||||
&jvm.class_store
|
||||
).unwrap() {
|
||||
FieldValue::Reference(r) => r,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let string_compare_frame = StackFrame::new(
|
||||
string_class_file,
|
||||
string_class_index,
|
||||
string_equals_index as u16,
|
||||
&[StackValue::Reference(char_class_name_ref), StackValue::Reference(passed_wanted_string)],
|
||||
);
|
||||
|
||||
Ok(JVMCallbackOperation::PushFrame(string_compare_frame))
|
||||
}
|
||||
}
|
||||
|
||||
3 => {
|
||||
if wrap_stackframe_error(class, method, frame.operand_stack.pop_int(0))? == 1 {
|
||||
let short_class_ref = jvm.class_store.primitive_classes.short_class;
|
||||
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(short_class_ref)))
|
||||
} else {
|
||||
let short_class_ref = jvm.class_store.primitive_classes.short_class;
|
||||
let short_class_name_ref = match jvm.heap_area.object_area.get_object_field(
|
||||
short_class_ref,
|
||||
"name",
|
||||
class_class_index,
|
||||
&jvm.class_store
|
||||
).unwrap() {
|
||||
FieldValue::Reference(r) => r,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let string_compare_frame = StackFrame::new(
|
||||
string_class_file,
|
||||
string_class_index,
|
||||
string_equals_index as u16,
|
||||
&[StackValue::Reference(short_class_name_ref), StackValue::Reference(passed_wanted_string)],
|
||||
);
|
||||
|
||||
Ok(JVMCallbackOperation::PushFrame(string_compare_frame))
|
||||
}
|
||||
}
|
||||
|
||||
4 => {
|
||||
if wrap_stackframe_error(class, method, frame.operand_stack.pop_int(0))? == 1 {
|
||||
let int_class_ref = jvm.class_store.primitive_classes.int_class;
|
||||
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(int_class_ref)))
|
||||
} else {
|
||||
let int_class_ref = jvm.class_store.primitive_classes.int_class;
|
||||
let int_class_name_ref = match jvm.heap_area.object_area.get_object_field(
|
||||
int_class_ref,
|
||||
"name",
|
||||
class_class_index,
|
||||
&jvm.class_store
|
||||
).unwrap() {
|
||||
FieldValue::Reference(r) => r,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let string_compare_frame = StackFrame::new(
|
||||
string_class_file,
|
||||
string_class_index,
|
||||
string_equals_index as u16,
|
||||
&[StackValue::Reference(int_class_name_ref), StackValue::Reference(passed_wanted_string)],
|
||||
);
|
||||
|
||||
Ok(JVMCallbackOperation::PushFrame(string_compare_frame))
|
||||
}
|
||||
}
|
||||
|
||||
5 => {
|
||||
if wrap_stackframe_error(class, method, frame.operand_stack.pop_int(0))? == 1 {
|
||||
let float_class_ref = jvm.class_store.primitive_classes.float_class;
|
||||
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(float_class_ref)))
|
||||
} else {
|
||||
let float_class_ref = jvm.class_store.primitive_classes.float_class;
|
||||
let float_class_name_ref = match jvm.heap_area.object_area.get_object_field(
|
||||
float_class_ref,
|
||||
"name",
|
||||
class_class_index,
|
||||
&jvm.class_store
|
||||
).unwrap() {
|
||||
FieldValue::Reference(r) => r,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let string_compare_frame = StackFrame::new(
|
||||
string_class_file,
|
||||
string_class_index,
|
||||
string_equals_index as u16,
|
||||
&[StackValue::Reference(float_class_name_ref), StackValue::Reference(passed_wanted_string)],
|
||||
);
|
||||
|
||||
Ok(JVMCallbackOperation::PushFrame(string_compare_frame))
|
||||
}
|
||||
}
|
||||
|
||||
6 => {
|
||||
if wrap_stackframe_error(class, method, frame.operand_stack.pop_int(0))? == 1 {
|
||||
let double_class_ref = jvm.class_store.primitive_classes.double_class;
|
||||
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(double_class_ref)))
|
||||
} else {
|
||||
let double_class_ref = jvm.class_store.primitive_classes.double_class;
|
||||
let double_class_name_ref = match jvm.heap_area.object_area.get_object_field(
|
||||
double_class_ref,
|
||||
"name",
|
||||
class_class_index,
|
||||
&jvm.class_store
|
||||
).unwrap() {
|
||||
FieldValue::Reference(r) => r,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let string_compare_frame = StackFrame::new(
|
||||
string_class_file,
|
||||
string_class_index,
|
||||
string_equals_index as u16,
|
||||
&[StackValue::Reference(double_class_name_ref), StackValue::Reference(passed_wanted_string)],
|
||||
);
|
||||
|
||||
Ok(JVMCallbackOperation::PushFrame(string_compare_frame))
|
||||
}
|
||||
}
|
||||
|
||||
7 => {
|
||||
if wrap_stackframe_error(class, method, frame.operand_stack.pop_int(0))? == 1 {
|
||||
let long_class_ref = jvm.class_store.primitive_classes.long_class;
|
||||
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(long_class_ref)))
|
||||
} else {
|
||||
let long_class_ref = jvm.class_store.primitive_classes.long_class;
|
||||
let long_class_name_ref = match jvm.heap_area.object_area.get_object_field(
|
||||
long_class_ref,
|
||||
"name",
|
||||
class_class_index,
|
||||
&jvm.class_store
|
||||
).unwrap() {
|
||||
FieldValue::Reference(r) => r,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let string_compare_frame = StackFrame::new(
|
||||
string_class_file,
|
||||
string_class_index,
|
||||
string_equals_index as u16,
|
||||
&[StackValue::Reference(long_class_name_ref), StackValue::Reference(passed_wanted_string)],
|
||||
);
|
||||
|
||||
Ok(JVMCallbackOperation::PushFrame(string_compare_frame))
|
||||
}
|
||||
}
|
||||
|
||||
8 => {
|
||||
if wrap_stackframe_error(class, method, frame.operand_stack.pop_int(0))? == 1 {
|
||||
let long_class_ref = jvm.class_store.primitive_classes.long_class;
|
||||
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(long_class_ref)))
|
||||
} else {
|
||||
Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(ObjectReference::NULL)))
|
||||
}
|
||||
}
|
||||
_ => Ok(JVMCallbackOperation::ReturnFrame(StackValue::Reference(ObjectReference::NULL)))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue