Store static field values in arrays.
Each static field is stored in one of three arrays:
- references are stored in static_references_
- 64 bit primitives are stored in static_64bit_primitives_
- everything else is in static_32bit_primitives_
Change-Id: I1c0e182582f776c62edbd9bd97ffd4fd7e516c99
diff --git a/src/object.cc b/src/object.cc
index 514eef5..409ff61 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -153,6 +153,107 @@
return IsInSamePackage(klass1->descriptor_, klass2->descriptor_);
}
+bool StaticField::GetBoolean() {
+ CHECK_EQ(GetType(), 'Z');
+ return declaring_class_->static_32bit_primitives_->Get(java_slot_);
+}
+
+void StaticField::SetBoolean(bool z) {
+ CHECK_EQ(GetType(), 'Z');
+ declaring_class_->static_32bit_primitives_->Set(java_slot_, z);
+}
+
+int8_t StaticField::GetByte() {
+ CHECK_EQ(GetType(), 'B');
+ return declaring_class_->static_32bit_primitives_->Get(java_slot_);
+}
+
+void StaticField::SetByte(int8_t b) {
+ CHECK_EQ(GetType(), 'B');
+ declaring_class_->static_32bit_primitives_->Set(java_slot_, b);
+}
+
+uint16_t StaticField::GetChar() {
+ CHECK_EQ(GetType(), 'C');
+ return declaring_class_->static_32bit_primitives_->Get(java_slot_);
+}
+
+void StaticField::SetChar(uint16_t c) {
+ CHECK_EQ(GetType(), 'C');
+ declaring_class_->static_32bit_primitives_->Set(java_slot_, c);
+}
+
+uint16_t StaticField::GetShort() {
+ CHECK_EQ(GetType(), 'S');
+ return declaring_class_->static_32bit_primitives_->Get(java_slot_);
+}
+
+void StaticField::SetShort(uint16_t s) {
+ CHECK_EQ(GetType(), 'S');
+ declaring_class_->static_32bit_primitives_->Set(java_slot_, s);
+}
+
+int32_t StaticField::GetInt() {
+ CHECK_EQ(GetType(), 'I');
+ return declaring_class_->static_32bit_primitives_->Get(java_slot_);
+}
+
+void StaticField::SetInt(int32_t i) {
+ CHECK_EQ(GetType(), 'I');
+ declaring_class_->static_32bit_primitives_->Set(java_slot_, i);
+}
+
+int64_t StaticField::GetLong() {
+ CHECK_EQ(GetType(), 'J');
+ return declaring_class_->static_64bit_primitives_->Get(java_slot_);
+}
+
+void StaticField::SetLong(int64_t j) {
+ CHECK_EQ(GetType(), 'J');
+ declaring_class_->static_64bit_primitives_->Set(java_slot_, j);
+}
+
+float StaticField::GetFloat() {
+ CHECK_EQ(GetType(), 'F');
+ JValue float_bits;
+ float_bits.i = declaring_class_->static_32bit_primitives_->Get(java_slot_);
+ return float_bits.f;
+}
+
+void StaticField::SetFloat(float f) {
+ CHECK_EQ(GetType(), 'F');
+ JValue float_bits;
+ float_bits.f = f;
+ declaring_class_->static_32bit_primitives_->Set(java_slot_, float_bits.i);
+}
+
+double StaticField::GetDouble() {
+ CHECK_EQ(GetType(), 'D');
+ JValue double_bits;
+ double_bits.j = declaring_class_->static_64bit_primitives_->Get(java_slot_);
+ return double_bits.d;
+}
+
+void StaticField::SetDouble(double d) {
+ CHECK_EQ(GetType(), 'D');
+ JValue double_bits;
+ double_bits.d = d;
+ declaring_class_->static_64bit_primitives_->Set(java_slot_, double_bits.j);
+}
+
+Object* StaticField::GetObject() {
+ return declaring_class_->static_references_->Get(java_slot_);
+}
+
+const Object* StaticField::GetObject() const {
+ return declaring_class_->static_references_->Get(java_slot_);
+}
+
+void StaticField::SetObject(Object* l) {
+ CHECK(GetType() == 'L' || GetType() == '[');
+ declaring_class_->static_references_->Set(java_slot_, l); // TODO: write barrier
+}
+
uint32_t Method::NumArgRegisters() {
CHECK(shorty_ != NULL);
uint32_t num_registers = 0;