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