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;