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 5229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5240 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const { | 5240 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const { |
5241 Object::PrintJSONImpl(stream, ref); | 5241 Object::PrintJSONImpl(stream, ref); |
5242 } | 5242 } |
5243 | 5243 |
5244 | 5244 |
5245 RawPatchClass* PatchClass::New(const Class& patched_class, | 5245 RawPatchClass* PatchClass::New(const Class& patched_class, |
5246 const Class& source_class) { | 5246 const Class& source_class) { |
5247 const PatchClass& result = PatchClass::Handle(PatchClass::New()); | 5247 const PatchClass& result = PatchClass::Handle(PatchClass::New()); |
5248 result.set_patched_class(patched_class); | 5248 result.set_patched_class(patched_class); |
5249 result.set_source_class(source_class); | 5249 result.set_source_class(source_class); |
| 5250 result.set_script(Script::Handle(source_class.script())); |
5250 return result.raw(); | 5251 return result.raw(); |
5251 } | 5252 } |
5252 | 5253 |
| 5254 |
| 5255 RawPatchClass* PatchClass::New(const Class& patched_class, |
| 5256 const Script& script) { |
| 5257 const PatchClass& result = PatchClass::Handle(PatchClass::New()); |
| 5258 result.set_patched_class(patched_class); |
| 5259 result.set_source_class(patched_class); |
| 5260 result.set_script(script); |
| 5261 return result.raw(); |
| 5262 } |
| 5263 |
5253 | 5264 |
5254 RawPatchClass* PatchClass::New() { | 5265 RawPatchClass* PatchClass::New() { |
5255 ASSERT(Object::patch_class_class() != Class::null()); | 5266 ASSERT(Object::patch_class_class() != Class::null()); |
5256 RawObject* raw = Object::Allocate(PatchClass::kClassId, | 5267 RawObject* raw = Object::Allocate(PatchClass::kClassId, |
5257 PatchClass::InstanceSize(), | 5268 PatchClass::InstanceSize(), |
5258 Heap::kOld); | 5269 Heap::kOld); |
5259 return reinterpret_cast<RawPatchClass*>(raw); | 5270 return reinterpret_cast<RawPatchClass*>(raw); |
5260 } | 5271 } |
5261 | 5272 |
5262 | 5273 |
5263 RawScript* PatchClass::Script() const { | |
5264 const Class& source_class = Class::Handle(this->source_class()); | |
5265 return source_class.script(); | |
5266 } | |
5267 | |
5268 | |
5269 void PatchClass::set_patched_class(const Class& value) const { | 5274 void PatchClass::set_patched_class(const Class& value) const { |
5270 StorePointer(&raw_ptr()->patched_class_, value.raw()); | 5275 StorePointer(&raw_ptr()->patched_class_, value.raw()); |
5271 } | 5276 } |
5272 | 5277 |
5273 | 5278 |
5274 void PatchClass::set_source_class(const Class& value) const { | 5279 void PatchClass::set_source_class(const Class& value) const { |
5275 StorePointer(&raw_ptr()->source_class_, value.raw()); | 5280 StorePointer(&raw_ptr()->source_class_, value.raw()); |
5276 } | 5281 } |
5277 | 5282 |
5278 | 5283 |
| 5284 void PatchClass::set_script(const Script& value) const { |
| 5285 StorePointer(&raw_ptr()->script_, value.raw()); |
| 5286 } |
| 5287 |
| 5288 |
5279 bool Function::HasBreakpoint() const { | 5289 bool Function::HasBreakpoint() const { |
5280 Thread* thread = Thread::Current(); | 5290 Thread* thread = Thread::Current(); |
5281 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()); | 5291 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()); |
5282 } | 5292 } |
5283 | 5293 |
5284 | 5294 |
5285 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const { | 5295 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const { |
5286 ASSERT(Thread::Current()->IsMutatorThread()); | 5296 ASSERT(Thread::Current()->IsMutatorThread()); |
5287 // We may not have previous code if 'always_optimize' is set. | 5297 // We may not have previous code if 'always_optimize' is set. |
5288 if (!is_osr && HasCode()) { | 5298 if (!is_osr && HasCode()) { |
(...skipping 1596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6885 } | 6895 } |
6886 } | 6896 } |
6887 if (IsClosureFunction()) { | 6897 if (IsClosureFunction()) { |
6888 return Function::Handle(parent_function()).script(); | 6898 return Function::Handle(parent_function()).script(); |
6889 } | 6899 } |
6890 const Object& obj = Object::Handle(raw_ptr()->owner_); | 6900 const Object& obj = Object::Handle(raw_ptr()->owner_); |
6891 if (obj.IsClass()) { | 6901 if (obj.IsClass()) { |
6892 return Class::Cast(obj).script(); | 6902 return Class::Cast(obj).script(); |
6893 } | 6903 } |
6894 ASSERT(obj.IsPatchClass()); | 6904 ASSERT(obj.IsPatchClass()); |
6895 return PatchClass::Cast(obj).Script(); | 6905 return PatchClass::Cast(obj).script(); |
6896 } | 6906 } |
6897 | 6907 |
6898 | 6908 |
6899 bool Function::HasOptimizedCode() const { | 6909 bool Function::HasOptimizedCode() const { |
6900 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); | 6910 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); |
6901 } | 6911 } |
6902 | 6912 |
6903 | 6913 |
6904 RawString* Function::PrettyName() const { | 6914 RawString* Function::PrettyName() const { |
6905 const String& str = String::Handle(name()); | 6915 const String& str = String::Handle(name()); |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7441 RawClass* Field::origin() const { | 7451 RawClass* Field::origin() const { |
7442 const Object& obj = Object::Handle(raw_ptr()->owner_); | 7452 const Object& obj = Object::Handle(raw_ptr()->owner_); |
7443 if (obj.IsClass()) { | 7453 if (obj.IsClass()) { |
7444 return Class::Cast(obj).raw(); | 7454 return Class::Cast(obj).raw(); |
7445 } | 7455 } |
7446 ASSERT(obj.IsPatchClass()); | 7456 ASSERT(obj.IsPatchClass()); |
7447 return PatchClass::Cast(obj).source_class(); | 7457 return PatchClass::Cast(obj).source_class(); |
7448 } | 7458 } |
7449 | 7459 |
7450 | 7460 |
| 7461 RawScript* Field::script() const { |
| 7462 const Object& obj = Object::Handle(raw_ptr()->owner_); |
| 7463 if (obj.IsClass()) { |
| 7464 return Class::Cast(obj).script(); |
| 7465 } |
| 7466 ASSERT(obj.IsPatchClass()); |
| 7467 return PatchClass::Cast(obj).script(); |
| 7468 } |
| 7469 |
| 7470 |
7451 // Called at finalization time | 7471 // Called at finalization time |
7452 void Field::SetFieldType(const AbstractType& value) const { | 7472 void Field::SetFieldType(const AbstractType& value) const { |
7453 ASSERT(Thread::Current()->IsMutatorThread()); | 7473 ASSERT(Thread::Current()->IsMutatorThread()); |
7454 ASSERT(!value.IsNull()); | 7474 ASSERT(!value.IsNull()); |
7455 if (value.raw() != type()) { | 7475 if (value.raw() != type()) { |
7456 StorePointer(&raw_ptr()->type_, value.raw()); | 7476 StorePointer(&raw_ptr()->type_, value.raw()); |
7457 } | 7477 } |
7458 } | 7478 } |
7459 | 7479 |
7460 | 7480 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7497 // Presently, we only attempt to remember the list length for final fields. | 7517 // Presently, we only attempt to remember the list length for final fields. |
7498 if (is_final && FLAG_use_field_guards) { | 7518 if (is_final && FLAG_use_field_guards) { |
7499 result.set_guarded_list_length(Field::kUnknownFixedLength); | 7519 result.set_guarded_list_length(Field::kUnknownFixedLength); |
7500 } else { | 7520 } else { |
7501 result.set_guarded_list_length(Field::kNoFixedLength); | 7521 result.set_guarded_list_length(Field::kNoFixedLength); |
7502 } | 7522 } |
7503 return result.raw(); | 7523 return result.raw(); |
7504 } | 7524 } |
7505 | 7525 |
7506 | 7526 |
| 7527 RawField* Field::NewTopLevel(const String& name, |
| 7528 bool is_final, |
| 7529 bool is_const, |
| 7530 const Object& owner, |
| 7531 intptr_t token_pos) { |
| 7532 ASSERT(!owner.IsNull()); |
| 7533 const Field& result = Field::Handle(Field::New()); |
| 7534 result.set_name(name); |
| 7535 result.set_is_static(true); |
| 7536 result.set_is_final(is_final); |
| 7537 result.set_is_const(is_const); |
| 7538 result.set_is_reflectable(true); |
| 7539 result.set_is_double_initialized(false); |
| 7540 result.set_owner(owner); |
| 7541 result.set_token_pos(token_pos); |
| 7542 result.set_has_initializer(false); |
| 7543 result.set_is_unboxing_candidate(true); |
| 7544 result.set_guarded_cid(FLAG_use_field_guards ? kIllegalCid : kDynamicCid); |
| 7545 result.set_is_nullable(FLAG_use_field_guards ? false : true); |
| 7546 result.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset); |
| 7547 // Presently, we only attempt to remember the list length for final fields. |
| 7548 if (is_final && FLAG_use_field_guards) { |
| 7549 result.set_guarded_list_length(Field::kUnknownFixedLength); |
| 7550 } else { |
| 7551 result.set_guarded_list_length(Field::kNoFixedLength); |
| 7552 } |
| 7553 return result.raw(); |
| 7554 } |
| 7555 |
7507 | 7556 |
7508 RawField* Field::Clone(const Class& new_owner) const { | 7557 RawField* Field::Clone(const Class& new_owner) const { |
7509 Field& clone = Field::Handle(); | 7558 Field& clone = Field::Handle(); |
7510 clone ^= Object::Clone(*this, Heap::kOld); | 7559 clone ^= Object::Clone(*this, Heap::kOld); |
7511 const Class& owner = Class::Handle(this->owner()); | 7560 const Class& owner = Class::Handle(this->owner()); |
7512 const PatchClass& clone_owner = | 7561 const PatchClass& clone_owner = |
7513 PatchClass::Handle(PatchClass::New(new_owner, owner)); | 7562 PatchClass::Handle(PatchClass::New(new_owner, owner)); |
7514 clone.set_owner(clone_owner); | 7563 clone.set_owner(clone_owner); |
7515 if (!clone.is_static()) { | 7564 if (!clone.is_static()) { |
7516 clone.SetOffset(0); | 7565 clone.SetOffset(0); |
(...skipping 1646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9163 while (obj.IsNull() && HasNext()) { | 9212 while (obj.IsNull() && HasNext()) { |
9164 next_ix_++; | 9213 next_ix_++; |
9165 obj = array_.At(next_ix_); | 9214 obj = array_.At(next_ix_); |
9166 } | 9215 } |
9167 } | 9216 } |
9168 | 9217 |
9169 | 9218 |
9170 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library, | 9219 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library, |
9171 IterationKind kind) | 9220 IterationKind kind) |
9172 : DictionaryIterator(library), | 9221 : DictionaryIterator(library), |
9173 anon_array_((kind == kIteratePrivate) ? | 9222 toplevel_class_(Class::Handle( |
9174 Array::Handle(library.anonymous_classes()) : Object::empty_array()), | 9223 (kind == kIteratePrivate) |
9175 anon_size_((kind == kIteratePrivate) ? | 9224 ? library.toplevel_class() |
9176 library.num_anonymous_classes() : 0), | 9225 : Class::null())) { |
9177 anon_ix_(0) { | |
9178 MoveToNextClass(); | 9226 MoveToNextClass(); |
9179 } | 9227 } |
9180 | 9228 |
9181 | 9229 |
9182 RawClass* ClassDictionaryIterator::GetNextClass() { | 9230 RawClass* ClassDictionaryIterator::GetNextClass() { |
9183 ASSERT(HasNext()); | 9231 ASSERT(HasNext()); |
9184 Class& cls = Class::Handle(); | 9232 Class& cls = Class::Handle(); |
9185 if (next_ix_ < size_) { | 9233 if (next_ix_ < size_) { |
9186 int ix = next_ix_++; | 9234 int ix = next_ix_++; |
9187 cls ^= array_.At(ix); | 9235 cls ^= array_.At(ix); |
9188 MoveToNextClass(); | 9236 MoveToNextClass(); |
9189 return cls.raw(); | 9237 return cls.raw(); |
9190 } | 9238 } |
9191 ASSERT(anon_ix_ < anon_size_); | 9239 ASSERT(!toplevel_class_.IsNull()); |
9192 cls ^= anon_array_.At(anon_ix_++); | 9240 cls = toplevel_class_.raw(); |
| 9241 toplevel_class_ = Class::null(); |
9193 return cls.raw(); | 9242 return cls.raw(); |
9194 } | 9243 } |
9195 | 9244 |
9196 | 9245 |
9197 void ClassDictionaryIterator::MoveToNextClass() { | 9246 void ClassDictionaryIterator::MoveToNextClass() { |
9198 Object& obj = Object::Handle(); | 9247 Object& obj = Object::Handle(); |
9199 while (next_ix_ < size_) { | 9248 while (next_ix_ < size_) { |
9200 obj = array_.At(next_ix_); | 9249 obj = array_.At(next_ix_); |
9201 if (obj.IsClass()) { | 9250 if (obj.IsClass()) { |
9202 return; | 9251 return; |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9367 const String& cname = String::Handle( | 9416 const String& cname = String::Handle( |
9368 MakeClassMetaName(Class::Handle(param.parameterized_class()))); | 9417 MakeClassMetaName(Class::Handle(param.parameterized_class()))); |
9369 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); | 9418 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); |
9370 pieces.Add(cname); | 9419 pieces.Add(cname); |
9371 pieces.Add(Symbols::At()); | 9420 pieces.Add(Symbols::At()); |
9372 pieces.Add(String::Handle(param.name())); | 9421 pieces.Add(String::Handle(param.name())); |
9373 return Symbols::FromConcatAll(pieces); | 9422 return Symbols::FromConcatAll(pieces); |
9374 } | 9423 } |
9375 | 9424 |
9376 | 9425 |
9377 void Library::AddMetadata(const Class& cls, | 9426 void Library::AddMetadata(const Object& owner, |
9378 const String& name, | 9427 const String& name, |
9379 intptr_t token_pos) const { | 9428 intptr_t token_pos) const { |
9380 const String& metaname = String::Handle(Symbols::New(name)); | 9429 const String& metaname = String::Handle(Symbols::New(name)); |
9381 Field& field = Field::Handle(Field::New(metaname, | 9430 Field& field = Field::Handle(); |
9382 true, // is_static | 9431 field = Field::NewTopLevel(metaname, |
9383 false, // is_final | 9432 false, // is_final |
9384 false, // is_const | 9433 false, // is_const |
9385 false, // is_reflectable | 9434 owner, |
9386 cls, | 9435 token_pos); |
9387 Object::dynamic_type(), | 9436 field.SetFieldType(Object::dynamic_type()); |
9388 token_pos)); | 9437 field.set_is_reflectable(false); |
9389 field.SetStaticValue(Array::empty_array(), true); | 9438 field.SetStaticValue(Array::empty_array(), true); |
9390 GrowableObjectArray& metadata = | 9439 GrowableObjectArray& metadata = |
9391 GrowableObjectArray::Handle(this->metadata()); | 9440 GrowableObjectArray::Handle(this->metadata()); |
9392 metadata.Add(field, Heap::kOld); | 9441 metadata.Add(field, Heap::kOld); |
9393 cls.AddField(field); | |
9394 } | 9442 } |
9395 | 9443 |
9396 | 9444 |
9397 void Library::AddClassMetadata(const Class& cls, | 9445 void Library::AddClassMetadata(const Class& cls, |
9398 const Class& toplevel_class, | 9446 const PatchClass& tl_owner, |
9399 intptr_t token_pos) const { | 9447 intptr_t token_pos) const { |
9400 // We use the toplevel class as the owner of a class's metadata field because | 9448 // We use the toplevel class as the owner of a class's metadata field because |
9401 // a class's metadata is in scope of the library, not the class. | 9449 // a class's metadata is in scope of the library, not the class. |
9402 AddMetadata(toplevel_class, | 9450 AddMetadata(tl_owner, |
9403 String::Handle(MakeClassMetaName(cls)), | 9451 String::Handle(MakeClassMetaName(cls)), |
9404 token_pos); | 9452 token_pos); |
9405 } | 9453 } |
9406 | 9454 |
9407 | 9455 |
9408 void Library::AddFieldMetadata(const Field& field, | 9456 void Library::AddFieldMetadata(const Field& field, |
9409 intptr_t token_pos) const { | 9457 intptr_t token_pos) const { |
9410 AddMetadata(Class::Handle(field.origin()), | 9458 AddMetadata(Object::Handle(field.RawOwner()), |
9411 String::Handle(MakeFieldMetaName(field)), | 9459 String::Handle(MakeFieldMetaName(field)), |
9412 token_pos); | 9460 token_pos); |
9413 } | 9461 } |
9414 | 9462 |
9415 | 9463 |
9416 void Library::AddFunctionMetadata(const Function& func, | 9464 void Library::AddFunctionMetadata(const Function& func, |
9417 intptr_t token_pos) const { | 9465 intptr_t token_pos) const { |
9418 AddMetadata(Class::Handle(func.origin()), | 9466 AddMetadata(Object::Handle(func.RawOwner()), |
9419 String::Handle(MakeFunctionMetaName(func)), | 9467 String::Handle(MakeFunctionMetaName(func)), |
9420 token_pos); | 9468 token_pos); |
9421 } | 9469 } |
9422 | 9470 |
9423 | 9471 |
9424 void Library::AddTypeParameterMetadata(const TypeParameter& param, | 9472 void Library::AddTypeParameterMetadata(const TypeParameter& param, |
9425 intptr_t token_pos) const { | 9473 intptr_t token_pos) const { |
9426 AddMetadata(Class::Handle(param.parameterized_class()), | 9474 AddMetadata(Class::Handle(param.parameterized_class()), |
9427 String::Handle(MakeTypeParameterMetaName(param)), | 9475 String::Handle(MakeTypeParameterMetaName(param)), |
9428 token_pos); | 9476 token_pos); |
9429 } | 9477 } |
9430 | 9478 |
9431 | 9479 |
9432 void Library::AddLibraryMetadata(const Class& cls, intptr_t token_pos) const { | 9480 void Library::AddLibraryMetadata(const PatchClass& tl_owner, |
9433 AddMetadata(cls, Symbols::TopLevel(), token_pos); | 9481 intptr_t token_pos) const { |
| 9482 AddMetadata(tl_owner, Symbols::TopLevel(), token_pos); |
9434 } | 9483 } |
9435 | 9484 |
9436 | 9485 |
9437 RawString* Library::MakeMetadataName(const Object& obj) const { | 9486 RawString* Library::MakeMetadataName(const Object& obj) const { |
9438 if (obj.IsClass()) { | 9487 if (obj.IsClass()) { |
9439 return MakeClassMetaName(Class::Cast(obj)); | 9488 return MakeClassMetaName(Class::Cast(obj)); |
9440 } else if (obj.IsField()) { | 9489 } else if (obj.IsField()) { |
9441 return MakeFieldMetaName(Field::Cast(obj)); | 9490 return MakeFieldMetaName(Field::Cast(obj)); |
9442 } else if (obj.IsFunction()) { | 9491 } else if (obj.IsFunction()) { |
9443 return MakeFunctionMetaName(Function::Cast(obj)); | 9492 return MakeFunctionMetaName(Function::Cast(obj)); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9475 } | 9524 } |
9476 const String& metaname = String::Handle(MakeMetadataName(obj)); | 9525 const String& metaname = String::Handle(MakeMetadataName(obj)); |
9477 Field& field = Field::Handle(GetMetadataField(metaname)); | 9526 Field& field = Field::Handle(GetMetadataField(metaname)); |
9478 if (field.IsNull()) { | 9527 if (field.IsNull()) { |
9479 // There is no metadata for this object. | 9528 // There is no metadata for this object. |
9480 return Object::empty_array().raw(); | 9529 return Object::empty_array().raw(); |
9481 } | 9530 } |
9482 Object& metadata = Object::Handle(); | 9531 Object& metadata = Object::Handle(); |
9483 metadata = field.StaticValue(); | 9532 metadata = field.StaticValue(); |
9484 if (field.StaticValue() == Object::empty_array().raw()) { | 9533 if (field.StaticValue() == Object::empty_array().raw()) { |
9485 metadata = Parser::ParseMetadata(Class::Handle(field.owner()), | 9534 metadata = Parser::ParseMetadata(field); |
9486 field.token_pos()); | |
9487 if (metadata.IsArray()) { | 9535 if (metadata.IsArray()) { |
9488 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); | 9536 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); |
9489 field.SetStaticValue(Array::Cast(metadata), true); | 9537 field.SetStaticValue(Array::Cast(metadata), true); |
9490 } | 9538 } |
9491 } | 9539 } |
9492 return metadata.raw(); | 9540 return metadata.raw(); |
9493 } | 9541 } |
9494 | 9542 |
9495 | 9543 |
9496 static bool ShouldBePrivate(const String& name) { | 9544 static bool ShouldBePrivate(const String& name) { |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9754 Class& cls = Class::Handle(); | 9802 Class& cls = Class::Handle(); |
9755 Script& owner_script = Script::Handle(); | 9803 Script& owner_script = Script::Handle(); |
9756 DictionaryIterator it(*this); | 9804 DictionaryIterator it(*this); |
9757 while (it.HasNext()) { | 9805 while (it.HasNext()) { |
9758 entry = it.GetNext(); | 9806 entry = it.GetNext(); |
9759 if (entry.IsClass()) { | 9807 if (entry.IsClass()) { |
9760 owner_script = Class::Cast(entry).script(); | 9808 owner_script = Class::Cast(entry).script(); |
9761 } else if (entry.IsFunction()) { | 9809 } else if (entry.IsFunction()) { |
9762 owner_script = Function::Cast(entry).script(); | 9810 owner_script = Function::Cast(entry).script(); |
9763 } else if (entry.IsField()) { | 9811 } else if (entry.IsField()) { |
9764 cls = Field::Cast(entry).owner(); | 9812 owner_script = Field::Cast(entry).script(); |
9765 owner_script = cls.script(); | |
9766 } else { | 9813 } else { |
9767 continue; | 9814 continue; |
9768 } | 9815 } |
9769 AddScriptIfUnique(scripts, owner_script); | 9816 AddScriptIfUnique(scripts, owner_script); |
9770 } | 9817 } |
9771 | 9818 |
9772 // Add all scripts from patch classes. | 9819 // Add all scripts from patch classes. |
9773 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes()); | 9820 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes()); |
9774 for (intptr_t i = 0; i < patches.Length(); i++) { | 9821 for (intptr_t i = 0; i < patches.Length(); i++) { |
9775 cls ^= patches.At(i); | 9822 cls ^= patches.At(i); |
9776 owner_script = cls.script(); | 9823 owner_script = cls.script(); |
9777 AddScriptIfUnique(scripts, owner_script); | 9824 AddScriptIfUnique(scripts, owner_script); |
9778 } | 9825 } |
9779 | 9826 |
9780 // Special case: Scripts that only contain external top-level functions are | 9827 cls ^= toplevel_class(); |
9781 // not included above, but can be referenced through a library's anonymous | 9828 if (!cls.IsNull()) { |
9782 // classes. Example: dart-core:identical.dart. | |
9783 Array& anon_classes = Array::Handle(anonymous_classes()); | |
9784 Function& func = Function::Handle(); | |
9785 Array& functions = Array::Handle(); | |
9786 for (intptr_t i = 0; i < anon_classes.Length(); i++) { | |
9787 cls ^= anon_classes.At(i); | |
9788 if (cls.IsNull()) continue; | |
9789 owner_script = cls.script(); | 9829 owner_script = cls.script(); |
9790 AddScriptIfUnique(scripts, owner_script); | 9830 AddScriptIfUnique(scripts, owner_script); |
9791 functions = cls.functions(); | 9831 // Special case: Scripts that only contain external top-level functions |
| 9832 // are not included above, but can be referenced through a library's |
| 9833 // anonymous classes. Example: dart-core:identical.dart. |
| 9834 Function& func = Function::Handle(); |
| 9835 Array& functions = Array::Handle(cls.functions()); |
9792 for (intptr_t j = 0; j < functions.Length(); j++) { | 9836 for (intptr_t j = 0; j < functions.Length(); j++) { |
9793 func ^= functions.At(j); | 9837 func ^= functions.At(j); |
9794 owner_script = func.script(); | 9838 if (func.is_external()) { |
9795 AddScriptIfUnique(scripts, owner_script); | 9839 owner_script = func.script(); |
| 9840 AddScriptIfUnique(scripts, owner_script); |
| 9841 } |
9796 } | 9842 } |
9797 } | 9843 } |
9798 | 9844 |
9799 // Create the array of scripts and cache it in loaded_scripts_. | 9845 // Create the array of scripts and cache it in loaded_scripts_. |
9800 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts)); | 9846 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts)); |
9801 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw()); | 9847 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw()); |
9802 } | 9848 } |
9803 return loaded_scripts(); | 9849 return loaded_scripts(); |
9804 } | 9850 } |
9805 | 9851 |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10003 | 10049 |
10004 RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const { | 10050 RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const { |
10005 const Object& obj = Object::Handle(LookupLocalObject(name)); | 10051 const Object& obj = Object::Handle(LookupLocalObject(name)); |
10006 if (obj.IsLibraryPrefix()) { | 10052 if (obj.IsLibraryPrefix()) { |
10007 return LibraryPrefix::Cast(obj).raw(); | 10053 return LibraryPrefix::Cast(obj).raw(); |
10008 } | 10054 } |
10009 return LibraryPrefix::null(); | 10055 return LibraryPrefix::null(); |
10010 } | 10056 } |
10011 | 10057 |
10012 | 10058 |
10013 void Library::AddAnonymousClass(const Class& cls) const { | 10059 void Library::set_toplevel_class(const Class& value) const { |
10014 intptr_t num_anonymous = this->raw_ptr()->num_anonymous_; | 10060 ASSERT(raw_ptr()->toplevel_class_ == Class::null()); |
10015 Array& anon_array = Array::Handle(this->raw_ptr()->anonymous_classes_); | 10061 StorePointer(&raw_ptr()->toplevel_class_, value.raw()); |
10016 if (num_anonymous == anon_array.Length()) { | |
10017 intptr_t new_len = (num_anonymous == 0) ? 4 : num_anonymous * 2; | |
10018 anon_array = Array::Grow(anon_array, new_len); | |
10019 StorePointer(&raw_ptr()->anonymous_classes_, anon_array.raw()); | |
10020 } | |
10021 anon_array.SetAt(num_anonymous, cls); | |
10022 num_anonymous++; | |
10023 StoreNonPointer(&raw_ptr()->num_anonymous_, num_anonymous); | |
10024 } | 10062 } |
10025 | 10063 |
10026 | 10064 |
10027 RawLibrary* Library::ImportLibraryAt(intptr_t index) const { | 10065 RawLibrary* Library::ImportLibraryAt(intptr_t index) const { |
10028 Namespace& import = Namespace::Handle(ImportAt(index)); | 10066 Namespace& import = Namespace::Handle(ImportAt(index)); |
10029 if (import.IsNull()) { | 10067 if (import.IsNull()) { |
10030 return Library::null(); | 10068 return Library::null(); |
10031 } | 10069 } |
10032 return import.library(); | 10070 return import.library(); |
10033 } | 10071 } |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10143 bool import_core_lib) { | 10181 bool import_core_lib) { |
10144 const Library& result = Library::Handle(Library::New()); | 10182 const Library& result = Library::Handle(Library::New()); |
10145 result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw()); | 10183 result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw()); |
10146 result.StorePointer(&result.raw_ptr()->url_, url.raw()); | 10184 result.StorePointer(&result.raw_ptr()->url_, url.raw()); |
10147 result.StorePointer(&result.raw_ptr()->resolved_names_, | 10185 result.StorePointer(&result.raw_ptr()->resolved_names_, |
10148 Object::empty_array().raw()); | 10186 Object::empty_array().raw()); |
10149 result.StorePointer(&result.raw_ptr()->dictionary_, | 10187 result.StorePointer(&result.raw_ptr()->dictionary_, |
10150 Object::empty_array().raw()); | 10188 Object::empty_array().raw()); |
10151 result.StorePointer(&result.raw_ptr()->metadata_, | 10189 result.StorePointer(&result.raw_ptr()->metadata_, |
10152 GrowableObjectArray::New(4, Heap::kOld)); | 10190 GrowableObjectArray::New(4, Heap::kOld)); |
10153 result.StorePointer(&result.raw_ptr()->anonymous_classes_, | 10191 result.StorePointer(&result.raw_ptr()->toplevel_class_, Class::null()); |
10154 Object::empty_array().raw()); | |
10155 result.StorePointer(&result.raw_ptr()->patch_classes_, | 10192 result.StorePointer(&result.raw_ptr()->patch_classes_, |
10156 GrowableObjectArray::New(Object::empty_array(), | 10193 GrowableObjectArray::New(Object::empty_array(), |
10157 Heap::kOld)); | 10194 Heap::kOld)); |
10158 result.StoreNonPointer(&result.raw_ptr()->num_anonymous_, 0); | |
10159 result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw()); | 10195 result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw()); |
10160 result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw()); | 10196 result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw()); |
10161 result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null()); | 10197 result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null()); |
10162 result.StorePointer(&result.raw_ptr()->load_error_, Instance::null()); | 10198 result.StorePointer(&result.raw_ptr()->load_error_, Instance::null()); |
10163 result.set_native_entry_resolver(NULL); | 10199 result.set_native_entry_resolver(NULL); |
10164 result.set_native_entry_symbol_resolver(NULL); | 10200 result.set_native_entry_symbol_resolver(NULL); |
10165 result.set_is_in_fullsnapshot(false); | 10201 result.set_is_in_fullsnapshot(false); |
10166 result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true); | 10202 result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true); |
10167 result.set_debuggable(false); | 10203 result.set_debuggable(false); |
10168 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme())); | 10204 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme())); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10203 // classes are coming from the VM isolate, and are shared between multiple | 10239 // classes are coming from the VM isolate, and are shared between multiple |
10204 // isolates so setting their library pointers would be wrong. | 10240 // isolates so setting their library pointers would be wrong. |
10205 const Class& cls = Class::Handle(Object::dynamic_class()); | 10241 const Class& cls = Class::Handle(Object::dynamic_class()); |
10206 core_lib.AddObject(cls, String::Handle(cls.Name())); | 10242 core_lib.AddObject(cls, String::Handle(cls.Name())); |
10207 } | 10243 } |
10208 | 10244 |
10209 | 10245 |
10210 RawObject* Library::Evaluate(const String& expr, | 10246 RawObject* Library::Evaluate(const String& expr, |
10211 const Array& param_names, | 10247 const Array& param_names, |
10212 const Array& param_values) const { | 10248 const Array& param_values) const { |
10213 // Take a top-level class and evaluate the expression | 10249 // Evaluate the expression as a static function of the toplevel class. |
10214 // as a static function of the class. | 10250 Class& top_level_class = Class::Handle(toplevel_class()); |
10215 Class& top_level_class = Class::Handle(); | |
10216 Array& top_level_classes = Array::Handle(anonymous_classes()); | |
10217 ASSERT(top_level_classes.Length() > 0); | |
10218 top_level_class ^= top_level_classes.At(0); | |
10219 ASSERT(top_level_class.is_finalized()); | 10251 ASSERT(top_level_class.is_finalized()); |
10220 return top_level_class.Evaluate(expr, param_names, param_values); | 10252 return top_level_class.Evaluate(expr, param_names, param_values); |
10221 } | 10253 } |
10222 | 10254 |
10223 | 10255 |
10224 void Library::InitNativeWrappersLibrary(Isolate* isolate) { | 10256 void Library::InitNativeWrappersLibrary(Isolate* isolate) { |
10225 static const int kNumNativeWrappersClasses = 4; | 10257 static const int kNumNativeWrappersClasses = 4; |
10226 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); | 10258 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); |
10227 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); | 10259 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); |
10228 const Library& native_flds_lib = Library::Handle( | 10260 const Library& native_flds_lib = Library::Handle( |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10873 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const { | 10905 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const { |
10874 Object::PrintJSONImpl(stream, ref); | 10906 Object::PrintJSONImpl(stream, ref); |
10875 } | 10907 } |
10876 | 10908 |
10877 | 10909 |
10878 void Namespace::set_metadata_field(const Field& value) const { | 10910 void Namespace::set_metadata_field(const Field& value) const { |
10879 StorePointer(&raw_ptr()->metadata_field_, value.raw()); | 10911 StorePointer(&raw_ptr()->metadata_field_, value.raw()); |
10880 } | 10912 } |
10881 | 10913 |
10882 | 10914 |
10883 void Namespace::AddMetadata(intptr_t token_pos, const Class& owner_class) { | 10915 void Namespace::AddMetadata(const PatchClass& owner, intptr_t token_pos) { |
10884 ASSERT(Field::Handle(metadata_field()).IsNull()); | 10916 ASSERT(Field::Handle(metadata_field()).IsNull()); |
10885 Field& field = Field::Handle(Field::New(Symbols::TopLevel(), | 10917 Field& field = Field::Handle(Field::NewTopLevel(Symbols::TopLevel(), |
10886 true, // is_static | |
10887 false, // is_final | 10918 false, // is_final |
10888 false, // is_const | 10919 false, // is_const |
10889 false, // is_reflectable | 10920 owner, |
10890 owner_class, | |
10891 Object::dynamic_type(), | |
10892 token_pos)); | 10921 token_pos)); |
| 10922 field.set_is_reflectable(false); |
| 10923 field.SetFieldType(Object::dynamic_type()); |
10893 field.SetStaticValue(Array::empty_array(), true); | 10924 field.SetStaticValue(Array::empty_array(), true); |
10894 set_metadata_field(field); | 10925 set_metadata_field(field); |
10895 owner_class.AddField(field); | |
10896 } | 10926 } |
10897 | 10927 |
10898 | 10928 |
10899 RawObject* Namespace::GetMetadata() const { | 10929 RawObject* Namespace::GetMetadata() const { |
10900 Field& field = Field::Handle(metadata_field()); | 10930 Field& field = Field::Handle(metadata_field()); |
10901 if (field.IsNull()) { | 10931 if (field.IsNull()) { |
10902 // There is no metadata for this object. | 10932 // There is no metadata for this object. |
10903 return Object::empty_array().raw(); | 10933 return Object::empty_array().raw(); |
10904 } | 10934 } |
10905 Object& metadata = Object::Handle(); | 10935 Object& metadata = Object::Handle(); |
10906 metadata = field.StaticValue(); | 10936 metadata = field.StaticValue(); |
10907 if (field.StaticValue() == Object::empty_array().raw()) { | 10937 if (field.StaticValue() == Object::empty_array().raw()) { |
10908 metadata = Parser::ParseMetadata(Class::Handle(field.owner()), | 10938 metadata = Parser::ParseMetadata(field); |
10909 field.token_pos()); | |
10910 if (metadata.IsArray()) { | 10939 if (metadata.IsArray()) { |
10911 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); | 10940 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); |
10912 field.SetStaticValue(Array::Cast(metadata), true); | 10941 field.SetStaticValue(Array::Cast(metadata), true); |
10913 } | 10942 } |
10914 } | 10943 } |
10915 return metadata.raw(); | 10944 return metadata.raw(); |
10916 } | 10945 } |
10917 | 10946 |
10918 | 10947 |
10919 const char* Namespace::ToCString() const { | 10948 const char* Namespace::ToCString() const { |
(...skipping 10975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21895 return tag_label.ToCString(); | 21924 return tag_label.ToCString(); |
21896 } | 21925 } |
21897 | 21926 |
21898 | 21927 |
21899 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21928 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
21900 Instance::PrintJSONImpl(stream, ref); | 21929 Instance::PrintJSONImpl(stream, ref); |
21901 } | 21930 } |
21902 | 21931 |
21903 | 21932 |
21904 } // namespace dart | 21933 } // namespace dart |
OLD | NEW |