| 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 |