More bytecode ops
This commit is contained in:
parent
9243c0b291
commit
5bc0d813e5
7 changed files with 395 additions and 120 deletions
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue