More bytecode ops

This commit is contained in:
vegowotenks 2024-09-06 21:11:03 +02:00
parent 9243c0b291
commit 5bc0d813e5
7 changed files with 395 additions and 120 deletions

View file

@ -200,15 +200,15 @@ impl ObjectArea {
return class_store.get_native_class_name(native_name_index as usize);
}
fn get_object_class_index(&self, reference: ObjectReference) -> usize {
match self.get_object(reference) {
pub fn get_object_class_index(&self, reference: ObjectReference) -> usize {
match self.get_entry(reference) {
CompartmentEntry::Object(o) => o.class_index,
_ => unreachable!(),
}
}
fn get_reference_class_ref(&self, reference: ObjectReference, class_store: &ClassStore) -> ObjectReference {
match self.get_object(reference) {
match self.get_entry(reference) {
CompartmentEntry::Object(o) => class_store.get_class_objectref_from_index(o.class_index),
CompartmentEntry::Array(a) => a.class_ref,
_ => unreachable!(),
@ -230,7 +230,7 @@ impl ObjectArea {
return ObjectReference(object_index + (DEFAULT_COMPARTMENT_CAPACITY * (compartment_index as u32 + 1)));
}
fn get_object(&self, reference: ObjectReference) -> &CompartmentEntry {
fn get_entry(&self, reference: ObjectReference) -> &CompartmentEntry {
let index = reference.0;
let compartment_index: u32 = (index / DEFAULT_COMPARTMENT_CAPACITY) - 1;
let object_index: u32 = index % DEFAULT_COMPARTMENT_CAPACITY;
@ -241,7 +241,7 @@ impl ObjectArea {
return object;
}
fn get_object_mut(&mut self, reference: ObjectReference) -> &mut CompartmentEntry {
fn get_entry_mut(&mut self, reference: ObjectReference) -> &mut CompartmentEntry {
let index = reference.0;
let compartment_index: u32 = (index / DEFAULT_COMPARTMENT_CAPACITY) - 1;
let object_index: u32 = index % DEFAULT_COMPARTMENT_CAPACITY;
@ -252,9 +252,29 @@ impl ObjectArea {
return object;
}
pub fn get_array_length(&self, reference: ObjectReference) -> usize {
// TODO: Throw errors
let array = match self.get_entry(reference) {
CompartmentEntry::Array(a) => a,
_ => unreachable!(),
};
array.content.len()
}
pub fn get_array_element(&self, array_ref: ObjectReference, element_index: i32) -> ObjectReference {
// TODO: Throw errors
let array = match self.get_entry(array_ref) {
CompartmentEntry::Array(a) => a,
_ => unreachable!(),
};
array.content[element_index as usize]
}
pub fn get_object_field(&self, reference: ObjectReference, field_name: &str, accessing_class_idx: usize, class_store: &ClassStore) -> Result<FieldValue, Error> {
// TODO: Check access rights
let object = match self.get_object(reference) {
let object = match self.get_entry(reference) {
CompartmentEntry::Object(o) => o,
_ => unreachable!(),
};
@ -282,7 +302,7 @@ impl ObjectArea {
}
pub fn set_array_element(&mut self, array_reference: ObjectReference, index: usize, element: ObjectReference) {
let array = match self.get_object_mut(array_reference) {
let array = match self.get_entry_mut(array_reference) {
CompartmentEntry::Array(a) => a,
_ => unreachable!(),
};
@ -294,7 +314,7 @@ impl ObjectArea {
pub fn set_object_field(&mut self, reference: ObjectReference, field_name: &str, value: FieldValue, accessing_class_idx: usize, class_store: &ClassStore) -> Result<(), Error> {
// TODO: Check access rights
let object = match self.get_object_mut(reference) {
let object = match self.get_entry_mut(reference) {
CompartmentEntry::Object(o) => o,
_ => unreachable!(),
};
@ -425,6 +445,26 @@ pub struct StaticArea {
impl StaticArea {
pub fn get(&self, class_name: &String, field_name: &String, expected_field_descriptor: AbstractTypeDescription) -> Result<FieldValue, Error> {
// TODO: Access permission checking
let static_object = match self.static_objects.get(class_name) {
Some(o) => o,
None => return Err(Error::RunTimeError(format!("Trying to get '{}.{}' but there is no such static object.", class_name, field_name))),
};
let field_index = match static_object.field_index_from_name(&field_name) {
Some(i) => i,
None => return Err(Error::RunTimeError(format!("Trying to get '{}.{}' but there is no such static field on this object.", class_name, field_name))),
};
let field_descriptor = &static_object.fields[field_index].descriptor;
if expected_field_descriptor != *field_descriptor {
return Err(Error::RunTimeError(format!("Descriptor Mismatch: Trying to get a {expected_field_descriptor:?} from '{class_name}.{field_name} but the field is of type '{field_descriptor:?}'.")));
}
Ok(static_object.fields[field_index].value)
}
pub fn set(&mut self, class_name: &String, field_name: &String, field_value: FieldValue) -> Result<(), Error> {
// TODO: Access permission checking
let static_object = match self.static_objects.get_mut(class_name) {