Implemented more opcodes and unsafe stuff

This commit is contained in:
vegowotenks 2024-11-07 10:35:02 +01:00
parent dfb6060df9
commit d38d5b2897
5 changed files with 340 additions and 84 deletions

View file

@ -280,12 +280,15 @@ impl ObjectArea {
}
}
fn get_reference_class_ref(&self, reference: ObjectReference, class_store: &ClassStore) -> ObjectReference {
pub fn get_reference_class_ref(&self, reference: ObjectReference, class_store: &ClassStore) -> ObjectReference {
match self.get_entry(reference) {
CompartmentEntry::Object(o) => class_store.get_class_objectref_from_index(o.class_index),
CompartmentEntry::ReferenceArray(a) => a.class_ref,
CompartmentEntry::ByteArray(a) => a.class_ref,
_ => unreachable!(),
CompartmentEntry::CharArray(a) => a.class_ref,
CompartmentEntry::IntArray(a) => a.class_ref,
CompartmentEntry::EmptyNext(_) => unreachable!(),
CompartmentEntry::EmptyTail() => unreachable!(),
}
}
@ -326,6 +329,18 @@ impl ObjectArea {
return object;
}
pub fn is_array_reference(&mut self, reference: ObjectReference) -> bool {
match self.get_entry(reference) {
CompartmentEntry::Object(_) => false,
CompartmentEntry::ReferenceArray(_) => true,
CompartmentEntry::ByteArray(_) => true,
CompartmentEntry::CharArray(_) => true,
CompartmentEntry::IntArray(_) => true,
CompartmentEntry::EmptyNext(_) => true,
CompartmentEntry::EmptyTail() => true,
}
}
pub fn get_array_length(&self, reference: ObjectReference) -> usize {
// TODO: Throw errors
match self.get_entry(reference) {
@ -734,14 +749,14 @@ impl FieldValue {
}
}
fn expect_reference(&self) -> ObjectReference {
pub fn expect_reference(&self) -> ObjectReference {
match self {
Self::Reference(r) => *r,
_ => unreachable!()
}
}
fn expect_byte(&self) -> i8 {
pub fn expect_byte(&self) -> i8 {
match self {
Self::Byte(b) => *b,
_ => unreachable!()