| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index c6f4c723b4208b5f8eb8aa11df8ecc690e7e95e2..4e546d212ff6dd05885faca79664a779574a7b62 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -1511,7 +1511,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.SetStaticValue(value, true); \
|
| field.set_type(Type::Handle(Type::IntType())); \
|
| cls.AddField(field); \
|
|
|
| @@ -7262,18 +7262,6 @@ RawClass* Field::origin() const {
|
| }
|
|
|
|
|
| -RawInstance* Field::value() const {
|
| - ASSERT(is_static()); // Valid only for static dart fields.
|
| - return raw_ptr()->value_;
|
| -}
|
| -
|
| -
|
| -void Field::set_value(const Instance& value) const {
|
| - ASSERT(is_static()); // Valid only for static dart fields.
|
| - StorePointer(&raw_ptr()->value_, value.raw());
|
| -}
|
| -
|
| -
|
| void Field::set_type(const AbstractType& value) const {
|
| ASSERT(!value.IsNull());
|
| StorePointer(&raw_ptr()->type_, value.raw());
|
| @@ -7300,9 +7288,7 @@ 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 {
|
| + if (!is_static) {
|
| result.SetOffset(0);
|
| }
|
| result.set_is_final(is_final);
|
| @@ -7444,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(StaticValue());
|
| jsobj.AddProperty("staticValue", valueObj);
|
| }
|
|
|
| @@ -7490,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.StaticValue());
|
| ASSERT(!closure.IsNull());
|
| ASSERT(closure.IsClosure());
|
| return closure.raw();
|
| @@ -7523,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.SetStaticValue(Instance::Cast(result), true);
|
| closure_field.set_type(Type::Handle(Type::DynamicType()));
|
| field_owner.AddField(closure_field);
|
|
|
| @@ -7599,33 +7586,43 @@ 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.raw());
|
| +}
|
| +
|
| +
|
| +bool Field::HasPrecompiledInitializer() const {
|
| + return raw_ptr()->initializer_.precompiled_->IsFunction();
|
| +}
|
| +
|
| +
|
| +void Field::SetSavedInitialStaticValue(const Instance& value) const {
|
| + StorePointer(&raw_ptr()->initializer_.saved_value_, value.raw());
|
| }
|
|
|
|
|
| void Field::EvaluateInitializer() const {
|
| ASSERT(is_static());
|
| - if (value() == Object::sentinel().raw()) {
|
| - set_value(Object::transition_sentinel());
|
| + if (StaticValue() == Object::sentinel().raw()) {
|
| + SetStaticValue(Object::transition_sentinel());
|
| Object& value = Object::Handle(Compiler::EvaluateStaticInitializer(*this));
|
| if (value.IsError()) {
|
| - set_value(Object::null_instance());
|
| + SetStaticValue(Object::null_instance());
|
| Exceptions::PropagateError(Error::Cast(value));
|
| UNREACHABLE();
|
| }
|
| ASSERT(value.IsNull() || value.IsInstance());
|
| - set_value(value.IsNull() ? Instance::null_instance()
|
| + SetStaticValue(value.IsNull() ? Instance::null_instance()
|
| : Instance::Cast(value));
|
| return;
|
| - } else if (value() == Object::transition_sentinel().raw()) {
|
| - set_value(Object::null_instance());
|
| + } else if (StaticValue() == Object::transition_sentinel().raw()) {
|
| + SetStaticValue(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);
|
| @@ -9115,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.SetStaticValue(Array::empty_array(), true);
|
| GrowableObjectArray& metadata =
|
| GrowableObjectArray::Handle(this->metadata());
|
| metadata.Add(field, Heap::kOld);
|
| @@ -9209,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.StaticValue();
|
| + if (field.StaticValue() == 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.SetStaticValue(Array::Cast(metadata), true);
|
| }
|
| }
|
| return metadata.raw();
|
| @@ -10624,7 +10621,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.SetStaticValue(Array::empty_array(), true);
|
| set_metadata_field(field);
|
| owner_class.AddField(field);
|
| }
|
| @@ -10637,13 +10634,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.StaticValue();
|
| + if (field.StaticValue() == 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.SetStaticValue(Array::Cast(metadata), true);
|
| }
|
| }
|
| return metadata.raw();
|
|
|