Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index 1d6e33b59437726ee85bbe006a150a9e8e1a86f6..0bd171a42e00f948f5a3ed563af5d4d687aae2ee 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -1510,7 +1510,7 @@ RawError* Object::Init(Isolate* isolate) { |
field_name = Symbols::New("cid"#clazz); \ |
field = Field::New(field_name, true, false, true, false, cls, 0); \ |
value = Smi::New(k##clazz##Cid); \ |
- field.set_value(value); \ |
+ field.SetStaticFieldValue(value, true); \ |
field.set_type(Type::Handle(Type::IntType())); \ |
cls.AddField(field); \ |
@@ -2034,7 +2034,7 @@ RawArray* Class::OffsetToFieldMap() const { |
for (intptr_t i = 0; i < fields.Length(); ++i) { |
f ^= fields.At(i); |
if (!f.is_static()) { |
- array.SetAt(f.Offset() >> kWordSizeLog2, f); |
+ array.SetAt(f.InstanceFieldOffset() >> kWordSizeLog2, f); |
} |
} |
cls = cls.SuperClass(); |
@@ -2584,8 +2584,8 @@ void Class::CalculateFieldOffsets() const { |
field ^= flds.At(i); |
// Offset is computed only for instance fields. |
if (!field.is_static()) { |
- ASSERT(field.Offset() == 0); |
- field.SetOffset(offset); |
+ ASSERT(field.InstanceFieldOffset() == 0); |
+ field.SetInstanceFieldOffset(offset); |
offset += kWordSize; |
} |
} |
@@ -7246,15 +7246,19 @@ RawClass* Field::origin() const { |
} |
-RawInstance* Field::value() const { |
+RawInstance* Field::StaticFieldValue() const { |
ASSERT(is_static()); // Valid only for static dart fields. |
- return raw_ptr()->value_; |
+ return raw_ptr()->value_.static_value_; |
} |
-void Field::set_value(const Instance& value) const { |
+void Field::SetStaticFieldValue(const Instance& value, |
+ bool save_initial_value) const { |
ASSERT(is_static()); // Valid only for static dart fields. |
- StorePointer(&raw_ptr()->value_, value.raw()); |
+ StorePointer(&raw_ptr()->value_.static_value_, value.raw()); |
+ if (save_initial_value) { |
+ StorePointer(&raw_ptr()->initializer_.saved_initial_value_, value.raw()); |
+ } |
} |
@@ -7284,10 +7288,8 @@ RawField* Field::New(const String& name, |
const Field& result = Field::Handle(Field::New()); |
result.set_name(name); |
result.set_is_static(is_static); |
- if (is_static) { |
- result.set_value(Object::null_instance()); |
- } else { |
- result.SetOffset(0); |
+ if (!is_static) { |
+ result.SetInstanceFieldOffset(0); |
} |
result.set_is_final(is_final); |
result.set_is_const(is_const); |
@@ -7319,7 +7321,7 @@ RawField* Field::Clone(const Class& new_owner) const { |
PatchClass::Handle(PatchClass::New(new_owner, owner)); |
clone.set_owner(clone_owner); |
if (!clone.is_static()) { |
- clone.SetOffset(0); |
+ clone.SetInstanceFieldOffset(0); |
} |
if (new_owner.NumTypeParameters() > 0) { |
// Adjust the field type to refer to type parameters of the new owner. |
@@ -7428,7 +7430,7 @@ void Field::PrintJSONImpl(JSONStream* stream, bool ref) const { |
return; |
} |
if (is_static()) { |
- const Instance& valueObj = Instance::Handle(value()); |
+ const Instance& valueObj = Instance::Handle(StaticFieldValue()); |
jsobj.AddProperty("staticValue", valueObj); |
} |
@@ -7474,7 +7476,8 @@ RawInstance* Field::AccessorClosure(bool make_setter) const { |
closure_field = field_owner.LookupStaticField(closure_name); |
if (!closure_field.IsNull()) { |
ASSERT(closure_field.is_static()); |
- const Instance& closure = Instance::Handle(closure_field.value()); |
+ const Instance& closure = |
+ Instance::Handle(closure_field.StaticFieldValue()); |
ASSERT(!closure.IsNull()); |
ASSERT(closure.IsClosure()); |
return closure.raw(); |
@@ -7507,7 +7510,7 @@ RawInstance* Field::AccessorClosure(bool make_setter) const { |
false, // is_reflectable |
field_owner, |
this->token_pos()); |
- closure_field.set_value(Instance::Cast(result)); |
+ closure_field.SetStaticFieldValue(Instance::Cast(result), true); |
closure_field.set_type(Type::Handle(Type::DynamicType())); |
field_owner.AddField(closure_field); |
@@ -7583,33 +7586,44 @@ void Field::DeoptimizeDependentCode() const { |
bool Field::IsUninitialized() const { |
- const Instance& value = Instance::Handle(raw_ptr()->value_); |
+ const Instance& value = Instance::Handle(raw_ptr()->value_.static_value_); |
ASSERT(value.raw() != Object::transition_sentinel().raw()); |
return value.raw() == Object::sentinel().raw(); |
} |
-void Field::set_initializer(const Function& initializer) const { |
- StorePointer(&raw_ptr()->initializer_, initializer.raw()); |
+void Field::SetPrecompiledInitializer(const Function& initializer) const { |
+ StorePointer(&raw_ptr()->initializer_.precompiled_initializer_, |
+ initializer.raw()); |
+} |
+ |
+ |
+bool Field::HasPrecompiledInitializer() const { |
+ return raw_ptr()->initializer_.value_->IsFunction(); |
+} |
+ |
+ |
+void Field::SetSavedInitialStaticValue(const Instance& value) const { |
+ StorePointer(&raw_ptr()->initializer_.saved_initial_value_, value.raw()); |
} |
void Field::EvaluateInitializer() const { |
ASSERT(is_static()); |
- if (value() == Object::sentinel().raw()) { |
- set_value(Object::transition_sentinel()); |
+ if (StaticFieldValue() == Object::sentinel().raw()) { |
+ SetStaticFieldValue(Object::transition_sentinel()); |
Object& value = Object::Handle(Compiler::EvaluateStaticInitializer(*this)); |
if (value.IsError()) { |
- set_value(Object::null_instance()); |
+ SetStaticFieldValue(Object::null_instance()); |
Exceptions::PropagateError(Error::Cast(value)); |
UNREACHABLE(); |
} |
ASSERT(value.IsNull() || value.IsInstance()); |
- set_value(value.IsNull() ? Instance::null_instance() |
+ SetStaticFieldValue(value.IsNull() ? Instance::null_instance() |
: Instance::Cast(value)); |
return; |
- } else if (value() == Object::transition_sentinel().raw()) { |
- set_value(Object::null_instance()); |
+ } else if (StaticFieldValue() == Object::transition_sentinel().raw()) { |
+ SetStaticFieldValue(Object::null_instance()); |
const Array& ctor_args = Array::Handle(Array::New(1)); |
const String& field_name = String::Handle(name()); |
ctor_args.SetAt(0, field_name); |
@@ -9098,7 +9112,7 @@ void Library::AddMetadata(const Class& cls, |
cls, |
token_pos)); |
field.set_type(Type::Handle(Type::DynamicType())); |
- field.set_value(Array::empty_array()); |
+ field.SetStaticFieldValue(Array::empty_array(), true); |
GrowableObjectArray& metadata = |
GrowableObjectArray::Handle(this->metadata()); |
metadata.Add(field, Heap::kOld); |
@@ -9192,13 +9206,13 @@ RawObject* Library::GetMetadata(const Object& obj) const { |
return Object::empty_array().raw(); |
} |
Object& metadata = Object::Handle(); |
- metadata = field.value(); |
- if (field.value() == Object::empty_array().raw()) { |
+ metadata = field.StaticFieldValue(); |
+ if (field.StaticFieldValue() == Object::empty_array().raw()) { |
metadata = Parser::ParseMetadata(Class::Handle(field.owner()), |
field.token_pos()); |
if (metadata.IsArray()) { |
ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); |
- field.set_value(Array::Cast(metadata)); |
+ field.SetStaticFieldValue(Array::Cast(metadata), true); |
} |
} |
return metadata.raw(); |
@@ -10606,7 +10620,7 @@ void Namespace::AddMetadata(intptr_t token_pos, const Class& owner_class) { |
owner_class, |
token_pos)); |
field.set_type(Type::Handle(Type::DynamicType())); |
- field.set_value(Array::empty_array()); |
+ field.SetStaticFieldValue(Array::empty_array(), true); |
set_metadata_field(field); |
owner_class.AddField(field); |
} |
@@ -10619,13 +10633,13 @@ RawObject* Namespace::GetMetadata() const { |
return Object::empty_array().raw(); |
} |
Object& metadata = Object::Handle(); |
- metadata = field.value(); |
- if (field.value() == Object::empty_array().raw()) { |
+ metadata = field.StaticFieldValue(); |
+ if (field.StaticFieldValue() == Object::empty_array().raw()) { |
metadata = Parser::ParseMetadata(Class::Handle(field.owner()), |
field.token_pos()); |
if (metadata.IsArray()) { |
ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); |
- field.set_value(Array::Cast(metadata)); |
+ field.SetStaticFieldValue(Array::Cast(metadata), true); |
} |
} |
return metadata.raw(); |