Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(44)

Side by Side Diff: runtime/vm/object.cc

Issue 1410383020: Eliminate all but one top-level class per library. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Cleanup Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« runtime/vm/object.h ('K') | « runtime/vm/object.h ('k') | runtime/vm/parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698