OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 2999 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3010 | 3010 |
3011 | 3011 |
3012 void Class::SetFields(const Array& value) const { | 3012 void Class::SetFields(const Array& value) const { |
3013 ASSERT(!value.IsNull()); | 3013 ASSERT(!value.IsNull()); |
3014 #if defined(DEBUG) | 3014 #if defined(DEBUG) |
3015 // Verify that all the fields in the array have this class as owner. | 3015 // Verify that all the fields in the array have this class as owner. |
3016 Field& field = Field::Handle(); | 3016 Field& field = Field::Handle(); |
3017 intptr_t len = value.Length(); | 3017 intptr_t len = value.Length(); |
3018 for (intptr_t i = 0; i < len; i++) { | 3018 for (intptr_t i = 0; i < len; i++) { |
3019 field ^= value.At(i); | 3019 field ^= value.At(i); |
3020 ASSERT(field.owner() == raw()); | 3020 ASSERT(field.IsOriginal()); |
| 3021 ASSERT(field.Owner() == raw()); |
3021 } | 3022 } |
3022 #endif | 3023 #endif |
3023 // The value of static fields is already initialized to null. | 3024 // The value of static fields is already initialized to null. |
3024 StorePointer(&raw_ptr()->fields_, value.raw()); | 3025 StorePointer(&raw_ptr()->fields_, value.raw()); |
3025 } | 3026 } |
3026 | 3027 |
3027 | 3028 |
3028 void Class::AddField(const Field& field) const { | 3029 void Class::AddField(const Field& field) const { |
3029 const Array& arr = Array::Handle(fields()); | 3030 const Array& arr = Array::Handle(fields()); |
3030 const Array& new_arr = Array::Handle(Array::Grow(arr, arr.Length() + 1)); | 3031 const Array& new_arr = Array::Handle(Array::Grow(arr, arr.Length() + 1)); |
(...skipping 3748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6779 } | 6780 } |
6780 } | 6781 } |
6781 array.SetAt(0, edge_counters_array); | 6782 array.SetAt(0, edge_counters_array); |
6782 set_ic_data_array(array); | 6783 set_ic_data_array(array); |
6783 } | 6784 } |
6784 | 6785 |
6785 | 6786 |
6786 void Function::RestoreICDataMap( | 6787 void Function::RestoreICDataMap( |
6787 ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data, | 6788 ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data, |
6788 bool clone_ic_data) const { | 6789 bool clone_ic_data) const { |
| 6790 if (FLAG_force_clone_compiler_objects) { |
| 6791 clone_ic_data = true; |
| 6792 } |
6789 ASSERT(deopt_id_to_ic_data->is_empty()); | 6793 ASSERT(deopt_id_to_ic_data->is_empty()); |
6790 Zone* zone = Thread::Current()->zone(); | 6794 Zone* zone = Thread::Current()->zone(); |
6791 const Array& saved_ic_data = Array::Handle(zone, ic_data_array()); | 6795 const Array& saved_ic_data = Array::Handle(zone, ic_data_array()); |
6792 if (saved_ic_data.IsNull()) { | 6796 if (saved_ic_data.IsNull()) { |
6793 // Could happen with deferred loading. | 6797 // Could happen with deferred loading. |
6794 return; | 6798 return; |
6795 } | 6799 } |
6796 const intptr_t saved_length = saved_ic_data.Length(); | 6800 const intptr_t saved_length = saved_ic_data.Length(); |
6797 ASSERT(saved_length > 0); | 6801 ASSERT(saved_length > 0); |
6798 if (saved_length > 1) { | 6802 if (saved_length > 1) { |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6975 Heap::kOld); | 6979 Heap::kOld); |
6976 return reinterpret_cast<RawRedirectionData*>(raw); | 6980 return reinterpret_cast<RawRedirectionData*>(raw); |
6977 } | 6981 } |
6978 | 6982 |
6979 | 6983 |
6980 const char* RedirectionData::ToCString() const { | 6984 const char* RedirectionData::ToCString() const { |
6981 return "RedirectionData class"; | 6985 return "RedirectionData class"; |
6982 } | 6986 } |
6983 | 6987 |
6984 | 6988 |
| 6989 RawField* Field::CloneFromOriginal() const { |
| 6990 return this->Clone(*this); |
| 6991 } |
| 6992 |
| 6993 |
| 6994 RawField* Field::Original() const { |
| 6995 if (IsNull()) { |
| 6996 return Field::null(); |
| 6997 } |
| 6998 Object& obj = Object::Handle(raw_ptr()->owner_); |
| 6999 if (obj.IsField()) { |
| 7000 return Field::RawCast(obj.raw()); |
| 7001 } else { |
| 7002 return this->raw(); |
| 7003 } |
| 7004 } |
| 7005 |
| 7006 |
| 7007 void Field::SetOriginal(const Field& value) const { |
| 7008 ASSERT(value.IsOriginal()); |
| 7009 ASSERT(!value.IsNull()); |
| 7010 StorePointer(&raw_ptr()->owner_, reinterpret_cast<RawObject*>(value.raw())); |
| 7011 } |
| 7012 |
| 7013 |
6985 RawString* Field::GetterName(const String& field_name) { | 7014 RawString* Field::GetterName(const String& field_name) { |
6986 return String::Concat(Symbols::GetterPrefix(), field_name); | 7015 return String::Concat(Symbols::GetterPrefix(), field_name); |
6987 } | 7016 } |
6988 | 7017 |
6989 | 7018 |
6990 RawString* Field::GetterSymbol(const String& field_name) { | 7019 RawString* Field::GetterSymbol(const String& field_name) { |
6991 return Symbols::FromConcat(Symbols::GetterPrefix(), field_name); | 7020 return Symbols::FromConcat(Symbols::GetterPrefix(), field_name); |
6992 } | 7021 } |
6993 | 7022 |
6994 | 7023 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7029 } | 7058 } |
7030 | 7059 |
7031 | 7060 |
7032 bool Field::IsSetterName(const String& function_name) { | 7061 bool Field::IsSetterName(const String& function_name) { |
7033 return function_name.StartsWith(Symbols::SetterPrefix()); | 7062 return function_name.StartsWith(Symbols::SetterPrefix()); |
7034 } | 7063 } |
7035 | 7064 |
7036 | 7065 |
7037 void Field::set_name(const String& value) const { | 7066 void Field::set_name(const String& value) const { |
7038 ASSERT(value.IsSymbol()); | 7067 ASSERT(value.IsSymbol()); |
| 7068 ASSERT(IsOriginal()); |
7039 StorePointer(&raw_ptr()->name_, value.raw()); | 7069 StorePointer(&raw_ptr()->name_, value.raw()); |
7040 } | 7070 } |
7041 | 7071 |
7042 | 7072 |
7043 RawClass* Field::owner() const { | 7073 RawObject* Field::RawOwner() const { |
7044 const Object& obj = Object::Handle(raw_ptr()->owner_); | 7074 if (Original()) { |
| 7075 return raw_ptr()->owner_; |
| 7076 } else { |
| 7077 const Field& field = Field::Handle(Original()); |
| 7078 ASSERT(field.IsOriginal()); |
| 7079 ASSERT(!Object::Handle(field.raw_ptr()->owner_).IsField()); |
| 7080 return field.raw_ptr()->owner_; |
| 7081 } |
| 7082 } |
| 7083 |
| 7084 |
| 7085 RawClass* Field::Owner() const { |
| 7086 const Field& field = Field::Handle(Original()); |
| 7087 ASSERT(field.IsOriginal()); |
| 7088 const Object& obj = Object::Handle(field.raw_ptr()->owner_); |
7045 if (obj.IsClass()) { | 7089 if (obj.IsClass()) { |
7046 return Class::Cast(obj).raw(); | 7090 return Class::Cast(obj).raw(); |
7047 } | 7091 } |
7048 ASSERT(obj.IsPatchClass()); | 7092 ASSERT(obj.IsPatchClass()); |
7049 return PatchClass::Cast(obj).patched_class(); | 7093 return PatchClass::Cast(obj).patched_class(); |
7050 } | 7094 } |
7051 | 7095 |
7052 | 7096 |
7053 RawClass* Field::origin() const { | 7097 RawClass* Field::Origin() const { |
7054 const Object& obj = Object::Handle(raw_ptr()->owner_); | 7098 const Field& field = Field::Handle(Original()); |
| 7099 ASSERT(field.IsOriginal()); |
| 7100 const Object& obj = Object::Handle(field.raw_ptr()->owner_); |
7055 if (obj.IsClass()) { | 7101 if (obj.IsClass()) { |
7056 return Class::Cast(obj).raw(); | 7102 return Class::Cast(obj).raw(); |
7057 } | 7103 } |
7058 ASSERT(obj.IsPatchClass()); | 7104 ASSERT(obj.IsPatchClass()); |
7059 return PatchClass::Cast(obj).origin_class(); | 7105 return PatchClass::Cast(obj).origin_class(); |
7060 } | 7106 } |
7061 | 7107 |
7062 | 7108 |
7063 RawScript* Field::script() const { | 7109 RawScript* Field::Script() const { |
7064 const Object& obj = Object::Handle(raw_ptr()->owner_); | 7110 const Field& field = Field::Handle(Original()); |
| 7111 ASSERT(field.IsOriginal()); |
| 7112 const Object& obj = Object::Handle(field.raw_ptr()->owner_); |
7065 if (obj.IsClass()) { | 7113 if (obj.IsClass()) { |
7066 return Class::Cast(obj).script(); | 7114 return Class::Cast(obj).script(); |
7067 } | 7115 } |
7068 ASSERT(obj.IsPatchClass()); | 7116 ASSERT(obj.IsPatchClass()); |
7069 return PatchClass::Cast(obj).script(); | 7117 return PatchClass::Cast(obj).script(); |
7070 } | 7118 } |
7071 | 7119 |
7072 | 7120 |
7073 // Called at finalization time | 7121 // Called at finalization time |
7074 void Field::SetFieldType(const AbstractType& value) const { | 7122 void Field::SetFieldType(const AbstractType& value) const { |
7075 ASSERT(Thread::Current()->IsMutatorThread()); | 7123 ASSERT(Thread::Current()->IsMutatorThread()); |
| 7124 ASSERT(IsOriginal()); |
7076 ASSERT(!value.IsNull()); | 7125 ASSERT(!value.IsNull()); |
7077 if (value.raw() != type()) { | 7126 if (value.raw() != type()) { |
7078 StorePointer(&raw_ptr()->type_, value.raw()); | 7127 StorePointer(&raw_ptr()->type_, value.raw()); |
7079 } | 7128 } |
7080 } | 7129 } |
7081 | 7130 |
7082 | 7131 |
7083 RawField* Field::New() { | 7132 RawField* Field::New() { |
7084 ASSERT(Object::field_class() != Class::null()); | 7133 ASSERT(Object::field_class() != Class::null()); |
7085 RawObject* raw = Object::Allocate(Field::kClassId, | 7134 RawObject* raw = Object::Allocate(Field::kClassId, |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7152 } else { | 7201 } else { |
7153 result.set_guarded_list_length(Field::kNoFixedLength); | 7202 result.set_guarded_list_length(Field::kNoFixedLength); |
7154 } | 7203 } |
7155 return result.raw(); | 7204 return result.raw(); |
7156 } | 7205 } |
7157 | 7206 |
7158 | 7207 |
7159 RawField* Field::Clone(const Class& new_owner) const { | 7208 RawField* Field::Clone(const Class& new_owner) const { |
7160 Field& clone = Field::Handle(); | 7209 Field& clone = Field::Handle(); |
7161 clone ^= Object::Clone(*this, Heap::kOld); | 7210 clone ^= Object::Clone(*this, Heap::kOld); |
7162 const Class& owner = Class::Handle(this->owner()); | 7211 const Class& owner = Class::Handle(this->Owner()); |
7163 const PatchClass& clone_owner = | 7212 const PatchClass& clone_owner = |
7164 PatchClass::Handle(PatchClass::New(new_owner, owner)); | 7213 PatchClass::Handle(PatchClass::New(new_owner, owner)); |
7165 clone.set_owner(clone_owner); | 7214 clone.set_owner(clone_owner); |
7166 if (!clone.is_static()) { | 7215 if (!clone.is_static()) { |
7167 clone.SetOffset(0); | 7216 clone.SetOffset(0); |
7168 } | 7217 } |
7169 if (new_owner.NumTypeParameters() > 0) { | 7218 if (new_owner.NumTypeParameters() > 0) { |
7170 // Adjust the field type to refer to type parameters of the new owner. | 7219 // Adjust the field type to refer to type parameters of the new owner. |
7171 AbstractType& type = AbstractType::Handle(clone.type()); | 7220 AbstractType& type = AbstractType::Handle(clone.type()); |
7172 type ^= type.CloneUninstantiated(new_owner); | 7221 type ^= type.CloneUninstantiated(new_owner); |
7173 clone.SetFieldType(type); | 7222 clone.SetFieldType(type); |
7174 } | 7223 } |
7175 return clone.raw(); | 7224 return clone.raw(); |
7176 } | 7225 } |
7177 | 7226 |
7178 | 7227 |
| 7228 RawField* Field::Clone(const Field& original) const { |
| 7229 if (original.IsNull()) { |
| 7230 return Field::null(); |
| 7231 } |
| 7232 ASSERT(original.IsOriginal()); |
| 7233 Field& clone = Field::Handle(); |
| 7234 clone ^= Object::Clone(*this, Heap::kOld); |
| 7235 clone.SetOriginal(original); |
| 7236 return clone.raw(); |
| 7237 } |
| 7238 |
| 7239 |
7179 RawString* Field::UserVisibleName() const { | 7240 RawString* Field::UserVisibleName() const { |
7180 if (FLAG_show_internal_names) { | 7241 if (FLAG_show_internal_names) { |
7181 return name(); | 7242 return name(); |
7182 } | 7243 } |
7183 return String::ScrubName(String::Handle(name())); | 7244 return String::ScrubName(String::Handle(name())); |
7184 } | 7245 } |
7185 | 7246 |
7186 | 7247 |
7187 intptr_t Field::guarded_list_length() const { | 7248 intptr_t Field::guarded_list_length() const { |
7188 return Smi::Value(raw_ptr()->guarded_list_length_); | 7249 return Smi::Value(raw_ptr()->guarded_list_length_); |
7189 } | 7250 } |
7190 | 7251 |
7191 | 7252 |
7192 void Field::set_guarded_list_length(intptr_t list_length) const { | 7253 void Field::set_guarded_list_length(intptr_t list_length) const { |
7193 ASSERT(Thread::Current()->IsMutatorThread()); | 7254 ASSERT(Thread::Current()->IsMutatorThread()); |
| 7255 ASSERT(IsOriginal()); |
7194 StoreSmi(&raw_ptr()->guarded_list_length_, Smi::New(list_length)); | 7256 StoreSmi(&raw_ptr()->guarded_list_length_, Smi::New(list_length)); |
7195 } | 7257 } |
7196 | 7258 |
7197 | 7259 |
7198 intptr_t Field::guarded_list_length_in_object_offset() const { | 7260 intptr_t Field::guarded_list_length_in_object_offset() const { |
7199 return raw_ptr()->guarded_list_length_in_object_offset_ + kHeapObjectTag; | 7261 return raw_ptr()->guarded_list_length_in_object_offset_ + kHeapObjectTag; |
7200 } | 7262 } |
7201 | 7263 |
7202 | 7264 |
7203 void Field::set_guarded_list_length_in_object_offset( | 7265 void Field::set_guarded_list_length_in_object_offset( |
7204 intptr_t list_length_offset) const { | 7266 intptr_t list_length_offset) const { |
7205 ASSERT(Thread::Current()->IsMutatorThread()); | 7267 ASSERT(Thread::Current()->IsMutatorThread()); |
| 7268 ASSERT(IsOriginal()); |
7206 StoreNonPointer(&raw_ptr()->guarded_list_length_in_object_offset_, | 7269 StoreNonPointer(&raw_ptr()->guarded_list_length_in_object_offset_, |
7207 static_cast<int8_t>(list_length_offset - kHeapObjectTag)); | 7270 static_cast<int8_t>(list_length_offset - kHeapObjectTag)); |
7208 ASSERT(guarded_list_length_in_object_offset() == list_length_offset); | 7271 ASSERT(guarded_list_length_in_object_offset() == list_length_offset); |
7209 } | 7272 } |
7210 | 7273 |
7211 | 7274 |
7212 const char* Field::ToCString() const { | 7275 const char* Field::ToCString() const { |
7213 if (IsNull()) { | 7276 if (IsNull()) { |
7214 return "Field::null"; | 7277 return "Field::null"; |
7215 } | 7278 } |
7216 const char* kF0 = is_static() ? " static" : ""; | 7279 const char* kF0 = is_static() ? " static" : ""; |
7217 const char* kF1 = is_final() ? " final" : ""; | 7280 const char* kF1 = is_final() ? " final" : ""; |
7218 const char* kF2 = is_const() ? " const" : ""; | 7281 const char* kF2 = is_const() ? " const" : ""; |
7219 const char* field_name = String::Handle(name()).ToCString(); | 7282 const char* field_name = String::Handle(name()).ToCString(); |
7220 const Class& cls = Class::Handle(owner()); | 7283 const Class& cls = Class::Handle(Owner()); |
7221 const char* cls_name = String::Handle(cls.Name()).ToCString(); | 7284 const char* cls_name = String::Handle(cls.Name()).ToCString(); |
7222 return OS::SCreate(Thread::Current()->zone(), | 7285 return OS::SCreate(Thread::Current()->zone(), |
7223 "Field <%s.%s>:%s%s%s", cls_name, field_name, kF0, kF1, kF2); | 7286 "Field <%s.%s>:%s%s%s", cls_name, field_name, kF0, kF1, kF2); |
7224 } | 7287 } |
7225 | 7288 |
7226 | 7289 |
7227 // Build a closure object that gets (or sets) the contents of a static | 7290 // Build a closure object that gets (or sets) the contents of a static |
7228 // field f and cache the closure in a newly created static field | 7291 // field f and cache the closure in a newly created static field |
7229 // named #f (or #f= in case of a setter). | 7292 // named #f (or #f= in case of a setter). |
7230 RawInstance* Field::AccessorClosure(bool make_setter) const { | 7293 RawInstance* Field::AccessorClosure(bool make_setter) const { |
7231 ASSERT(is_static()); | 7294 ASSERT(is_static()); |
7232 const Class& field_owner = Class::Handle(owner()); | 7295 const Class& field_owner = Class::Handle(Owner()); |
7233 | 7296 |
7234 String& closure_name = String::Handle(this->name()); | 7297 String& closure_name = String::Handle(this->name()); |
7235 closure_name = Symbols::FromConcat(Symbols::HashMark(), closure_name); | 7298 closure_name = Symbols::FromConcat(Symbols::HashMark(), closure_name); |
7236 if (make_setter) { | 7299 if (make_setter) { |
7237 closure_name = Symbols::FromConcat(Symbols::HashMark(), closure_name); | 7300 closure_name = Symbols::FromConcat(Symbols::HashMark(), closure_name); |
7238 } | 7301 } |
7239 | 7302 |
7240 Field& closure_field = Field::Handle(); | 7303 Field& closure_field = Field::Handle(); |
7241 closure_field = field_owner.LookupStaticField(closure_name); | 7304 closure_field = field_owner.LookupStaticField(closure_name); |
7242 if (!closure_field.IsNull()) { | 7305 if (!closure_field.IsNull()) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7292 return AccessorClosure(true); | 7355 return AccessorClosure(true); |
7293 } | 7356 } |
7294 | 7357 |
7295 | 7358 |
7296 RawArray* Field::dependent_code() const { | 7359 RawArray* Field::dependent_code() const { |
7297 return raw_ptr()->dependent_code_; | 7360 return raw_ptr()->dependent_code_; |
7298 } | 7361 } |
7299 | 7362 |
7300 | 7363 |
7301 void Field::set_dependent_code(const Array& array) const { | 7364 void Field::set_dependent_code(const Array& array) const { |
| 7365 ASSERT(IsOriginal()); |
7302 StorePointer(&raw_ptr()->dependent_code_, array.raw()); | 7366 StorePointer(&raw_ptr()->dependent_code_, array.raw()); |
7303 } | 7367 } |
7304 | 7368 |
7305 | 7369 |
7306 class FieldDependentArray : public WeakCodeReferences { | 7370 class FieldDependentArray : public WeakCodeReferences { |
7307 public: | 7371 public: |
7308 explicit FieldDependentArray(const Field& field) | 7372 explicit FieldDependentArray(const Field& field) |
7309 : WeakCodeReferences(Array::Handle(field.dependent_code())), | 7373 : WeakCodeReferences(Array::Handle(field.dependent_code())), |
7310 field_(field) {} | 7374 field_(field) {} |
7311 | 7375 |
(...skipping 23 matching lines...) Expand all Loading... |
7335 Isolate::Current()->IncrFieldInvalidationGen(); | 7399 Isolate::Current()->IncrFieldInvalidationGen(); |
7336 } | 7400 } |
7337 | 7401 |
7338 private: | 7402 private: |
7339 const Field& field_; | 7403 const Field& field_; |
7340 DISALLOW_COPY_AND_ASSIGN(FieldDependentArray); | 7404 DISALLOW_COPY_AND_ASSIGN(FieldDependentArray); |
7341 }; | 7405 }; |
7342 | 7406 |
7343 | 7407 |
7344 void Field::RegisterDependentCode(const Code& code) const { | 7408 void Field::RegisterDependentCode(const Code& code) const { |
| 7409 ASSERT(IsOriginal()); |
7345 DEBUG_ASSERT(IsMutatorOrAtSafepoint()); | 7410 DEBUG_ASSERT(IsMutatorOrAtSafepoint()); |
7346 ASSERT(code.is_optimized()); | 7411 ASSERT(code.is_optimized()); |
7347 FieldDependentArray a(*this); | 7412 FieldDependentArray a(*this); |
7348 a.Register(code); | 7413 a.Register(code); |
7349 } | 7414 } |
7350 | 7415 |
7351 | 7416 |
7352 void Field::DeoptimizeDependentCode() const { | 7417 void Field::DeoptimizeDependentCode() const { |
| 7418 ASSERT(IsOriginal()); |
7353 ASSERT(Thread::Current()->IsMutatorThread()); | 7419 ASSERT(Thread::Current()->IsMutatorThread()); |
7354 FieldDependentArray a(*this); | 7420 FieldDependentArray a(*this); |
7355 a.DisableCode(); | 7421 a.DisableCode(); |
7356 } | 7422 } |
7357 | 7423 |
7358 | 7424 |
7359 bool Field::IsUninitialized() const { | 7425 bool Field::IsUninitialized() const { |
7360 const Instance& value = Instance::Handle(raw_ptr()->value_.static_value_); | 7426 const Instance& value = Instance::Handle(raw_ptr()->value_.static_value_); |
7361 ASSERT(value.raw() != Object::transition_sentinel().raw()); | 7427 ASSERT(value.raw() != Object::transition_sentinel().raw()); |
7362 return value.raw() == Object::sentinel().raw(); | 7428 return value.raw() == Object::sentinel().raw(); |
7363 } | 7429 } |
7364 | 7430 |
7365 | 7431 |
7366 void Field::SetPrecompiledInitializer(const Function& initializer) const { | 7432 void Field::SetPrecompiledInitializer(const Function& initializer) const { |
| 7433 ASSERT(IsOriginal()); |
7367 StorePointer(&raw_ptr()->initializer_.precompiled_, initializer.raw()); | 7434 StorePointer(&raw_ptr()->initializer_.precompiled_, initializer.raw()); |
7368 } | 7435 } |
7369 | 7436 |
7370 | 7437 |
7371 bool Field::HasPrecompiledInitializer() const { | 7438 bool Field::HasPrecompiledInitializer() const { |
7372 return raw_ptr()->initializer_.precompiled_->IsHeapObject() && | 7439 return raw_ptr()->initializer_.precompiled_->IsHeapObject() && |
7373 raw_ptr()->initializer_.precompiled_->IsFunction(); | 7440 raw_ptr()->initializer_.precompiled_->IsFunction(); |
7374 } | 7441 } |
7375 | 7442 |
7376 | 7443 |
7377 void Field::SetSavedInitialStaticValue(const Instance& value) const { | 7444 void Field::SetSavedInitialStaticValue(const Instance& value) const { |
| 7445 ASSERT(IsOriginal()); |
7378 ASSERT(!HasPrecompiledInitializer()); | 7446 ASSERT(!HasPrecompiledInitializer()); |
7379 StorePointer(&raw_ptr()->initializer_.saved_value_, value.raw()); | 7447 StorePointer(&raw_ptr()->initializer_.saved_value_, value.raw()); |
7380 } | 7448 } |
7381 | 7449 |
7382 | 7450 |
7383 void Field::EvaluateInitializer() const { | 7451 void Field::EvaluateInitializer() const { |
| 7452 ASSERT(IsOriginal()); |
7384 ASSERT(is_static()); | 7453 ASSERT(is_static()); |
7385 if (StaticValue() == Object::sentinel().raw()) { | 7454 if (StaticValue() == Object::sentinel().raw()) { |
7386 SetStaticValue(Object::transition_sentinel()); | 7455 SetStaticValue(Object::transition_sentinel()); |
7387 const Object& value = | 7456 const Object& value = |
7388 Object::Handle(Compiler::EvaluateStaticInitializer(*this)); | 7457 Object::Handle(Compiler::EvaluateStaticInitializer(*this)); |
7389 if (value.IsError()) { | 7458 if (value.IsError()) { |
7390 SetStaticValue(Object::null_instance()); | 7459 SetStaticValue(Object::null_instance()); |
7391 Exceptions::PropagateError(Error::Cast(value)); | 7460 Exceptions::PropagateError(Error::Cast(value)); |
7392 UNREACHABLE(); | 7461 UNREACHABLE(); |
7393 } | 7462 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7475 } | 7544 } |
7476 } | 7545 } |
7477 | 7546 |
7478 return Thread::Current()->zone()->PrintToString("<%s %s>", | 7547 return Thread::Current()->zone()->PrintToString("<%s %s>", |
7479 is_nullable() ? "nullable" : "not-nullable", | 7548 is_nullable() ? "nullable" : "not-nullable", |
7480 class_name); | 7549 class_name); |
7481 } | 7550 } |
7482 | 7551 |
7483 | 7552 |
7484 void Field::InitializeGuardedListLengthInObjectOffset() const { | 7553 void Field::InitializeGuardedListLengthInObjectOffset() const { |
| 7554 ASSERT(IsOriginal()); |
7485 if (needs_length_check() && | 7555 if (needs_length_check() && |
7486 (guarded_list_length() != Field::kUnknownFixedLength)) { | 7556 (guarded_list_length() != Field::kUnknownFixedLength)) { |
7487 const intptr_t offset = GetListLengthOffset(guarded_cid()); | 7557 const intptr_t offset = GetListLengthOffset(guarded_cid()); |
7488 set_guarded_list_length_in_object_offset(offset); | 7558 set_guarded_list_length_in_object_offset(offset); |
7489 ASSERT(offset != Field::kUnknownLengthOffset); | 7559 ASSERT(offset != Field::kUnknownLengthOffset); |
7490 } else { | 7560 } else { |
7491 set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); | 7561 set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); |
7492 } | 7562 } |
7493 } | 7563 } |
7494 | 7564 |
7495 | 7565 |
7496 bool Field::UpdateGuardedCidAndLength(const Object& value) const { | 7566 bool Field::UpdateGuardedCidAndLength(const Object& value) const { |
| 7567 ASSERT(IsOriginal()); |
7497 const intptr_t cid = value.GetClassId(); | 7568 const intptr_t cid = value.GetClassId(); |
7498 | 7569 |
7499 if (guarded_cid() == kIllegalCid) { | 7570 if (guarded_cid() == kIllegalCid) { |
7500 // Field is assigned first time. | 7571 // Field is assigned first time. |
7501 set_guarded_cid(cid); | 7572 set_guarded_cid(cid); |
7502 set_is_nullable(cid == kNullCid); | 7573 set_is_nullable(cid == kNullCid); |
7503 | 7574 |
7504 // Start tracking length if needed. | 7575 // Start tracking length if needed. |
7505 ASSERT((guarded_list_length() == Field::kUnknownFixedLength) || | 7576 ASSERT((guarded_list_length() == Field::kUnknownFixedLength) || |
7506 (guarded_list_length() == Field::kNoFixedLength)); | 7577 (guarded_list_length() == Field::kNoFixedLength)); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7554 set_guarded_list_length(Field::kNoFixedLength); | 7625 set_guarded_list_length(Field::kNoFixedLength); |
7555 set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); | 7626 set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); |
7556 } | 7627 } |
7557 | 7628 |
7558 // Expected class id or nullability of the field changed. | 7629 // Expected class id or nullability of the field changed. |
7559 return true; | 7630 return true; |
7560 } | 7631 } |
7561 | 7632 |
7562 | 7633 |
7563 void Field::RecordStore(const Object& value) const { | 7634 void Field::RecordStore(const Object& value) const { |
| 7635 ASSERT(IsOriginal()); |
7564 if (!FLAG_use_field_guards) { | 7636 if (!FLAG_use_field_guards) { |
7565 return; | 7637 return; |
7566 } | 7638 } |
7567 | 7639 |
7568 if (FLAG_trace_field_guards) { | 7640 if (FLAG_trace_field_guards) { |
7569 THR_Print("Store %s %s <- %s\n", | 7641 THR_Print("Store %s %s <- %s\n", |
7570 ToCString(), | 7642 ToCString(), |
7571 GuardedPropertiesAsCString(), | 7643 GuardedPropertiesAsCString(), |
7572 value.ToCString()); | 7644 value.ToCString()); |
7573 } | 7645 } |
(...skipping 1341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8915 } | 8987 } |
8916 | 8988 |
8917 | 8989 |
8918 static RawString* MakeClassMetaName(const Class& cls) { | 8990 static RawString* MakeClassMetaName(const Class& cls) { |
8919 return Symbols::FromConcat(Symbols::At(), String::Handle(cls.Name())); | 8991 return Symbols::FromConcat(Symbols::At(), String::Handle(cls.Name())); |
8920 } | 8992 } |
8921 | 8993 |
8922 | 8994 |
8923 static RawString* MakeFieldMetaName(const Field& field) { | 8995 static RawString* MakeFieldMetaName(const Field& field) { |
8924 const String& cname = | 8996 const String& cname = |
8925 String::Handle(MakeClassMetaName(Class::Handle(field.origin()))); | 8997 String::Handle(MakeClassMetaName(Class::Handle(field.Origin()))); |
8926 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); | 8998 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); |
8927 pieces.Add(cname); | 8999 pieces.Add(cname); |
8928 pieces.Add(Symbols::At()); | 9000 pieces.Add(Symbols::At()); |
8929 pieces.Add(String::Handle(field.name())); | 9001 pieces.Add(String::Handle(field.name())); |
8930 return Symbols::FromConcatAll(pieces); | 9002 return Symbols::FromConcatAll(pieces); |
8931 } | 9003 } |
8932 | 9004 |
8933 | 9005 |
8934 static RawString* MakeFunctionMetaName(const Function& func) { | 9006 static RawString* MakeFunctionMetaName(const Function& func) { |
8935 const String& cname = | 9007 const String& cname = |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9380 Class& cls = Class::Handle(); | 9452 Class& cls = Class::Handle(); |
9381 Script& owner_script = Script::Handle(); | 9453 Script& owner_script = Script::Handle(); |
9382 DictionaryIterator it(*this); | 9454 DictionaryIterator it(*this); |
9383 while (it.HasNext()) { | 9455 while (it.HasNext()) { |
9384 entry = it.GetNext(); | 9456 entry = it.GetNext(); |
9385 if (entry.IsClass()) { | 9457 if (entry.IsClass()) { |
9386 owner_script = Class::Cast(entry).script(); | 9458 owner_script = Class::Cast(entry).script(); |
9387 } else if (entry.IsFunction()) { | 9459 } else if (entry.IsFunction()) { |
9388 owner_script = Function::Cast(entry).script(); | 9460 owner_script = Function::Cast(entry).script(); |
9389 } else if (entry.IsField()) { | 9461 } else if (entry.IsField()) { |
9390 owner_script = Field::Cast(entry).script(); | 9462 owner_script = Field::Cast(entry).Script(); |
9391 } else { | 9463 } else { |
9392 continue; | 9464 continue; |
9393 } | 9465 } |
9394 AddScriptIfUnique(scripts, owner_script); | 9466 AddScriptIfUnique(scripts, owner_script); |
9395 } | 9467 } |
9396 | 9468 |
9397 // Add all scripts from patch classes. | 9469 // Add all scripts from patch classes. |
9398 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes()); | 9470 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes()); |
9399 for (intptr_t i = 0; i < patches.Length(); i++) { | 9471 for (intptr_t i = 0; i < patches.Length(); i++) { |
9400 entry = patches.At(i); | 9472 entry = patches.At(i); |
(...skipping 12132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21533 return UserTag::null(); | 21605 return UserTag::null(); |
21534 } | 21606 } |
21535 | 21607 |
21536 | 21608 |
21537 const char* UserTag::ToCString() const { | 21609 const char* UserTag::ToCString() const { |
21538 const String& tag_label = String::Handle(label()); | 21610 const String& tag_label = String::Handle(label()); |
21539 return tag_label.ToCString(); | 21611 return tag_label.ToCString(); |
21540 } | 21612 } |
21541 | 21613 |
21542 } // namespace dart | 21614 } // namespace dart |
OLD | NEW |