ConstantValue initialization
This commit is contained in:
parent
4ee673d5ff
commit
25d3509ccf
4 changed files with 167 additions and 69 deletions
49
src/jvm.rs
49
src/jvm.rs
|
@ -3,14 +3,14 @@ use core::fmt::{Display, Formatter};
|
|||
use std::collections::VecDeque;
|
||||
use std::error::Error as ErrorTrait;
|
||||
|
||||
use crate::accessmasks::{ ClassAccessFlagMask, ClassAccessFlag, MethodAccessFlagMask, MethodAccessFlag};
|
||||
use crate::accessmasks::{ ClassAccessFlagMask, ClassAccessFlag, MethodAccessFlagMask, MethodAccessFlag, FieldAccessFlag };
|
||||
use crate::bytecode::{ Bytecode, Instruction };
|
||||
use crate::classfile;
|
||||
use crate::classfile::{ JavaClassFile, MethodInfo, MethodDescriptor, AbstractTypeDescription, AbstractTypeKind, AttributeInfo, AttributeData, CodeAttributeData };
|
||||
use crate::classfile::{ JavaClassFile, MethodInfo, MethodDescriptor, AbstractTypeDescription, AbstractTypeKind, AttributeInfo, AttributeData, CodeAttributeData, ConstantValueAttributeData };
|
||||
use crate::classstore;
|
||||
use crate::classstore::ClassStore;
|
||||
use crate::constantpool::{ ConstantPoolInfo, ConstantClassInfo, ConstantUtf8Info, ConstantMethodRefInfo, ConstantNameAndTypeInfo};
|
||||
use crate::heap_area::HeapArea;
|
||||
use crate::heap_area::{ HeapArea, FieldValue };
|
||||
use crate::stackframe;
|
||||
use crate::stackframe::{ StackFrame, StackValue, OperandStack };
|
||||
|
||||
|
@ -173,10 +173,49 @@ impl JVM {
|
|||
let class_file = self.class_store.class_file_from_idx(class_idx).unwrap();
|
||||
let clinit_idx = class_file.find_method_index(&"<clinit>".to_string());
|
||||
|
||||
// TODO: Static Stuff
|
||||
self.heap_area.static_area.make(class_file, class_idx);
|
||||
self.heap_area.make_static(class_file, class_idx);
|
||||
|
||||
// TODO: ConstantValue Attributes (final)
|
||||
for field in &class_file.fields {
|
||||
if field.access_flags & FieldAccessFlag::Static {
|
||||
let cvalue_attrs: Vec<&ConstantValueAttributeData> = (&field.attributes).iter()
|
||||
.filter(|a| match a.data { AttributeData::ConstantValue(_) => true, _ => false })
|
||||
.map(|a| match &a.data { AttributeData::ConstantValue(c) => c, _ => unreachable!() })
|
||||
.collect();
|
||||
|
||||
assert!(cvalue_attrs.len() < 2);
|
||||
// TODO: Throw error
|
||||
|
||||
if cvalue_attrs.len() == 1 {
|
||||
let constant_value_info = cvalue_attrs[0];
|
||||
|
||||
assert!(field.descriptor.array_level == 0);
|
||||
// TODO: Throw Error
|
||||
|
||||
let field_value = match field.descriptor.kind {
|
||||
AbstractTypeKind::Boolean() => {
|
||||
let int_entry = class_file.pool_int_entry(constant_value_info.constant_value_index)?;
|
||||
|
||||
FieldValue::Boolean(int_entry.value != 0)
|
||||
},
|
||||
AbstractTypeKind::Int() => {
|
||||
let int_entry = class_file.pool_int_entry(constant_value_info.constant_value_index)?;
|
||||
|
||||
FieldValue::Int(int_entry.value)
|
||||
},
|
||||
AbstractTypeKind::Short() => {
|
||||
let int_entry = class_file.pool_int_entry(constant_value_info.constant_value_index)?;
|
||||
|
||||
FieldValue::Short(int_entry.value as i16)
|
||||
},
|
||||
_ => todo!()
|
||||
};
|
||||
|
||||
self.heap_area.static_area.set(&class_file.get_classname()?, &field.name, field_value)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Push clinit function
|
||||
|
||||
self.class_store.set_init(class_idx, true);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue