Chromium Code Reviews| 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 5211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5222 "PatchClass for %s", cls_name); | 5222 "PatchClass for %s", cls_name); |
| 5223 } | 5223 } |
| 5224 | 5224 |
| 5225 | 5225 |
| 5226 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const { | 5226 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 5227 Object::PrintJSONImpl(stream, ref); | 5227 Object::PrintJSONImpl(stream, ref); |
| 5228 } | 5228 } |
| 5229 | 5229 |
| 5230 | 5230 |
| 5231 RawPatchClass* PatchClass::New(const Class& patched_class, | 5231 RawPatchClass* PatchClass::New(const Class& patched_class, |
| 5232 const Class& source_class) { | 5232 const Class& origin_class) { |
| 5233 const PatchClass& result = PatchClass::Handle(PatchClass::New()); | 5233 const PatchClass& result = PatchClass::Handle(PatchClass::New()); |
| 5234 result.set_patched_class(patched_class); | 5234 result.set_patched_class(patched_class); |
| 5235 result.set_source_class(source_class); | 5235 result.set_origin_class(origin_class); |
| 5236 result.set_script(Script::Handle(origin_class.script())); | |
| 5236 return result.raw(); | 5237 return result.raw(); |
| 5237 } | 5238 } |
| 5238 | 5239 |
| 5240 | |
| 5241 RawPatchClass* PatchClass::New(const Class& patched_class, | |
| 5242 const Script& script) { | |
| 5243 const PatchClass& result = PatchClass::Handle(PatchClass::New()); | |
| 5244 result.set_patched_class(patched_class); | |
| 5245 result.set_origin_class(patched_class); | |
| 5246 result.set_script(script); | |
| 5247 return result.raw(); | |
| 5248 } | |
| 5249 | |
| 5239 | 5250 |
| 5240 RawPatchClass* PatchClass::New() { | 5251 RawPatchClass* PatchClass::New() { |
| 5241 ASSERT(Object::patch_class_class() != Class::null()); | 5252 ASSERT(Object::patch_class_class() != Class::null()); |
| 5242 RawObject* raw = Object::Allocate(PatchClass::kClassId, | 5253 RawObject* raw = Object::Allocate(PatchClass::kClassId, |
| 5243 PatchClass::InstanceSize(), | 5254 PatchClass::InstanceSize(), |
| 5244 Heap::kOld); | 5255 Heap::kOld); |
| 5245 return reinterpret_cast<RawPatchClass*>(raw); | 5256 return reinterpret_cast<RawPatchClass*>(raw); |
| 5246 } | 5257 } |
| 5247 | 5258 |
| 5248 | 5259 |
| 5249 RawScript* PatchClass::Script() const { | |
| 5250 const Class& source_class = Class::Handle(this->source_class()); | |
| 5251 return source_class.script(); | |
| 5252 } | |
| 5253 | |
| 5254 | |
| 5255 void PatchClass::set_patched_class(const Class& value) const { | 5260 void PatchClass::set_patched_class(const Class& value) const { |
| 5256 StorePointer(&raw_ptr()->patched_class_, value.raw()); | 5261 StorePointer(&raw_ptr()->patched_class_, value.raw()); |
| 5257 } | 5262 } |
| 5258 | 5263 |
| 5259 | 5264 |
| 5260 void PatchClass::set_source_class(const Class& value) const { | 5265 void PatchClass::set_origin_class(const Class& value) const { |
| 5261 StorePointer(&raw_ptr()->source_class_, value.raw()); | 5266 StorePointer(&raw_ptr()->origin_class_, value.raw()); |
| 5262 } | 5267 } |
| 5263 | 5268 |
| 5264 | 5269 |
| 5270 void PatchClass::set_script(const Script& value) const { | |
| 5271 StorePointer(&raw_ptr()->script_, value.raw()); | |
| 5272 } | |
| 5273 | |
| 5274 | |
| 5265 bool Function::HasBreakpoint() const { | 5275 bool Function::HasBreakpoint() const { |
| 5266 Thread* thread = Thread::Current(); | 5276 Thread* thread = Thread::Current(); |
| 5267 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()); | 5277 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()); |
| 5268 } | 5278 } |
| 5269 | 5279 |
| 5270 | 5280 |
| 5271 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const { | 5281 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const { |
| 5272 DEBUG_ASSERT(IsMutatorOrAtSafepoint()); | 5282 DEBUG_ASSERT(IsMutatorOrAtSafepoint()); |
| 5273 // We may not have previous code if 'always_optimize' is set. | 5283 // We may not have previous code if 'always_optimize' is set. |
| 5274 if (!is_osr && HasCode()) { | 5284 if (!is_osr && HasCode()) { |
| (...skipping 1575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6850 return PatchClass::Cast(obj).patched_class(); | 6860 return PatchClass::Cast(obj).patched_class(); |
| 6851 } | 6861 } |
| 6852 | 6862 |
| 6853 | 6863 |
| 6854 RawClass* Function::origin() const { | 6864 RawClass* Function::origin() const { |
| 6855 const Object& obj = Object::Handle(raw_ptr()->owner_); | 6865 const Object& obj = Object::Handle(raw_ptr()->owner_); |
| 6856 if (obj.IsClass()) { | 6866 if (obj.IsClass()) { |
| 6857 return Class::Cast(obj).raw(); | 6867 return Class::Cast(obj).raw(); |
| 6858 } | 6868 } |
| 6859 ASSERT(obj.IsPatchClass()); | 6869 ASSERT(obj.IsPatchClass()); |
| 6860 return PatchClass::Cast(obj).source_class(); | 6870 return PatchClass::Cast(obj).origin_class(); |
| 6861 } | 6871 } |
| 6862 | 6872 |
| 6863 | 6873 |
| 6864 RawScript* Function::script() const { | 6874 RawScript* Function::script() const { |
| 6865 if (token_pos() == 0) { | 6875 if (token_pos() == 0) { |
| 6866 // Testing for position 0 is an optimization that relies on temporary | 6876 // Testing for position 0 is an optimization that relies on temporary |
| 6867 // eval functions having token position 0. | 6877 // eval functions having token position 0. |
| 6868 const Script& script = Script::Handle(eval_script()); | 6878 const Script& script = Script::Handle(eval_script()); |
| 6869 if (!script.IsNull()) { | 6879 if (!script.IsNull()) { |
| 6870 return script.raw(); | 6880 return script.raw(); |
| 6871 } | 6881 } |
| 6872 } | 6882 } |
| 6873 if (IsClosureFunction()) { | 6883 if (IsClosureFunction()) { |
| 6874 return Function::Handle(parent_function()).script(); | 6884 return Function::Handle(parent_function()).script(); |
| 6875 } | 6885 } |
| 6876 const Object& obj = Object::Handle(raw_ptr()->owner_); | 6886 const Object& obj = Object::Handle(raw_ptr()->owner_); |
| 6877 if (obj.IsClass()) { | 6887 if (obj.IsClass()) { |
| 6878 return Class::Cast(obj).script(); | 6888 return Class::Cast(obj).script(); |
| 6879 } | 6889 } |
| 6880 ASSERT(obj.IsPatchClass()); | 6890 ASSERT(obj.IsPatchClass()); |
| 6881 return PatchClass::Cast(obj).Script(); | 6891 return PatchClass::Cast(obj).script(); |
| 6882 } | 6892 } |
| 6883 | 6893 |
| 6884 | 6894 |
| 6885 bool Function::HasOptimizedCode() const { | 6895 bool Function::HasOptimizedCode() const { |
| 6886 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); | 6896 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); |
| 6887 } | 6897 } |
| 6888 | 6898 |
| 6889 | 6899 |
| 6890 RawString* Function::PrettyName() const { | 6900 RawString* Function::PrettyName() const { |
| 6891 const String& str = String::Handle(name()); | 6901 const String& str = String::Handle(name()); |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7423 return PatchClass::Cast(obj).patched_class(); | 7433 return PatchClass::Cast(obj).patched_class(); |
| 7424 } | 7434 } |
| 7425 | 7435 |
| 7426 | 7436 |
| 7427 RawClass* Field::origin() const { | 7437 RawClass* Field::origin() const { |
| 7428 const Object& obj = Object::Handle(raw_ptr()->owner_); | 7438 const Object& obj = Object::Handle(raw_ptr()->owner_); |
| 7429 if (obj.IsClass()) { | 7439 if (obj.IsClass()) { |
| 7430 return Class::Cast(obj).raw(); | 7440 return Class::Cast(obj).raw(); |
| 7431 } | 7441 } |
| 7432 ASSERT(obj.IsPatchClass()); | 7442 ASSERT(obj.IsPatchClass()); |
| 7433 return PatchClass::Cast(obj).source_class(); | 7443 return PatchClass::Cast(obj).origin_class(); |
| 7434 } | 7444 } |
| 7435 | 7445 |
| 7436 | 7446 |
| 7447 RawScript* Field::script() const { | |
| 7448 const Object& obj = Object::Handle(raw_ptr()->owner_); | |
| 7449 if (obj.IsClass()) { | |
| 7450 return Class::Cast(obj).script(); | |
| 7451 } | |
| 7452 ASSERT(obj.IsPatchClass()); | |
| 7453 return PatchClass::Cast(obj).script(); | |
| 7454 } | |
| 7455 | |
| 7456 | |
| 7437 // Called at finalization time | 7457 // Called at finalization time |
| 7438 void Field::SetFieldType(const AbstractType& value) const { | 7458 void Field::SetFieldType(const AbstractType& value) const { |
| 7439 ASSERT(Thread::Current()->IsMutatorThread()); | 7459 ASSERT(Thread::Current()->IsMutatorThread()); |
| 7440 ASSERT(!value.IsNull()); | 7460 ASSERT(!value.IsNull()); |
| 7441 if (value.raw() != type()) { | 7461 if (value.raw() != type()) { |
| 7442 StorePointer(&raw_ptr()->type_, value.raw()); | 7462 StorePointer(&raw_ptr()->type_, value.raw()); |
| 7443 } | 7463 } |
| 7444 } | 7464 } |
| 7445 | 7465 |
| 7446 | 7466 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7483 // Presently, we only attempt to remember the list length for final fields. | 7503 // Presently, we only attempt to remember the list length for final fields. |
| 7484 if (is_final && FLAG_use_field_guards) { | 7504 if (is_final && FLAG_use_field_guards) { |
| 7485 result.set_guarded_list_length(Field::kUnknownFixedLength); | 7505 result.set_guarded_list_length(Field::kUnknownFixedLength); |
| 7486 } else { | 7506 } else { |
| 7487 result.set_guarded_list_length(Field::kNoFixedLength); | 7507 result.set_guarded_list_length(Field::kNoFixedLength); |
| 7488 } | 7508 } |
| 7489 return result.raw(); | 7509 return result.raw(); |
| 7490 } | 7510 } |
| 7491 | 7511 |
| 7492 | 7512 |
| 7513 RawField* Field::NewTopLevel(const String& name, | |
| 7514 bool is_final, | |
| 7515 bool is_const, | |
| 7516 const Object& owner, | |
| 7517 intptr_t token_pos) { | |
| 7518 ASSERT(!owner.IsNull()); | |
| 7519 const Field& result = Field::Handle(Field::New()); | |
| 7520 result.set_name(name); | |
| 7521 result.set_is_static(true); | |
| 7522 result.set_is_final(is_final); | |
| 7523 result.set_is_const(is_const); | |
| 7524 result.set_is_reflectable(true); | |
| 7525 result.set_is_double_initialized(false); | |
| 7526 result.set_owner(owner); | |
| 7527 result.set_token_pos(token_pos); | |
| 7528 result.set_has_initializer(false); | |
| 7529 result.set_is_unboxing_candidate(true); | |
| 7530 result.set_guarded_cid(FLAG_use_field_guards ? kIllegalCid : kDynamicCid); | |
| 7531 result.set_is_nullable(FLAG_use_field_guards ? false : true); | |
| 7532 result.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); | |
| 7533 // Presently, we only attempt to remember the list length for final fields. | |
| 7534 if (is_final && FLAG_use_field_guards) { | |
| 7535 result.set_guarded_list_length(Field::kUnknownFixedLength); | |
| 7536 } else { | |
| 7537 result.set_guarded_list_length(Field::kNoFixedLength); | |
| 7538 } | |
| 7539 return result.raw(); | |
| 7540 } | |
| 7541 | |
| 7493 | 7542 |
| 7494 RawField* Field::Clone(const Class& new_owner) const { | 7543 RawField* Field::Clone(const Class& new_owner) const { |
| 7495 Field& clone = Field::Handle(); | 7544 Field& clone = Field::Handle(); |
| 7496 clone ^= Object::Clone(*this, Heap::kOld); | 7545 clone ^= Object::Clone(*this, Heap::kOld); |
| 7497 const Class& owner = Class::Handle(this->owner()); | 7546 const Class& owner = Class::Handle(this->owner()); |
| 7498 const PatchClass& clone_owner = | 7547 const PatchClass& clone_owner = |
| 7499 PatchClass::Handle(PatchClass::New(new_owner, owner)); | 7548 PatchClass::Handle(PatchClass::New(new_owner, owner)); |
| 7500 clone.set_owner(clone_owner); | 7549 clone.set_owner(clone_owner); |
| 7501 if (!clone.is_static()) { | 7550 if (!clone.is_static()) { |
| 7502 clone.SetOffset(0); | 7551 clone.SetOffset(0); |
| (...skipping 1646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9149 while (obj.IsNull() && HasNext()) { | 9198 while (obj.IsNull() && HasNext()) { |
| 9150 next_ix_++; | 9199 next_ix_++; |
| 9151 obj = array_.At(next_ix_); | 9200 obj = array_.At(next_ix_); |
| 9152 } | 9201 } |
| 9153 } | 9202 } |
| 9154 | 9203 |
| 9155 | 9204 |
| 9156 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library, | 9205 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library, |
| 9157 IterationKind kind) | 9206 IterationKind kind) |
| 9158 : DictionaryIterator(library), | 9207 : DictionaryIterator(library), |
| 9159 anon_array_((kind == kIteratePrivate) ? | 9208 toplevel_class_(Class::Handle( |
| 9160 Array::Handle(library.anonymous_classes()) : Object::empty_array()), | 9209 (kind == kIteratePrivate) |
| 9161 anon_size_((kind == kIteratePrivate) ? | 9210 ? library.toplevel_class() |
| 9162 library.num_anonymous_classes() : 0), | 9211 : Class::null())) { |
| 9163 anon_ix_(0) { | |
| 9164 MoveToNextClass(); | 9212 MoveToNextClass(); |
| 9165 } | 9213 } |
| 9166 | 9214 |
| 9167 | 9215 |
| 9168 RawClass* ClassDictionaryIterator::GetNextClass() { | 9216 RawClass* ClassDictionaryIterator::GetNextClass() { |
| 9169 ASSERT(HasNext()); | 9217 ASSERT(HasNext()); |
| 9170 Class& cls = Class::Handle(); | 9218 Class& cls = Class::Handle(); |
| 9171 if (next_ix_ < size_) { | 9219 if (next_ix_ < size_) { |
| 9172 int ix = next_ix_++; | 9220 int ix = next_ix_++; |
| 9173 cls ^= array_.At(ix); | 9221 cls ^= array_.At(ix); |
| 9174 MoveToNextClass(); | 9222 MoveToNextClass(); |
| 9175 return cls.raw(); | 9223 return cls.raw(); |
| 9176 } | 9224 } |
| 9177 ASSERT(anon_ix_ < anon_size_); | 9225 ASSERT(!toplevel_class_.IsNull()); |
| 9178 cls ^= anon_array_.At(anon_ix_++); | 9226 cls = toplevel_class_.raw(); |
| 9227 toplevel_class_ = Class::null(); | |
| 9179 return cls.raw(); | 9228 return cls.raw(); |
| 9180 } | 9229 } |
| 9181 | 9230 |
| 9182 | 9231 |
| 9183 void ClassDictionaryIterator::MoveToNextClass() { | 9232 void ClassDictionaryIterator::MoveToNextClass() { |
| 9184 Object& obj = Object::Handle(); | 9233 Object& obj = Object::Handle(); |
| 9185 while (next_ix_ < size_) { | 9234 while (next_ix_ < size_) { |
| 9186 obj = array_.At(next_ix_); | 9235 obj = array_.At(next_ix_); |
| 9187 if (obj.IsClass()) { | 9236 if (obj.IsClass()) { |
| 9188 return; | 9237 return; |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9353 const String& cname = String::Handle( | 9402 const String& cname = String::Handle( |
| 9354 MakeClassMetaName(Class::Handle(param.parameterized_class()))); | 9403 MakeClassMetaName(Class::Handle(param.parameterized_class()))); |
| 9355 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); | 9404 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); |
| 9356 pieces.Add(cname); | 9405 pieces.Add(cname); |
| 9357 pieces.Add(Symbols::At()); | 9406 pieces.Add(Symbols::At()); |
| 9358 pieces.Add(String::Handle(param.name())); | 9407 pieces.Add(String::Handle(param.name())); |
| 9359 return Symbols::FromConcatAll(pieces); | 9408 return Symbols::FromConcatAll(pieces); |
| 9360 } | 9409 } |
| 9361 | 9410 |
| 9362 | 9411 |
| 9363 void Library::AddMetadata(const Class& cls, | 9412 void Library::AddMetadata(const Object& owner, |
| 9364 const String& name, | 9413 const String& name, |
| 9365 intptr_t token_pos) const { | 9414 intptr_t token_pos) const { |
| 9366 const String& metaname = String::Handle(Symbols::New(name)); | 9415 const String& metaname = String::Handle(Symbols::New(name)); |
| 9367 Field& field = Field::Handle(Field::New(metaname, | 9416 Field& field = Field::Handle(); |
| 9368 true, // is_static | 9417 field = Field::NewTopLevel(metaname, |
|
Ivan Posva
2015/11/30 23:54:26
"= Field::Handle(Field::NewTopLevel(...)" so that
hausner
2015/12/01 19:38:17
Done.
| |
| 9369 false, // is_final | 9418 false, // is_final |
| 9370 false, // is_const | 9419 false, // is_const |
| 9371 false, // is_reflectable | 9420 owner, |
| 9372 cls, | 9421 token_pos); |
| 9373 Object::dynamic_type(), | 9422 field.SetFieldType(Object::dynamic_type()); |
| 9374 token_pos)); | 9423 field.set_is_reflectable(false); |
| 9375 field.SetStaticValue(Array::empty_array(), true); | 9424 field.SetStaticValue(Array::empty_array(), true); |
| 9376 GrowableObjectArray& metadata = | 9425 GrowableObjectArray& metadata = |
| 9377 GrowableObjectArray::Handle(this->metadata()); | 9426 GrowableObjectArray::Handle(this->metadata()); |
| 9378 metadata.Add(field, Heap::kOld); | 9427 metadata.Add(field, Heap::kOld); |
| 9379 cls.AddField(field); | |
| 9380 } | 9428 } |
| 9381 | 9429 |
| 9382 | 9430 |
| 9383 void Library::AddClassMetadata(const Class& cls, | 9431 void Library::AddClassMetadata(const Class& cls, |
| 9384 const Class& toplevel_class, | 9432 const PatchClass& tl_owner, |
| 9385 intptr_t token_pos) const { | 9433 intptr_t token_pos) const { |
| 9386 // We use the toplevel class as the owner of a class's metadata field because | 9434 // We use the toplevel class as the owner of a class's metadata field because |
| 9387 // a class's metadata is in scope of the library, not the class. | 9435 // a class's metadata is in scope of the library, not the class. |
| 9388 AddMetadata(toplevel_class, | 9436 AddMetadata(tl_owner, |
| 9389 String::Handle(MakeClassMetaName(cls)), | 9437 String::Handle(MakeClassMetaName(cls)), |
| 9390 token_pos); | 9438 token_pos); |
| 9391 } | 9439 } |
| 9392 | 9440 |
| 9393 | 9441 |
| 9394 void Library::AddFieldMetadata(const Field& field, | 9442 void Library::AddFieldMetadata(const Field& field, |
| 9395 intptr_t token_pos) const { | 9443 intptr_t token_pos) const { |
| 9396 AddMetadata(Class::Handle(field.origin()), | 9444 AddMetadata(Object::Handle(field.RawOwner()), |
| 9397 String::Handle(MakeFieldMetaName(field)), | 9445 String::Handle(MakeFieldMetaName(field)), |
| 9398 token_pos); | 9446 token_pos); |
| 9399 } | 9447 } |
| 9400 | 9448 |
| 9401 | 9449 |
| 9402 void Library::AddFunctionMetadata(const Function& func, | 9450 void Library::AddFunctionMetadata(const Function& func, |
| 9403 intptr_t token_pos) const { | 9451 intptr_t token_pos) const { |
| 9404 AddMetadata(Class::Handle(func.origin()), | 9452 AddMetadata(Object::Handle(func.RawOwner()), |
| 9405 String::Handle(MakeFunctionMetaName(func)), | 9453 String::Handle(MakeFunctionMetaName(func)), |
| 9406 token_pos); | 9454 token_pos); |
| 9407 } | 9455 } |
| 9408 | 9456 |
| 9409 | 9457 |
| 9410 void Library::AddTypeParameterMetadata(const TypeParameter& param, | 9458 void Library::AddTypeParameterMetadata(const TypeParameter& param, |
| 9411 intptr_t token_pos) const { | 9459 intptr_t token_pos) const { |
| 9412 AddMetadata(Class::Handle(param.parameterized_class()), | 9460 AddMetadata(Class::Handle(param.parameterized_class()), |
| 9413 String::Handle(MakeTypeParameterMetaName(param)), | 9461 String::Handle(MakeTypeParameterMetaName(param)), |
| 9414 token_pos); | 9462 token_pos); |
| 9415 } | 9463 } |
| 9416 | 9464 |
| 9417 | 9465 |
| 9418 void Library::AddLibraryMetadata(const Class& cls, intptr_t token_pos) const { | 9466 void Library::AddLibraryMetadata(const PatchClass& tl_owner, |
| 9419 AddMetadata(cls, Symbols::TopLevel(), token_pos); | 9467 intptr_t token_pos) const { |
| 9468 AddMetadata(tl_owner, Symbols::TopLevel(), token_pos); | |
| 9420 } | 9469 } |
| 9421 | 9470 |
| 9422 | 9471 |
| 9423 RawString* Library::MakeMetadataName(const Object& obj) const { | 9472 RawString* Library::MakeMetadataName(const Object& obj) const { |
| 9424 if (obj.IsClass()) { | 9473 if (obj.IsClass()) { |
| 9425 return MakeClassMetaName(Class::Cast(obj)); | 9474 return MakeClassMetaName(Class::Cast(obj)); |
| 9426 } else if (obj.IsField()) { | 9475 } else if (obj.IsField()) { |
| 9427 return MakeFieldMetaName(Field::Cast(obj)); | 9476 return MakeFieldMetaName(Field::Cast(obj)); |
| 9428 } else if (obj.IsFunction()) { | 9477 } else if (obj.IsFunction()) { |
| 9429 return MakeFunctionMetaName(Function::Cast(obj)); | 9478 return MakeFunctionMetaName(Function::Cast(obj)); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9461 } | 9510 } |
| 9462 const String& metaname = String::Handle(MakeMetadataName(obj)); | 9511 const String& metaname = String::Handle(MakeMetadataName(obj)); |
| 9463 Field& field = Field::Handle(GetMetadataField(metaname)); | 9512 Field& field = Field::Handle(GetMetadataField(metaname)); |
| 9464 if (field.IsNull()) { | 9513 if (field.IsNull()) { |
| 9465 // There is no metadata for this object. | 9514 // There is no metadata for this object. |
| 9466 return Object::empty_array().raw(); | 9515 return Object::empty_array().raw(); |
| 9467 } | 9516 } |
| 9468 Object& metadata = Object::Handle(); | 9517 Object& metadata = Object::Handle(); |
| 9469 metadata = field.StaticValue(); | 9518 metadata = field.StaticValue(); |
| 9470 if (field.StaticValue() == Object::empty_array().raw()) { | 9519 if (field.StaticValue() == Object::empty_array().raw()) { |
| 9471 metadata = Parser::ParseMetadata(Class::Handle(field.owner()), | 9520 metadata = Parser::ParseMetadata(field); |
| 9472 field.token_pos()); | |
| 9473 if (metadata.IsArray()) { | 9521 if (metadata.IsArray()) { |
| 9474 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); | 9522 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); |
| 9475 field.SetStaticValue(Array::Cast(metadata), true); | 9523 field.SetStaticValue(Array::Cast(metadata), true); |
| 9476 } | 9524 } |
| 9477 } | 9525 } |
| 9478 return metadata.raw(); | 9526 return metadata.raw(); |
| 9479 } | 9527 } |
| 9480 | 9528 |
| 9481 | 9529 |
| 9482 static bool ShouldBePrivate(const String& name) { | 9530 static bool ShouldBePrivate(const String& name) { |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9740 Class& cls = Class::Handle(); | 9788 Class& cls = Class::Handle(); |
| 9741 Script& owner_script = Script::Handle(); | 9789 Script& owner_script = Script::Handle(); |
| 9742 DictionaryIterator it(*this); | 9790 DictionaryIterator it(*this); |
| 9743 while (it.HasNext()) { | 9791 while (it.HasNext()) { |
| 9744 entry = it.GetNext(); | 9792 entry = it.GetNext(); |
| 9745 if (entry.IsClass()) { | 9793 if (entry.IsClass()) { |
| 9746 owner_script = Class::Cast(entry).script(); | 9794 owner_script = Class::Cast(entry).script(); |
| 9747 } else if (entry.IsFunction()) { | 9795 } else if (entry.IsFunction()) { |
| 9748 owner_script = Function::Cast(entry).script(); | 9796 owner_script = Function::Cast(entry).script(); |
| 9749 } else if (entry.IsField()) { | 9797 } else if (entry.IsField()) { |
| 9750 cls = Field::Cast(entry).owner(); | 9798 owner_script = Field::Cast(entry).script(); |
| 9751 owner_script = cls.script(); | |
| 9752 } else { | 9799 } else { |
| 9753 continue; | 9800 continue; |
| 9754 } | 9801 } |
| 9755 AddScriptIfUnique(scripts, owner_script); | 9802 AddScriptIfUnique(scripts, owner_script); |
| 9756 } | 9803 } |
| 9757 | 9804 |
| 9758 // Add all scripts from patch classes. | 9805 // Add all scripts from patch classes. |
| 9759 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes()); | 9806 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes()); |
| 9760 for (intptr_t i = 0; i < patches.Length(); i++) { | 9807 for (intptr_t i = 0; i < patches.Length(); i++) { |
| 9761 cls ^= patches.At(i); | 9808 cls ^= patches.At(i); |
| 9762 owner_script = cls.script(); | 9809 owner_script = cls.script(); |
| 9763 AddScriptIfUnique(scripts, owner_script); | 9810 AddScriptIfUnique(scripts, owner_script); |
| 9764 } | 9811 } |
| 9765 | 9812 |
| 9766 // Special case: Scripts that only contain external top-level functions are | 9813 cls ^= toplevel_class(); |
| 9767 // not included above, but can be referenced through a library's anonymous | 9814 if (!cls.IsNull()) { |
| 9768 // classes. Example: dart-core:identical.dart. | |
| 9769 Array& anon_classes = Array::Handle(anonymous_classes()); | |
| 9770 Function& func = Function::Handle(); | |
| 9771 Array& functions = Array::Handle(); | |
| 9772 for (intptr_t i = 0; i < anon_classes.Length(); i++) { | |
| 9773 cls ^= anon_classes.At(i); | |
| 9774 if (cls.IsNull()) continue; | |
| 9775 owner_script = cls.script(); | 9815 owner_script = cls.script(); |
| 9776 AddScriptIfUnique(scripts, owner_script); | 9816 AddScriptIfUnique(scripts, owner_script); |
| 9777 functions = cls.functions(); | 9817 // Special case: Scripts that only contain external top-level functions |
| 9818 // are not included above, but can be referenced through a library's | |
| 9819 // anonymous classes. Example: dart-core:identical.dart. | |
| 9820 Function& func = Function::Handle(); | |
| 9821 Array& functions = Array::Handle(cls.functions()); | |
| 9778 for (intptr_t j = 0; j < functions.Length(); j++) { | 9822 for (intptr_t j = 0; j < functions.Length(); j++) { |
| 9779 func ^= functions.At(j); | 9823 func ^= functions.At(j); |
| 9780 owner_script = func.script(); | 9824 if (func.is_external()) { |
| 9781 AddScriptIfUnique(scripts, owner_script); | 9825 owner_script = func.script(); |
| 9826 AddScriptIfUnique(scripts, owner_script); | |
| 9827 } | |
| 9782 } | 9828 } |
| 9783 } | 9829 } |
| 9784 | 9830 |
| 9785 // Create the array of scripts and cache it in loaded_scripts_. | 9831 // Create the array of scripts and cache it in loaded_scripts_. |
| 9786 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts)); | 9832 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts)); |
| 9787 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw()); | 9833 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw()); |
| 9788 } | 9834 } |
| 9789 return loaded_scripts(); | 9835 return loaded_scripts(); |
| 9790 } | 9836 } |
| 9791 | 9837 |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9989 | 10035 |
| 9990 RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const { | 10036 RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const { |
| 9991 const Object& obj = Object::Handle(LookupLocalObject(name)); | 10037 const Object& obj = Object::Handle(LookupLocalObject(name)); |
| 9992 if (obj.IsLibraryPrefix()) { | 10038 if (obj.IsLibraryPrefix()) { |
| 9993 return LibraryPrefix::Cast(obj).raw(); | 10039 return LibraryPrefix::Cast(obj).raw(); |
| 9994 } | 10040 } |
| 9995 return LibraryPrefix::null(); | 10041 return LibraryPrefix::null(); |
| 9996 } | 10042 } |
| 9997 | 10043 |
| 9998 | 10044 |
| 9999 void Library::AddAnonymousClass(const Class& cls) const { | 10045 void Library::set_toplevel_class(const Class& value) const { |
| 10000 intptr_t num_anonymous = this->raw_ptr()->num_anonymous_; | 10046 ASSERT(raw_ptr()->toplevel_class_ == Class::null()); |
| 10001 Array& anon_array = Array::Handle(this->raw_ptr()->anonymous_classes_); | 10047 StorePointer(&raw_ptr()->toplevel_class_, value.raw()); |
| 10002 if (num_anonymous == anon_array.Length()) { | |
| 10003 intptr_t new_len = (num_anonymous == 0) ? 4 : num_anonymous * 2; | |
| 10004 anon_array = Array::Grow(anon_array, new_len); | |
| 10005 StorePointer(&raw_ptr()->anonymous_classes_, anon_array.raw()); | |
| 10006 } | |
| 10007 anon_array.SetAt(num_anonymous, cls); | |
| 10008 num_anonymous++; | |
| 10009 StoreNonPointer(&raw_ptr()->num_anonymous_, num_anonymous); | |
| 10010 } | 10048 } |
| 10011 | 10049 |
| 10012 | 10050 |
| 10013 RawLibrary* Library::ImportLibraryAt(intptr_t index) const { | 10051 RawLibrary* Library::ImportLibraryAt(intptr_t index) const { |
| 10014 Namespace& import = Namespace::Handle(ImportAt(index)); | 10052 Namespace& import = Namespace::Handle(ImportAt(index)); |
| 10015 if (import.IsNull()) { | 10053 if (import.IsNull()) { |
| 10016 return Library::null(); | 10054 return Library::null(); |
| 10017 } | 10055 } |
| 10018 return import.library(); | 10056 return import.library(); |
| 10019 } | 10057 } |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10129 bool import_core_lib) { | 10167 bool import_core_lib) { |
| 10130 const Library& result = Library::Handle(Library::New()); | 10168 const Library& result = Library::Handle(Library::New()); |
| 10131 result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw()); | 10169 result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw()); |
| 10132 result.StorePointer(&result.raw_ptr()->url_, url.raw()); | 10170 result.StorePointer(&result.raw_ptr()->url_, url.raw()); |
| 10133 result.StorePointer(&result.raw_ptr()->resolved_names_, | 10171 result.StorePointer(&result.raw_ptr()->resolved_names_, |
| 10134 Object::empty_array().raw()); | 10172 Object::empty_array().raw()); |
| 10135 result.StorePointer(&result.raw_ptr()->dictionary_, | 10173 result.StorePointer(&result.raw_ptr()->dictionary_, |
| 10136 Object::empty_array().raw()); | 10174 Object::empty_array().raw()); |
| 10137 result.StorePointer(&result.raw_ptr()->metadata_, | 10175 result.StorePointer(&result.raw_ptr()->metadata_, |
| 10138 GrowableObjectArray::New(4, Heap::kOld)); | 10176 GrowableObjectArray::New(4, Heap::kOld)); |
| 10139 result.StorePointer(&result.raw_ptr()->anonymous_classes_, | 10177 result.StorePointer(&result.raw_ptr()->toplevel_class_, Class::null()); |
| 10140 Object::empty_array().raw()); | |
| 10141 result.StorePointer(&result.raw_ptr()->patch_classes_, | 10178 result.StorePointer(&result.raw_ptr()->patch_classes_, |
| 10142 GrowableObjectArray::New(Object::empty_array(), | 10179 GrowableObjectArray::New(Object::empty_array(), |
| 10143 Heap::kOld)); | 10180 Heap::kOld)); |
| 10144 result.StoreNonPointer(&result.raw_ptr()->num_anonymous_, 0); | |
| 10145 result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw()); | 10181 result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw()); |
| 10146 result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw()); | 10182 result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw()); |
| 10147 result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null()); | 10183 result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null()); |
| 10148 result.StorePointer(&result.raw_ptr()->load_error_, Instance::null()); | 10184 result.StorePointer(&result.raw_ptr()->load_error_, Instance::null()); |
| 10149 result.set_native_entry_resolver(NULL); | 10185 result.set_native_entry_resolver(NULL); |
| 10150 result.set_native_entry_symbol_resolver(NULL); | 10186 result.set_native_entry_symbol_resolver(NULL); |
| 10151 result.set_is_in_fullsnapshot(false); | 10187 result.set_is_in_fullsnapshot(false); |
| 10152 result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true); | 10188 result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true); |
| 10153 result.set_debuggable(false); | 10189 result.set_debuggable(false); |
| 10154 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme())); | 10190 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme())); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10189 // classes are coming from the VM isolate, and are shared between multiple | 10225 // classes are coming from the VM isolate, and are shared between multiple |
| 10190 // isolates so setting their library pointers would be wrong. | 10226 // isolates so setting their library pointers would be wrong. |
| 10191 const Class& cls = Class::Handle(Object::dynamic_class()); | 10227 const Class& cls = Class::Handle(Object::dynamic_class()); |
| 10192 core_lib.AddObject(cls, String::Handle(cls.Name())); | 10228 core_lib.AddObject(cls, String::Handle(cls.Name())); |
| 10193 } | 10229 } |
| 10194 | 10230 |
| 10195 | 10231 |
| 10196 RawObject* Library::Evaluate(const String& expr, | 10232 RawObject* Library::Evaluate(const String& expr, |
| 10197 const Array& param_names, | 10233 const Array& param_names, |
| 10198 const Array& param_values) const { | 10234 const Array& param_values) const { |
| 10199 // Take a top-level class and evaluate the expression | 10235 // Evaluate the expression as a static function of the toplevel class. |
| 10200 // as a static function of the class. | 10236 Class& top_level_class = Class::Handle(toplevel_class()); |
| 10201 Class& top_level_class = Class::Handle(); | |
| 10202 Array& top_level_classes = Array::Handle(anonymous_classes()); | |
| 10203 ASSERT(top_level_classes.Length() > 0); | |
| 10204 top_level_class ^= top_level_classes.At(0); | |
| 10205 ASSERT(top_level_class.is_finalized()); | 10237 ASSERT(top_level_class.is_finalized()); |
| 10206 return top_level_class.Evaluate(expr, param_names, param_values); | 10238 return top_level_class.Evaluate(expr, param_names, param_values); |
| 10207 } | 10239 } |
| 10208 | 10240 |
| 10209 | 10241 |
| 10210 void Library::InitNativeWrappersLibrary(Isolate* isolate) { | 10242 void Library::InitNativeWrappersLibrary(Isolate* isolate) { |
| 10211 static const int kNumNativeWrappersClasses = 4; | 10243 static const int kNumNativeWrappersClasses = 4; |
| 10212 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); | 10244 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); |
| 10213 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); | 10245 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); |
| 10214 const Library& native_flds_lib = Library::Handle( | 10246 const Library& native_flds_lib = Library::Handle( |
| (...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10859 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const { | 10891 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 10860 Object::PrintJSONImpl(stream, ref); | 10892 Object::PrintJSONImpl(stream, ref); |
| 10861 } | 10893 } |
| 10862 | 10894 |
| 10863 | 10895 |
| 10864 void Namespace::set_metadata_field(const Field& value) const { | 10896 void Namespace::set_metadata_field(const Field& value) const { |
| 10865 StorePointer(&raw_ptr()->metadata_field_, value.raw()); | 10897 StorePointer(&raw_ptr()->metadata_field_, value.raw()); |
| 10866 } | 10898 } |
| 10867 | 10899 |
| 10868 | 10900 |
| 10869 void Namespace::AddMetadata(intptr_t token_pos, const Class& owner_class) { | 10901 void Namespace::AddMetadata(const PatchClass& owner, intptr_t token_pos) { |
| 10870 ASSERT(Field::Handle(metadata_field()).IsNull()); | 10902 ASSERT(Field::Handle(metadata_field()).IsNull()); |
| 10871 Field& field = Field::Handle(Field::New(Symbols::TopLevel(), | 10903 Field& field = Field::Handle(Field::NewTopLevel(Symbols::TopLevel(), |
| 10872 true, // is_static | |
| 10873 false, // is_final | 10904 false, // is_final |
| 10874 false, // is_const | 10905 false, // is_const |
| 10875 false, // is_reflectable | 10906 owner, |
| 10876 owner_class, | |
| 10877 Object::dynamic_type(), | |
| 10878 token_pos)); | 10907 token_pos)); |
| 10908 field.set_is_reflectable(false); | |
| 10909 field.SetFieldType(Object::dynamic_type()); | |
| 10879 field.SetStaticValue(Array::empty_array(), true); | 10910 field.SetStaticValue(Array::empty_array(), true); |
| 10880 set_metadata_field(field); | 10911 set_metadata_field(field); |
| 10881 owner_class.AddField(field); | |
| 10882 } | 10912 } |
| 10883 | 10913 |
| 10884 | 10914 |
| 10885 RawObject* Namespace::GetMetadata() const { | 10915 RawObject* Namespace::GetMetadata() const { |
| 10886 Field& field = Field::Handle(metadata_field()); | 10916 Field& field = Field::Handle(metadata_field()); |
| 10887 if (field.IsNull()) { | 10917 if (field.IsNull()) { |
| 10888 // There is no metadata for this object. | 10918 // There is no metadata for this object. |
| 10889 return Object::empty_array().raw(); | 10919 return Object::empty_array().raw(); |
| 10890 } | 10920 } |
| 10891 Object& metadata = Object::Handle(); | 10921 Object& metadata = Object::Handle(); |
| 10892 metadata = field.StaticValue(); | 10922 metadata = field.StaticValue(); |
| 10893 if (field.StaticValue() == Object::empty_array().raw()) { | 10923 if (field.StaticValue() == Object::empty_array().raw()) { |
| 10894 metadata = Parser::ParseMetadata(Class::Handle(field.owner()), | 10924 metadata = Parser::ParseMetadata(field); |
| 10895 field.token_pos()); | |
| 10896 if (metadata.IsArray()) { | 10925 if (metadata.IsArray()) { |
| 10897 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); | 10926 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); |
| 10898 field.SetStaticValue(Array::Cast(metadata), true); | 10927 field.SetStaticValue(Array::Cast(metadata), true); |
| 10899 } | 10928 } |
| 10900 } | 10929 } |
| 10901 return metadata.raw(); | 10930 return metadata.raw(); |
| 10902 } | 10931 } |
| 10903 | 10932 |
| 10904 | 10933 |
| 10905 const char* Namespace::ToCString() const { | 10934 const char* Namespace::ToCString() const { |
| (...skipping 11001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 21907 return tag_label.ToCString(); | 21936 return tag_label.ToCString(); |
| 21908 } | 21937 } |
| 21909 | 21938 |
| 21910 | 21939 |
| 21911 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21940 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 21912 Instance::PrintJSONImpl(stream, ref); | 21941 Instance::PrintJSONImpl(stream, ref); |
| 21913 } | 21942 } |
| 21914 | 21943 |
| 21915 | 21944 |
| 21916 } // namespace dart | 21945 } // namespace dart |
| OLD | NEW |