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 5171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5182 "PatchClass for %s", cls_name); | 5182 "PatchClass for %s", cls_name); |
5183 } | 5183 } |
5184 | 5184 |
5185 | 5185 |
5186 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const { | 5186 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const { |
5187 Object::PrintJSONImpl(stream, ref); | 5187 Object::PrintJSONImpl(stream, ref); |
5188 } | 5188 } |
5189 | 5189 |
5190 | 5190 |
5191 RawPatchClass* PatchClass::New(const Class& patched_class, | 5191 RawPatchClass* PatchClass::New(const Class& patched_class, |
5192 const Class& source_class) { | 5192 const Class& origin_class) { |
5193 const PatchClass& result = PatchClass::Handle(PatchClass::New()); | 5193 const PatchClass& result = PatchClass::Handle(PatchClass::New()); |
5194 result.set_patched_class(patched_class); | 5194 result.set_patched_class(patched_class); |
5195 result.set_source_class(source_class); | 5195 result.set_origin_class(origin_class); |
| 5196 result.set_script(Script::Handle(origin_class.script())); |
5196 return result.raw(); | 5197 return result.raw(); |
5197 } | 5198 } |
5198 | 5199 |
| 5200 |
| 5201 RawPatchClass* PatchClass::New(const Class& patched_class, |
| 5202 const Script& script) { |
| 5203 const PatchClass& result = PatchClass::Handle(PatchClass::New()); |
| 5204 result.set_patched_class(patched_class); |
| 5205 result.set_origin_class(patched_class); |
| 5206 result.set_script(script); |
| 5207 return result.raw(); |
| 5208 } |
| 5209 |
5199 | 5210 |
5200 RawPatchClass* PatchClass::New() { | 5211 RawPatchClass* PatchClass::New() { |
5201 ASSERT(Object::patch_class_class() != Class::null()); | 5212 ASSERT(Object::patch_class_class() != Class::null()); |
5202 RawObject* raw = Object::Allocate(PatchClass::kClassId, | 5213 RawObject* raw = Object::Allocate(PatchClass::kClassId, |
5203 PatchClass::InstanceSize(), | 5214 PatchClass::InstanceSize(), |
5204 Heap::kOld); | 5215 Heap::kOld); |
5205 return reinterpret_cast<RawPatchClass*>(raw); | 5216 return reinterpret_cast<RawPatchClass*>(raw); |
5206 } | 5217 } |
5207 | 5218 |
5208 | 5219 |
5209 RawScript* PatchClass::Script() const { | |
5210 const Class& source_class = Class::Handle(this->source_class()); | |
5211 return source_class.script(); | |
5212 } | |
5213 | |
5214 | |
5215 void PatchClass::set_patched_class(const Class& value) const { | 5220 void PatchClass::set_patched_class(const Class& value) const { |
5216 StorePointer(&raw_ptr()->patched_class_, value.raw()); | 5221 StorePointer(&raw_ptr()->patched_class_, value.raw()); |
5217 } | 5222 } |
5218 | 5223 |
5219 | 5224 |
5220 void PatchClass::set_source_class(const Class& value) const { | 5225 void PatchClass::set_origin_class(const Class& value) const { |
5221 StorePointer(&raw_ptr()->source_class_, value.raw()); | 5226 StorePointer(&raw_ptr()->origin_class_, value.raw()); |
5222 } | 5227 } |
5223 | 5228 |
5224 | 5229 |
| 5230 void PatchClass::set_script(const Script& value) const { |
| 5231 StorePointer(&raw_ptr()->script_, value.raw()); |
| 5232 } |
| 5233 |
| 5234 |
5225 bool Function::HasBreakpoint() const { | 5235 bool Function::HasBreakpoint() const { |
5226 Thread* thread = Thread::Current(); | 5236 Thread* thread = Thread::Current(); |
5227 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()); | 5237 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()); |
5228 } | 5238 } |
5229 | 5239 |
5230 | 5240 |
5231 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const { | 5241 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const { |
5232 DEBUG_ASSERT(IsMutatorOrAtSafepoint()); | 5242 DEBUG_ASSERT(IsMutatorOrAtSafepoint()); |
5233 // We may not have previous code if 'always_optimize' is set. | 5243 // We may not have previous code if 'always_optimize' is set. |
5234 if (!is_osr && HasCode()) { | 5244 if (!is_osr && HasCode()) { |
(...skipping 1575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6810 return PatchClass::Cast(obj).patched_class(); | 6820 return PatchClass::Cast(obj).patched_class(); |
6811 } | 6821 } |
6812 | 6822 |
6813 | 6823 |
6814 RawClass* Function::origin() const { | 6824 RawClass* Function::origin() const { |
6815 const Object& obj = Object::Handle(raw_ptr()->owner_); | 6825 const Object& obj = Object::Handle(raw_ptr()->owner_); |
6816 if (obj.IsClass()) { | 6826 if (obj.IsClass()) { |
6817 return Class::Cast(obj).raw(); | 6827 return Class::Cast(obj).raw(); |
6818 } | 6828 } |
6819 ASSERT(obj.IsPatchClass()); | 6829 ASSERT(obj.IsPatchClass()); |
6820 return PatchClass::Cast(obj).source_class(); | 6830 return PatchClass::Cast(obj).origin_class(); |
6821 } | 6831 } |
6822 | 6832 |
6823 | 6833 |
6824 RawScript* Function::script() const { | 6834 RawScript* Function::script() const { |
6825 if (token_pos() == 0) { | 6835 if (token_pos() == 0) { |
6826 // Testing for position 0 is an optimization that relies on temporary | 6836 // Testing for position 0 is an optimization that relies on temporary |
6827 // eval functions having token position 0. | 6837 // eval functions having token position 0. |
6828 const Script& script = Script::Handle(eval_script()); | 6838 const Script& script = Script::Handle(eval_script()); |
6829 if (!script.IsNull()) { | 6839 if (!script.IsNull()) { |
6830 return script.raw(); | 6840 return script.raw(); |
6831 } | 6841 } |
6832 } | 6842 } |
6833 if (IsClosureFunction()) { | 6843 if (IsClosureFunction()) { |
6834 return Function::Handle(parent_function()).script(); | 6844 return Function::Handle(parent_function()).script(); |
6835 } | 6845 } |
6836 const Object& obj = Object::Handle(raw_ptr()->owner_); | 6846 const Object& obj = Object::Handle(raw_ptr()->owner_); |
6837 if (obj.IsClass()) { | 6847 if (obj.IsClass()) { |
6838 return Class::Cast(obj).script(); | 6848 return Class::Cast(obj).script(); |
6839 } | 6849 } |
6840 ASSERT(obj.IsPatchClass()); | 6850 ASSERT(obj.IsPatchClass()); |
6841 return PatchClass::Cast(obj).Script(); | 6851 return PatchClass::Cast(obj).script(); |
6842 } | 6852 } |
6843 | 6853 |
6844 | 6854 |
6845 bool Function::HasOptimizedCode() const { | 6855 bool Function::HasOptimizedCode() const { |
6846 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); | 6856 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); |
6847 } | 6857 } |
6848 | 6858 |
6849 | 6859 |
6850 RawString* Function::PrettyName() const { | 6860 RawString* Function::PrettyName() const { |
6851 const String& str = String::Handle(name()); | 6861 const String& str = String::Handle(name()); |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7383 return PatchClass::Cast(obj).patched_class(); | 7393 return PatchClass::Cast(obj).patched_class(); |
7384 } | 7394 } |
7385 | 7395 |
7386 | 7396 |
7387 RawClass* Field::origin() const { | 7397 RawClass* Field::origin() const { |
7388 const Object& obj = Object::Handle(raw_ptr()->owner_); | 7398 const Object& obj = Object::Handle(raw_ptr()->owner_); |
7389 if (obj.IsClass()) { | 7399 if (obj.IsClass()) { |
7390 return Class::Cast(obj).raw(); | 7400 return Class::Cast(obj).raw(); |
7391 } | 7401 } |
7392 ASSERT(obj.IsPatchClass()); | 7402 ASSERT(obj.IsPatchClass()); |
7393 return PatchClass::Cast(obj).source_class(); | 7403 return PatchClass::Cast(obj).origin_class(); |
7394 } | 7404 } |
7395 | 7405 |
7396 | 7406 |
| 7407 RawScript* Field::script() const { |
| 7408 const Object& obj = Object::Handle(raw_ptr()->owner_); |
| 7409 if (obj.IsClass()) { |
| 7410 return Class::Cast(obj).script(); |
| 7411 } |
| 7412 ASSERT(obj.IsPatchClass()); |
| 7413 return PatchClass::Cast(obj).script(); |
| 7414 } |
| 7415 |
| 7416 |
7397 // Called at finalization time | 7417 // Called at finalization time |
7398 void Field::SetFieldType(const AbstractType& value) const { | 7418 void Field::SetFieldType(const AbstractType& value) const { |
7399 ASSERT(Thread::Current()->IsMutatorThread()); | 7419 ASSERT(Thread::Current()->IsMutatorThread()); |
7400 ASSERT(!value.IsNull()); | 7420 ASSERT(!value.IsNull()); |
7401 if (value.raw() != type()) { | 7421 if (value.raw() != type()) { |
7402 StorePointer(&raw_ptr()->type_, value.raw()); | 7422 StorePointer(&raw_ptr()->type_, value.raw()); |
7403 } | 7423 } |
7404 } | 7424 } |
7405 | 7425 |
7406 | 7426 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7443 // Presently, we only attempt to remember the list length for final fields. | 7463 // Presently, we only attempt to remember the list length for final fields. |
7444 if (is_final && FLAG_use_field_guards) { | 7464 if (is_final && FLAG_use_field_guards) { |
7445 result.set_guarded_list_length(Field::kUnknownFixedLength); | 7465 result.set_guarded_list_length(Field::kUnknownFixedLength); |
7446 } else { | 7466 } else { |
7447 result.set_guarded_list_length(Field::kNoFixedLength); | 7467 result.set_guarded_list_length(Field::kNoFixedLength); |
7448 } | 7468 } |
7449 return result.raw(); | 7469 return result.raw(); |
7450 } | 7470 } |
7451 | 7471 |
7452 | 7472 |
| 7473 RawField* Field::NewTopLevel(const String& name, |
| 7474 bool is_final, |
| 7475 bool is_const, |
| 7476 const Object& owner, |
| 7477 intptr_t token_pos) { |
| 7478 ASSERT(!owner.IsNull()); |
| 7479 const Field& result = Field::Handle(Field::New()); |
| 7480 result.set_name(name); |
| 7481 result.set_is_static(true); |
| 7482 result.set_is_final(is_final); |
| 7483 result.set_is_const(is_const); |
| 7484 result.set_is_reflectable(true); |
| 7485 result.set_is_double_initialized(false); |
| 7486 result.set_owner(owner); |
| 7487 result.set_token_pos(token_pos); |
| 7488 result.set_has_initializer(false); |
| 7489 result.set_is_unboxing_candidate(true); |
| 7490 result.set_guarded_cid(FLAG_use_field_guards ? kIllegalCid : kDynamicCid); |
| 7491 result.set_is_nullable(FLAG_use_field_guards ? false : true); |
| 7492 result.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); |
| 7493 // Presently, we only attempt to remember the list length for final fields. |
| 7494 if (is_final && FLAG_use_field_guards) { |
| 7495 result.set_guarded_list_length(Field::kUnknownFixedLength); |
| 7496 } else { |
| 7497 result.set_guarded_list_length(Field::kNoFixedLength); |
| 7498 } |
| 7499 return result.raw(); |
| 7500 } |
| 7501 |
7453 | 7502 |
7454 RawField* Field::Clone(const Class& new_owner) const { | 7503 RawField* Field::Clone(const Class& new_owner) const { |
7455 Field& clone = Field::Handle(); | 7504 Field& clone = Field::Handle(); |
7456 clone ^= Object::Clone(*this, Heap::kOld); | 7505 clone ^= Object::Clone(*this, Heap::kOld); |
7457 const Class& owner = Class::Handle(this->owner()); | 7506 const Class& owner = Class::Handle(this->owner()); |
7458 const PatchClass& clone_owner = | 7507 const PatchClass& clone_owner = |
7459 PatchClass::Handle(PatchClass::New(new_owner, owner)); | 7508 PatchClass::Handle(PatchClass::New(new_owner, owner)); |
7460 clone.set_owner(clone_owner); | 7509 clone.set_owner(clone_owner); |
7461 if (!clone.is_static()) { | 7510 if (!clone.is_static()) { |
7462 clone.SetOffset(0); | 7511 clone.SetOffset(0); |
(...skipping 1649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9112 while (obj.IsNull() && HasNext()) { | 9161 while (obj.IsNull() && HasNext()) { |
9113 next_ix_++; | 9162 next_ix_++; |
9114 obj = array_.At(next_ix_); | 9163 obj = array_.At(next_ix_); |
9115 } | 9164 } |
9116 } | 9165 } |
9117 | 9166 |
9118 | 9167 |
9119 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library, | 9168 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library, |
9120 IterationKind kind) | 9169 IterationKind kind) |
9121 : DictionaryIterator(library), | 9170 : DictionaryIterator(library), |
9122 anon_array_((kind == kIteratePrivate) ? | 9171 toplevel_class_(Class::Handle( |
9123 Array::Handle(library.anonymous_classes()) : Object::empty_array()), | 9172 (kind == kIteratePrivate) |
9124 anon_size_((kind == kIteratePrivate) ? | 9173 ? library.toplevel_class() |
9125 library.num_anonymous_classes() : 0), | 9174 : Class::null())) { |
9126 anon_ix_(0) { | |
9127 MoveToNextClass(); | 9175 MoveToNextClass(); |
9128 } | 9176 } |
9129 | 9177 |
9130 | 9178 |
9131 RawClass* ClassDictionaryIterator::GetNextClass() { | 9179 RawClass* ClassDictionaryIterator::GetNextClass() { |
9132 ASSERT(HasNext()); | 9180 ASSERT(HasNext()); |
9133 Class& cls = Class::Handle(); | 9181 Class& cls = Class::Handle(); |
9134 if (next_ix_ < size_) { | 9182 if (next_ix_ < size_) { |
9135 int ix = next_ix_++; | 9183 int ix = next_ix_++; |
9136 cls ^= array_.At(ix); | 9184 cls ^= array_.At(ix); |
9137 MoveToNextClass(); | 9185 MoveToNextClass(); |
9138 return cls.raw(); | 9186 return cls.raw(); |
9139 } | 9187 } |
9140 ASSERT(anon_ix_ < anon_size_); | 9188 ASSERT(!toplevel_class_.IsNull()); |
9141 cls ^= anon_array_.At(anon_ix_++); | 9189 cls = toplevel_class_.raw(); |
| 9190 toplevel_class_ = Class::null(); |
9142 return cls.raw(); | 9191 return cls.raw(); |
9143 } | 9192 } |
9144 | 9193 |
9145 | 9194 |
9146 void ClassDictionaryIterator::MoveToNextClass() { | 9195 void ClassDictionaryIterator::MoveToNextClass() { |
9147 Object& obj = Object::Handle(); | 9196 Object& obj = Object::Handle(); |
9148 while (next_ix_ < size_) { | 9197 while (next_ix_ < size_) { |
9149 obj = array_.At(next_ix_); | 9198 obj = array_.At(next_ix_); |
9150 if (obj.IsClass()) { | 9199 if (obj.IsClass()) { |
9151 return; | 9200 return; |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9316 const String& cname = String::Handle( | 9365 const String& cname = String::Handle( |
9317 MakeClassMetaName(Class::Handle(param.parameterized_class()))); | 9366 MakeClassMetaName(Class::Handle(param.parameterized_class()))); |
9318 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); | 9367 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); |
9319 pieces.Add(cname); | 9368 pieces.Add(cname); |
9320 pieces.Add(Symbols::At()); | 9369 pieces.Add(Symbols::At()); |
9321 pieces.Add(String::Handle(param.name())); | 9370 pieces.Add(String::Handle(param.name())); |
9322 return Symbols::FromConcatAll(pieces); | 9371 return Symbols::FromConcatAll(pieces); |
9323 } | 9372 } |
9324 | 9373 |
9325 | 9374 |
9326 void Library::AddMetadata(const Class& cls, | 9375 void Library::AddMetadata(const Object& owner, |
9327 const String& name, | 9376 const String& name, |
9328 intptr_t token_pos) const { | 9377 intptr_t token_pos) const { |
9329 const String& metaname = String::Handle(Symbols::New(name)); | 9378 const String& metaname = String::Handle(Symbols::New(name)); |
9330 Field& field = Field::Handle(Field::New(metaname, | 9379 const Field& field = Field::Handle( |
9331 true, // is_static | 9380 Field::NewTopLevel(metaname, |
9332 false, // is_final | 9381 false, // is_final |
9333 false, // is_const | 9382 false, // is_const |
9334 false, // is_reflectable | 9383 owner, |
9335 cls, | 9384 token_pos)); |
9336 Object::dynamic_type(), | 9385 field.SetFieldType(Object::dynamic_type()); |
9337 token_pos)); | 9386 field.set_is_reflectable(false); |
9338 field.SetStaticValue(Array::empty_array(), true); | 9387 field.SetStaticValue(Array::empty_array(), true); |
9339 GrowableObjectArray& metadata = | 9388 GrowableObjectArray& metadata = |
9340 GrowableObjectArray::Handle(this->metadata()); | 9389 GrowableObjectArray::Handle(this->metadata()); |
9341 metadata.Add(field, Heap::kOld); | 9390 metadata.Add(field, Heap::kOld); |
9342 cls.AddField(field); | |
9343 } | 9391 } |
9344 | 9392 |
9345 | 9393 |
9346 void Library::AddClassMetadata(const Class& cls, | 9394 void Library::AddClassMetadata(const Class& cls, |
9347 const Class& toplevel_class, | 9395 const Object& tl_owner, |
9348 intptr_t token_pos) const { | 9396 intptr_t token_pos) const { |
9349 // We use the toplevel class as the owner of a class's metadata field because | 9397 // We use the toplevel class as the owner of a class's metadata field because |
9350 // a class's metadata is in scope of the library, not the class. | 9398 // a class's metadata is in scope of the library, not the class. |
9351 AddMetadata(toplevel_class, | 9399 AddMetadata(tl_owner, |
9352 String::Handle(MakeClassMetaName(cls)), | 9400 String::Handle(MakeClassMetaName(cls)), |
9353 token_pos); | 9401 token_pos); |
9354 } | 9402 } |
9355 | 9403 |
9356 | 9404 |
9357 void Library::AddFieldMetadata(const Field& field, | 9405 void Library::AddFieldMetadata(const Field& field, |
9358 intptr_t token_pos) const { | 9406 intptr_t token_pos) const { |
9359 AddMetadata(Class::Handle(field.origin()), | 9407 AddMetadata(Object::Handle(field.RawOwner()), |
9360 String::Handle(MakeFieldMetaName(field)), | 9408 String::Handle(MakeFieldMetaName(field)), |
9361 token_pos); | 9409 token_pos); |
9362 } | 9410 } |
9363 | 9411 |
9364 | 9412 |
9365 void Library::AddFunctionMetadata(const Function& func, | 9413 void Library::AddFunctionMetadata(const Function& func, |
9366 intptr_t token_pos) const { | 9414 intptr_t token_pos) const { |
9367 AddMetadata(Class::Handle(func.origin()), | 9415 AddMetadata(Object::Handle(func.RawOwner()), |
9368 String::Handle(MakeFunctionMetaName(func)), | 9416 String::Handle(MakeFunctionMetaName(func)), |
9369 token_pos); | 9417 token_pos); |
9370 } | 9418 } |
9371 | 9419 |
9372 | 9420 |
9373 void Library::AddTypeParameterMetadata(const TypeParameter& param, | 9421 void Library::AddTypeParameterMetadata(const TypeParameter& param, |
9374 intptr_t token_pos) const { | 9422 intptr_t token_pos) const { |
9375 AddMetadata(Class::Handle(param.parameterized_class()), | 9423 AddMetadata(Class::Handle(param.parameterized_class()), |
9376 String::Handle(MakeTypeParameterMetaName(param)), | 9424 String::Handle(MakeTypeParameterMetaName(param)), |
9377 token_pos); | 9425 token_pos); |
9378 } | 9426 } |
9379 | 9427 |
9380 | 9428 |
9381 void Library::AddLibraryMetadata(const Class& cls, intptr_t token_pos) const { | 9429 void Library::AddLibraryMetadata(const Object& tl_owner, |
9382 AddMetadata(cls, Symbols::TopLevel(), token_pos); | 9430 intptr_t token_pos) const { |
| 9431 AddMetadata(tl_owner, Symbols::TopLevel(), token_pos); |
9383 } | 9432 } |
9384 | 9433 |
9385 | 9434 |
9386 RawString* Library::MakeMetadataName(const Object& obj) const { | 9435 RawString* Library::MakeMetadataName(const Object& obj) const { |
9387 if (obj.IsClass()) { | 9436 if (obj.IsClass()) { |
9388 return MakeClassMetaName(Class::Cast(obj)); | 9437 return MakeClassMetaName(Class::Cast(obj)); |
9389 } else if (obj.IsField()) { | 9438 } else if (obj.IsField()) { |
9390 return MakeFieldMetaName(Field::Cast(obj)); | 9439 return MakeFieldMetaName(Field::Cast(obj)); |
9391 } else if (obj.IsFunction()) { | 9440 } else if (obj.IsFunction()) { |
9392 return MakeFunctionMetaName(Function::Cast(obj)); | 9441 return MakeFunctionMetaName(Function::Cast(obj)); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9424 } | 9473 } |
9425 const String& metaname = String::Handle(MakeMetadataName(obj)); | 9474 const String& metaname = String::Handle(MakeMetadataName(obj)); |
9426 Field& field = Field::Handle(GetMetadataField(metaname)); | 9475 Field& field = Field::Handle(GetMetadataField(metaname)); |
9427 if (field.IsNull()) { | 9476 if (field.IsNull()) { |
9428 // There is no metadata for this object. | 9477 // There is no metadata for this object. |
9429 return Object::empty_array().raw(); | 9478 return Object::empty_array().raw(); |
9430 } | 9479 } |
9431 Object& metadata = Object::Handle(); | 9480 Object& metadata = Object::Handle(); |
9432 metadata = field.StaticValue(); | 9481 metadata = field.StaticValue(); |
9433 if (field.StaticValue() == Object::empty_array().raw()) { | 9482 if (field.StaticValue() == Object::empty_array().raw()) { |
9434 metadata = Parser::ParseMetadata(Class::Handle(field.owner()), | 9483 metadata = Parser::ParseMetadata(field); |
9435 field.token_pos()); | |
9436 if (metadata.IsArray()) { | 9484 if (metadata.IsArray()) { |
9437 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); | 9485 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); |
9438 field.SetStaticValue(Array::Cast(metadata), true); | 9486 field.SetStaticValue(Array::Cast(metadata), true); |
9439 } | 9487 } |
9440 } | 9488 } |
9441 return metadata.raw(); | 9489 return metadata.raw(); |
9442 } | 9490 } |
9443 | 9491 |
9444 | 9492 |
9445 static bool ShouldBePrivate(const String& name) { | 9493 static bool ShouldBePrivate(const String& name) { |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9703 Class& cls = Class::Handle(); | 9751 Class& cls = Class::Handle(); |
9704 Script& owner_script = Script::Handle(); | 9752 Script& owner_script = Script::Handle(); |
9705 DictionaryIterator it(*this); | 9753 DictionaryIterator it(*this); |
9706 while (it.HasNext()) { | 9754 while (it.HasNext()) { |
9707 entry = it.GetNext(); | 9755 entry = it.GetNext(); |
9708 if (entry.IsClass()) { | 9756 if (entry.IsClass()) { |
9709 owner_script = Class::Cast(entry).script(); | 9757 owner_script = Class::Cast(entry).script(); |
9710 } else if (entry.IsFunction()) { | 9758 } else if (entry.IsFunction()) { |
9711 owner_script = Function::Cast(entry).script(); | 9759 owner_script = Function::Cast(entry).script(); |
9712 } else if (entry.IsField()) { | 9760 } else if (entry.IsField()) { |
9713 cls = Field::Cast(entry).owner(); | 9761 owner_script = Field::Cast(entry).script(); |
9714 owner_script = cls.script(); | |
9715 } else { | 9762 } else { |
9716 continue; | 9763 continue; |
9717 } | 9764 } |
9718 AddScriptIfUnique(scripts, owner_script); | 9765 AddScriptIfUnique(scripts, owner_script); |
9719 } | 9766 } |
9720 | 9767 |
9721 // Add all scripts from patch classes. | 9768 // Add all scripts from patch classes. |
9722 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes()); | 9769 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes()); |
9723 for (intptr_t i = 0; i < patches.Length(); i++) { | 9770 for (intptr_t i = 0; i < patches.Length(); i++) { |
9724 cls ^= patches.At(i); | 9771 cls ^= patches.At(i); |
9725 owner_script = cls.script(); | 9772 owner_script = cls.script(); |
9726 AddScriptIfUnique(scripts, owner_script); | 9773 AddScriptIfUnique(scripts, owner_script); |
9727 } | 9774 } |
9728 | 9775 |
9729 // Special case: Scripts that only contain external top-level functions are | 9776 cls ^= toplevel_class(); |
9730 // not included above, but can be referenced through a library's anonymous | 9777 if (!cls.IsNull()) { |
9731 // classes. Example: dart-core:identical.dart. | |
9732 Array& anon_classes = Array::Handle(anonymous_classes()); | |
9733 Function& func = Function::Handle(); | |
9734 Array& functions = Array::Handle(); | |
9735 for (intptr_t i = 0; i < anon_classes.Length(); i++) { | |
9736 cls ^= anon_classes.At(i); | |
9737 if (cls.IsNull()) continue; | |
9738 owner_script = cls.script(); | 9778 owner_script = cls.script(); |
9739 AddScriptIfUnique(scripts, owner_script); | 9779 AddScriptIfUnique(scripts, owner_script); |
9740 functions = cls.functions(); | 9780 // Special case: Scripts that only contain external top-level functions |
| 9781 // are not included above, but can be referenced through a library's |
| 9782 // anonymous classes. Example: dart-core:identical.dart. |
| 9783 Function& func = Function::Handle(); |
| 9784 Array& functions = Array::Handle(cls.functions()); |
9741 for (intptr_t j = 0; j < functions.Length(); j++) { | 9785 for (intptr_t j = 0; j < functions.Length(); j++) { |
9742 func ^= functions.At(j); | 9786 func ^= functions.At(j); |
9743 owner_script = func.script(); | 9787 if (func.is_external()) { |
9744 AddScriptIfUnique(scripts, owner_script); | 9788 owner_script = func.script(); |
| 9789 AddScriptIfUnique(scripts, owner_script); |
| 9790 } |
9745 } | 9791 } |
9746 } | 9792 } |
9747 | 9793 |
9748 // Create the array of scripts and cache it in loaded_scripts_. | 9794 // Create the array of scripts and cache it in loaded_scripts_. |
9749 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts)); | 9795 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts)); |
9750 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw()); | 9796 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw()); |
9751 } | 9797 } |
9752 return loaded_scripts(); | 9798 return loaded_scripts(); |
9753 } | 9799 } |
9754 | 9800 |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9952 | 9998 |
9953 RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const { | 9999 RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const { |
9954 const Object& obj = Object::Handle(LookupLocalObject(name)); | 10000 const Object& obj = Object::Handle(LookupLocalObject(name)); |
9955 if (obj.IsLibraryPrefix()) { | 10001 if (obj.IsLibraryPrefix()) { |
9956 return LibraryPrefix::Cast(obj).raw(); | 10002 return LibraryPrefix::Cast(obj).raw(); |
9957 } | 10003 } |
9958 return LibraryPrefix::null(); | 10004 return LibraryPrefix::null(); |
9959 } | 10005 } |
9960 | 10006 |
9961 | 10007 |
9962 void Library::AddAnonymousClass(const Class& cls) const { | 10008 void Library::set_toplevel_class(const Class& value) const { |
9963 intptr_t num_anonymous = this->raw_ptr()->num_anonymous_; | 10009 ASSERT(raw_ptr()->toplevel_class_ == Class::null()); |
9964 Array& anon_array = Array::Handle(this->raw_ptr()->anonymous_classes_); | 10010 StorePointer(&raw_ptr()->toplevel_class_, value.raw()); |
9965 if (num_anonymous == anon_array.Length()) { | |
9966 intptr_t new_len = (num_anonymous == 0) ? 4 : num_anonymous * 2; | |
9967 anon_array = Array::Grow(anon_array, new_len); | |
9968 StorePointer(&raw_ptr()->anonymous_classes_, anon_array.raw()); | |
9969 } | |
9970 anon_array.SetAt(num_anonymous, cls); | |
9971 num_anonymous++; | |
9972 StoreNonPointer(&raw_ptr()->num_anonymous_, num_anonymous); | |
9973 } | 10011 } |
9974 | 10012 |
9975 | 10013 |
9976 RawLibrary* Library::ImportLibraryAt(intptr_t index) const { | 10014 RawLibrary* Library::ImportLibraryAt(intptr_t index) const { |
9977 Namespace& import = Namespace::Handle(ImportAt(index)); | 10015 Namespace& import = Namespace::Handle(ImportAt(index)); |
9978 if (import.IsNull()) { | 10016 if (import.IsNull()) { |
9979 return Library::null(); | 10017 return Library::null(); |
9980 } | 10018 } |
9981 return import.library(); | 10019 return import.library(); |
9982 } | 10020 } |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10092 bool import_core_lib) { | 10130 bool import_core_lib) { |
10093 const Library& result = Library::Handle(Library::New()); | 10131 const Library& result = Library::Handle(Library::New()); |
10094 result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw()); | 10132 result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw()); |
10095 result.StorePointer(&result.raw_ptr()->url_, url.raw()); | 10133 result.StorePointer(&result.raw_ptr()->url_, url.raw()); |
10096 result.StorePointer(&result.raw_ptr()->resolved_names_, | 10134 result.StorePointer(&result.raw_ptr()->resolved_names_, |
10097 Object::empty_array().raw()); | 10135 Object::empty_array().raw()); |
10098 result.StorePointer(&result.raw_ptr()->dictionary_, | 10136 result.StorePointer(&result.raw_ptr()->dictionary_, |
10099 Object::empty_array().raw()); | 10137 Object::empty_array().raw()); |
10100 result.StorePointer(&result.raw_ptr()->metadata_, | 10138 result.StorePointer(&result.raw_ptr()->metadata_, |
10101 GrowableObjectArray::New(4, Heap::kOld)); | 10139 GrowableObjectArray::New(4, Heap::kOld)); |
10102 result.StorePointer(&result.raw_ptr()->anonymous_classes_, | 10140 result.StorePointer(&result.raw_ptr()->toplevel_class_, Class::null()); |
10103 Object::empty_array().raw()); | |
10104 result.StorePointer(&result.raw_ptr()->patch_classes_, | 10141 result.StorePointer(&result.raw_ptr()->patch_classes_, |
10105 GrowableObjectArray::New(Object::empty_array(), | 10142 GrowableObjectArray::New(Object::empty_array(), |
10106 Heap::kOld)); | 10143 Heap::kOld)); |
10107 result.StoreNonPointer(&result.raw_ptr()->num_anonymous_, 0); | |
10108 result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw()); | 10144 result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw()); |
10109 result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw()); | 10145 result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw()); |
10110 result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null()); | 10146 result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null()); |
10111 result.StorePointer(&result.raw_ptr()->load_error_, Instance::null()); | 10147 result.StorePointer(&result.raw_ptr()->load_error_, Instance::null()); |
10112 result.set_native_entry_resolver(NULL); | 10148 result.set_native_entry_resolver(NULL); |
10113 result.set_native_entry_symbol_resolver(NULL); | 10149 result.set_native_entry_symbol_resolver(NULL); |
10114 result.set_is_in_fullsnapshot(false); | 10150 result.set_is_in_fullsnapshot(false); |
10115 result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true); | 10151 result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true); |
10116 result.set_debuggable(false); | 10152 result.set_debuggable(false); |
10117 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme())); | 10153 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme())); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10152 // classes are coming from the VM isolate, and are shared between multiple | 10188 // classes are coming from the VM isolate, and are shared between multiple |
10153 // isolates so setting their library pointers would be wrong. | 10189 // isolates so setting their library pointers would be wrong. |
10154 const Class& cls = Class::Handle(Object::dynamic_class()); | 10190 const Class& cls = Class::Handle(Object::dynamic_class()); |
10155 core_lib.AddObject(cls, String::Handle(cls.Name())); | 10191 core_lib.AddObject(cls, String::Handle(cls.Name())); |
10156 } | 10192 } |
10157 | 10193 |
10158 | 10194 |
10159 RawObject* Library::Evaluate(const String& expr, | 10195 RawObject* Library::Evaluate(const String& expr, |
10160 const Array& param_names, | 10196 const Array& param_names, |
10161 const Array& param_values) const { | 10197 const Array& param_values) const { |
10162 // Take a top-level class and evaluate the expression | 10198 // Evaluate the expression as a static function of the toplevel class. |
10163 // as a static function of the class. | 10199 Class& top_level_class = Class::Handle(toplevel_class()); |
10164 Class& top_level_class = Class::Handle(); | |
10165 Array& top_level_classes = Array::Handle(anonymous_classes()); | |
10166 ASSERT(top_level_classes.Length() > 0); | |
10167 top_level_class ^= top_level_classes.At(0); | |
10168 ASSERT(top_level_class.is_finalized()); | 10200 ASSERT(top_level_class.is_finalized()); |
10169 return top_level_class.Evaluate(expr, param_names, param_values); | 10201 return top_level_class.Evaluate(expr, param_names, param_values); |
10170 } | 10202 } |
10171 | 10203 |
10172 | 10204 |
10173 void Library::InitNativeWrappersLibrary(Isolate* isolate) { | 10205 void Library::InitNativeWrappersLibrary(Isolate* isolate) { |
10174 static const int kNumNativeWrappersClasses = 4; | 10206 static const int kNumNativeWrappersClasses = 4; |
10175 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); | 10207 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); |
10176 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); | 10208 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); |
10177 const Library& native_flds_lib = Library::Handle( | 10209 const Library& native_flds_lib = Library::Handle( |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10822 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const { | 10854 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const { |
10823 Object::PrintJSONImpl(stream, ref); | 10855 Object::PrintJSONImpl(stream, ref); |
10824 } | 10856 } |
10825 | 10857 |
10826 | 10858 |
10827 void Namespace::set_metadata_field(const Field& value) const { | 10859 void Namespace::set_metadata_field(const Field& value) const { |
10828 StorePointer(&raw_ptr()->metadata_field_, value.raw()); | 10860 StorePointer(&raw_ptr()->metadata_field_, value.raw()); |
10829 } | 10861 } |
10830 | 10862 |
10831 | 10863 |
10832 void Namespace::AddMetadata(intptr_t token_pos, const Class& owner_class) { | 10864 void Namespace::AddMetadata(const Object& owner, intptr_t token_pos) { |
10833 ASSERT(Field::Handle(metadata_field()).IsNull()); | 10865 ASSERT(Field::Handle(metadata_field()).IsNull()); |
10834 Field& field = Field::Handle(Field::New(Symbols::TopLevel(), | 10866 Field& field = Field::Handle(Field::NewTopLevel(Symbols::TopLevel(), |
10835 true, // is_static | |
10836 false, // is_final | 10867 false, // is_final |
10837 false, // is_const | 10868 false, // is_const |
10838 false, // is_reflectable | 10869 owner, |
10839 owner_class, | |
10840 Object::dynamic_type(), | |
10841 token_pos)); | 10870 token_pos)); |
| 10871 field.set_is_reflectable(false); |
| 10872 field.SetFieldType(Object::dynamic_type()); |
10842 field.SetStaticValue(Array::empty_array(), true); | 10873 field.SetStaticValue(Array::empty_array(), true); |
10843 set_metadata_field(field); | 10874 set_metadata_field(field); |
10844 owner_class.AddField(field); | |
10845 } | 10875 } |
10846 | 10876 |
10847 | 10877 |
10848 RawObject* Namespace::GetMetadata() const { | 10878 RawObject* Namespace::GetMetadata() const { |
10849 Field& field = Field::Handle(metadata_field()); | 10879 Field& field = Field::Handle(metadata_field()); |
10850 if (field.IsNull()) { | 10880 if (field.IsNull()) { |
10851 // There is no metadata for this object. | 10881 // There is no metadata for this object. |
10852 return Object::empty_array().raw(); | 10882 return Object::empty_array().raw(); |
10853 } | 10883 } |
10854 Object& metadata = Object::Handle(); | 10884 Object& metadata = Object::Handle(); |
10855 metadata = field.StaticValue(); | 10885 metadata = field.StaticValue(); |
10856 if (field.StaticValue() == Object::empty_array().raw()) { | 10886 if (field.StaticValue() == Object::empty_array().raw()) { |
10857 metadata = Parser::ParseMetadata(Class::Handle(field.owner()), | 10887 metadata = Parser::ParseMetadata(field); |
10858 field.token_pos()); | |
10859 if (metadata.IsArray()) { | 10888 if (metadata.IsArray()) { |
10860 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); | 10889 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); |
10861 field.SetStaticValue(Array::Cast(metadata), true); | 10890 field.SetStaticValue(Array::Cast(metadata), true); |
10862 } | 10891 } |
10863 } | 10892 } |
10864 return metadata.raw(); | 10893 return metadata.raw(); |
10865 } | 10894 } |
10866 | 10895 |
10867 | 10896 |
10868 const char* Namespace::ToCString() const { | 10897 const char* Namespace::ToCString() const { |
(...skipping 11001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21870 return tag_label.ToCString(); | 21899 return tag_label.ToCString(); |
21871 } | 21900 } |
21872 | 21901 |
21873 | 21902 |
21874 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21903 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
21875 Instance::PrintJSONImpl(stream, ref); | 21904 Instance::PrintJSONImpl(stream, ref); |
21876 } | 21905 } |
21877 | 21906 |
21878 | 21907 |
21879 } // namespace dart | 21908 } // namespace dart |
OLD | NEW |