| 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();
|
|
|