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

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: Address review comments 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 5211 matching lines...) Expand 10 before | Expand all | Expand 10 after
5222 "PatchClass for %s", cls_name); 5222 "PatchClass for %s", cls_name);
5223 } 5223 }
5224 5224
5225 5225
5226 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const { 5226 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const {
5227 Object::PrintJSONImpl(stream, ref); 5227 Object::PrintJSONImpl(stream, ref);
5228 } 5228 }
5229 5229
5230 5230
5231 RawPatchClass* PatchClass::New(const Class& patched_class, 5231 RawPatchClass* PatchClass::New(const Class& patched_class,
5232 const Class& source_class) { 5232 const Class& origin_class) {
5233 const PatchClass& result = PatchClass::Handle(PatchClass::New()); 5233 const PatchClass& result = PatchClass::Handle(PatchClass::New());
5234 result.set_patched_class(patched_class); 5234 result.set_patched_class(patched_class);
5235 result.set_source_class(source_class); 5235 result.set_origin_class(origin_class);
5236 result.set_script(Script::Handle(origin_class.script()));
5236 return result.raw(); 5237 return result.raw();
5237 } 5238 }
5238 5239
5240
5241 RawPatchClass* PatchClass::New(const Class& patched_class,
5242 const Script& script) {
5243 const PatchClass& result = PatchClass::Handle(PatchClass::New());
5244 result.set_patched_class(patched_class);
5245 result.set_origin_class(patched_class);
5246 result.set_script(script);
5247 return result.raw();
5248 }
5249
5239 5250
5240 RawPatchClass* PatchClass::New() { 5251 RawPatchClass* PatchClass::New() {
5241 ASSERT(Object::patch_class_class() != Class::null()); 5252 ASSERT(Object::patch_class_class() != Class::null());
5242 RawObject* raw = Object::Allocate(PatchClass::kClassId, 5253 RawObject* raw = Object::Allocate(PatchClass::kClassId,
5243 PatchClass::InstanceSize(), 5254 PatchClass::InstanceSize(),
5244 Heap::kOld); 5255 Heap::kOld);
5245 return reinterpret_cast<RawPatchClass*>(raw); 5256 return reinterpret_cast<RawPatchClass*>(raw);
5246 } 5257 }
5247 5258
5248 5259
5249 RawScript* PatchClass::Script() const {
5250 const Class& source_class = Class::Handle(this->source_class());
5251 return source_class.script();
5252 }
5253
5254
5255 void PatchClass::set_patched_class(const Class& value) const { 5260 void PatchClass::set_patched_class(const Class& value) const {
5256 StorePointer(&raw_ptr()->patched_class_, value.raw()); 5261 StorePointer(&raw_ptr()->patched_class_, value.raw());
5257 } 5262 }
5258 5263
5259 5264
5260 void PatchClass::set_source_class(const Class& value) const { 5265 void PatchClass::set_origin_class(const Class& value) const {
5261 StorePointer(&raw_ptr()->source_class_, value.raw()); 5266 StorePointer(&raw_ptr()->origin_class_, value.raw());
5262 } 5267 }
5263 5268
5264 5269
5270 void PatchClass::set_script(const Script& value) const {
5271 StorePointer(&raw_ptr()->script_, value.raw());
5272 }
5273
5274
5265 bool Function::HasBreakpoint() const { 5275 bool Function::HasBreakpoint() const {
5266 Thread* thread = Thread::Current(); 5276 Thread* thread = Thread::Current();
5267 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()); 5277 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone());
5268 } 5278 }
5269 5279
5270 5280
5271 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const { 5281 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const {
5272 DEBUG_ASSERT(IsMutatorOrAtSafepoint()); 5282 DEBUG_ASSERT(IsMutatorOrAtSafepoint());
5273 // We may not have previous code if 'always_optimize' is set. 5283 // We may not have previous code if 'always_optimize' is set.
5274 if (!is_osr && HasCode()) { 5284 if (!is_osr && HasCode()) {
(...skipping 1575 matching lines...) Expand 10 before | Expand all | Expand 10 after
6850 return PatchClass::Cast(obj).patched_class(); 6860 return PatchClass::Cast(obj).patched_class();
6851 } 6861 }
6852 6862
6853 6863
6854 RawClass* Function::origin() const { 6864 RawClass* Function::origin() const {
6855 const Object& obj = Object::Handle(raw_ptr()->owner_); 6865 const Object& obj = Object::Handle(raw_ptr()->owner_);
6856 if (obj.IsClass()) { 6866 if (obj.IsClass()) {
6857 return Class::Cast(obj).raw(); 6867 return Class::Cast(obj).raw();
6858 } 6868 }
6859 ASSERT(obj.IsPatchClass()); 6869 ASSERT(obj.IsPatchClass());
6860 return PatchClass::Cast(obj).source_class(); 6870 return PatchClass::Cast(obj).origin_class();
6861 } 6871 }
6862 6872
6863 6873
6864 RawScript* Function::script() const { 6874 RawScript* Function::script() const {
6865 if (token_pos() == 0) { 6875 if (token_pos() == 0) {
6866 // Testing for position 0 is an optimization that relies on temporary 6876 // Testing for position 0 is an optimization that relies on temporary
6867 // eval functions having token position 0. 6877 // eval functions having token position 0.
6868 const Script& script = Script::Handle(eval_script()); 6878 const Script& script = Script::Handle(eval_script());
6869 if (!script.IsNull()) { 6879 if (!script.IsNull()) {
6870 return script.raw(); 6880 return script.raw();
6871 } 6881 }
6872 } 6882 }
6873 if (IsClosureFunction()) { 6883 if (IsClosureFunction()) {
6874 return Function::Handle(parent_function()).script(); 6884 return Function::Handle(parent_function()).script();
6875 } 6885 }
6876 const Object& obj = Object::Handle(raw_ptr()->owner_); 6886 const Object& obj = Object::Handle(raw_ptr()->owner_);
6877 if (obj.IsClass()) { 6887 if (obj.IsClass()) {
6878 return Class::Cast(obj).script(); 6888 return Class::Cast(obj).script();
6879 } 6889 }
6880 ASSERT(obj.IsPatchClass()); 6890 ASSERT(obj.IsPatchClass());
6881 return PatchClass::Cast(obj).Script(); 6891 return PatchClass::Cast(obj).script();
6882 } 6892 }
6883 6893
6884 6894
6885 bool Function::HasOptimizedCode() const { 6895 bool Function::HasOptimizedCode() const {
6886 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); 6896 return HasCode() && Code::Handle(CurrentCode()).is_optimized();
6887 } 6897 }
6888 6898
6889 6899
6890 RawString* Function::PrettyName() const { 6900 RawString* Function::PrettyName() const {
6891 const String& str = String::Handle(name()); 6901 const String& str = String::Handle(name());
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
7423 return PatchClass::Cast(obj).patched_class(); 7433 return PatchClass::Cast(obj).patched_class();
7424 } 7434 }
7425 7435
7426 7436
7427 RawClass* Field::origin() const { 7437 RawClass* Field::origin() const {
7428 const Object& obj = Object::Handle(raw_ptr()->owner_); 7438 const Object& obj = Object::Handle(raw_ptr()->owner_);
7429 if (obj.IsClass()) { 7439 if (obj.IsClass()) {
7430 return Class::Cast(obj).raw(); 7440 return Class::Cast(obj).raw();
7431 } 7441 }
7432 ASSERT(obj.IsPatchClass()); 7442 ASSERT(obj.IsPatchClass());
7433 return PatchClass::Cast(obj).source_class(); 7443 return PatchClass::Cast(obj).origin_class();
7434 } 7444 }
7435 7445
7436 7446
7447 RawScript* Field::script() const {
7448 const Object& obj = Object::Handle(raw_ptr()->owner_);
7449 if (obj.IsClass()) {
7450 return Class::Cast(obj).script();
7451 }
7452 ASSERT(obj.IsPatchClass());
7453 return PatchClass::Cast(obj).script();
7454 }
7455
7456
7437 // Called at finalization time 7457 // Called at finalization time
7438 void Field::SetFieldType(const AbstractType& value) const { 7458 void Field::SetFieldType(const AbstractType& value) const {
7439 ASSERT(Thread::Current()->IsMutatorThread()); 7459 ASSERT(Thread::Current()->IsMutatorThread());
7440 ASSERT(!value.IsNull()); 7460 ASSERT(!value.IsNull());
7441 if (value.raw() != type()) { 7461 if (value.raw() != type()) {
7442 StorePointer(&raw_ptr()->type_, value.raw()); 7462 StorePointer(&raw_ptr()->type_, value.raw());
7443 } 7463 }
7444 } 7464 }
7445 7465
7446 7466
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
7483 // Presently, we only attempt to remember the list length for final fields. 7503 // Presently, we only attempt to remember the list length for final fields.
7484 if (is_final && FLAG_use_field_guards) { 7504 if (is_final && FLAG_use_field_guards) {
7485 result.set_guarded_list_length(Field::kUnknownFixedLength); 7505 result.set_guarded_list_length(Field::kUnknownFixedLength);
7486 } else { 7506 } else {
7487 result.set_guarded_list_length(Field::kNoFixedLength); 7507 result.set_guarded_list_length(Field::kNoFixedLength);
7488 } 7508 }
7489 return result.raw(); 7509 return result.raw();
7490 } 7510 }
7491 7511
7492 7512
7513 RawField* Field::NewTopLevel(const String& name,
7514 bool is_final,
7515 bool is_const,
7516 const Object& owner,
7517 intptr_t token_pos) {
7518 ASSERT(!owner.IsNull());
7519 const Field& result = Field::Handle(Field::New());
7520 result.set_name(name);
7521 result.set_is_static(true);
7522 result.set_is_final(is_final);
7523 result.set_is_const(is_const);
7524 result.set_is_reflectable(true);
7525 result.set_is_double_initialized(false);
7526 result.set_owner(owner);
7527 result.set_token_pos(token_pos);
7528 result.set_has_initializer(false);
7529 result.set_is_unboxing_candidate(true);
7530 result.set_guarded_cid(FLAG_use_field_guards ? kIllegalCid : kDynamicCid);
7531 result.set_is_nullable(FLAG_use_field_guards ? false : true);
7532 result.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset);
7533 // Presently, we only attempt to remember the list length for final fields.
7534 if (is_final && FLAG_use_field_guards) {
7535 result.set_guarded_list_length(Field::kUnknownFixedLength);
7536 } else {
7537 result.set_guarded_list_length(Field::kNoFixedLength);
7538 }
7539 return result.raw();
7540 }
7541
7493 7542
7494 RawField* Field::Clone(const Class& new_owner) const { 7543 RawField* Field::Clone(const Class& new_owner) const {
7495 Field& clone = Field::Handle(); 7544 Field& clone = Field::Handle();
7496 clone ^= Object::Clone(*this, Heap::kOld); 7545 clone ^= Object::Clone(*this, Heap::kOld);
7497 const Class& owner = Class::Handle(this->owner()); 7546 const Class& owner = Class::Handle(this->owner());
7498 const PatchClass& clone_owner = 7547 const PatchClass& clone_owner =
7499 PatchClass::Handle(PatchClass::New(new_owner, owner)); 7548 PatchClass::Handle(PatchClass::New(new_owner, owner));
7500 clone.set_owner(clone_owner); 7549 clone.set_owner(clone_owner);
7501 if (!clone.is_static()) { 7550 if (!clone.is_static()) {
7502 clone.SetOffset(0); 7551 clone.SetOffset(0);
(...skipping 1646 matching lines...) Expand 10 before | Expand all | Expand 10 after
9149 while (obj.IsNull() && HasNext()) { 9198 while (obj.IsNull() && HasNext()) {
9150 next_ix_++; 9199 next_ix_++;
9151 obj = array_.At(next_ix_); 9200 obj = array_.At(next_ix_);
9152 } 9201 }
9153 } 9202 }
9154 9203
9155 9204
9156 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library, 9205 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library,
9157 IterationKind kind) 9206 IterationKind kind)
9158 : DictionaryIterator(library), 9207 : DictionaryIterator(library),
9159 anon_array_((kind == kIteratePrivate) ? 9208 toplevel_class_(Class::Handle(
9160 Array::Handle(library.anonymous_classes()) : Object::empty_array()), 9209 (kind == kIteratePrivate)
9161 anon_size_((kind == kIteratePrivate) ? 9210 ? library.toplevel_class()
9162 library.num_anonymous_classes() : 0), 9211 : Class::null())) {
9163 anon_ix_(0) {
9164 MoveToNextClass(); 9212 MoveToNextClass();
9165 } 9213 }
9166 9214
9167 9215
9168 RawClass* ClassDictionaryIterator::GetNextClass() { 9216 RawClass* ClassDictionaryIterator::GetNextClass() {
9169 ASSERT(HasNext()); 9217 ASSERT(HasNext());
9170 Class& cls = Class::Handle(); 9218 Class& cls = Class::Handle();
9171 if (next_ix_ < size_) { 9219 if (next_ix_ < size_) {
9172 int ix = next_ix_++; 9220 int ix = next_ix_++;
9173 cls ^= array_.At(ix); 9221 cls ^= array_.At(ix);
9174 MoveToNextClass(); 9222 MoveToNextClass();
9175 return cls.raw(); 9223 return cls.raw();
9176 } 9224 }
9177 ASSERT(anon_ix_ < anon_size_); 9225 ASSERT(!toplevel_class_.IsNull());
9178 cls ^= anon_array_.At(anon_ix_++); 9226 cls = toplevel_class_.raw();
9227 toplevel_class_ = Class::null();
9179 return cls.raw(); 9228 return cls.raw();
9180 } 9229 }
9181 9230
9182 9231
9183 void ClassDictionaryIterator::MoveToNextClass() { 9232 void ClassDictionaryIterator::MoveToNextClass() {
9184 Object& obj = Object::Handle(); 9233 Object& obj = Object::Handle();
9185 while (next_ix_ < size_) { 9234 while (next_ix_ < size_) {
9186 obj = array_.At(next_ix_); 9235 obj = array_.At(next_ix_);
9187 if (obj.IsClass()) { 9236 if (obj.IsClass()) {
9188 return; 9237 return;
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
9353 const String& cname = String::Handle( 9402 const String& cname = String::Handle(
9354 MakeClassMetaName(Class::Handle(param.parameterized_class()))); 9403 MakeClassMetaName(Class::Handle(param.parameterized_class())));
9355 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); 9404 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3);
9356 pieces.Add(cname); 9405 pieces.Add(cname);
9357 pieces.Add(Symbols::At()); 9406 pieces.Add(Symbols::At());
9358 pieces.Add(String::Handle(param.name())); 9407 pieces.Add(String::Handle(param.name()));
9359 return Symbols::FromConcatAll(pieces); 9408 return Symbols::FromConcatAll(pieces);
9360 } 9409 }
9361 9410
9362 9411
9363 void Library::AddMetadata(const Class& cls, 9412 void Library::AddMetadata(const Object& owner,
9364 const String& name, 9413 const String& name,
9365 intptr_t token_pos) const { 9414 intptr_t token_pos) const {
9366 const String& metaname = String::Handle(Symbols::New(name)); 9415 const String& metaname = String::Handle(Symbols::New(name));
9367 Field& field = Field::Handle(Field::New(metaname, 9416 Field& field = Field::Handle();
9368 true, // is_static 9417 field = Field::NewTopLevel(metaname,
Ivan Posva 2015/11/30 23:54:26 "= Field::Handle(Field::NewTopLevel(...)" so that
hausner 2015/12/01 19:38:17 Done.
9369 false, // is_final 9418 false, // is_final
9370 false, // is_const 9419 false, // is_const
9371 false, // is_reflectable 9420 owner,
9372 cls, 9421 token_pos);
9373 Object::dynamic_type(), 9422 field.SetFieldType(Object::dynamic_type());
9374 token_pos)); 9423 field.set_is_reflectable(false);
9375 field.SetStaticValue(Array::empty_array(), true); 9424 field.SetStaticValue(Array::empty_array(), true);
9376 GrowableObjectArray& metadata = 9425 GrowableObjectArray& metadata =
9377 GrowableObjectArray::Handle(this->metadata()); 9426 GrowableObjectArray::Handle(this->metadata());
9378 metadata.Add(field, Heap::kOld); 9427 metadata.Add(field, Heap::kOld);
9379 cls.AddField(field);
9380 } 9428 }
9381 9429
9382 9430
9383 void Library::AddClassMetadata(const Class& cls, 9431 void Library::AddClassMetadata(const Class& cls,
9384 const Class& toplevel_class, 9432 const PatchClass& tl_owner,
9385 intptr_t token_pos) const { 9433 intptr_t token_pos) const {
9386 // We use the toplevel class as the owner of a class's metadata field because 9434 // We use the toplevel class as the owner of a class's metadata field because
9387 // a class's metadata is in scope of the library, not the class. 9435 // a class's metadata is in scope of the library, not the class.
9388 AddMetadata(toplevel_class, 9436 AddMetadata(tl_owner,
9389 String::Handle(MakeClassMetaName(cls)), 9437 String::Handle(MakeClassMetaName(cls)),
9390 token_pos); 9438 token_pos);
9391 } 9439 }
9392 9440
9393 9441
9394 void Library::AddFieldMetadata(const Field& field, 9442 void Library::AddFieldMetadata(const Field& field,
9395 intptr_t token_pos) const { 9443 intptr_t token_pos) const {
9396 AddMetadata(Class::Handle(field.origin()), 9444 AddMetadata(Object::Handle(field.RawOwner()),
9397 String::Handle(MakeFieldMetaName(field)), 9445 String::Handle(MakeFieldMetaName(field)),
9398 token_pos); 9446 token_pos);
9399 } 9447 }
9400 9448
9401 9449
9402 void Library::AddFunctionMetadata(const Function& func, 9450 void Library::AddFunctionMetadata(const Function& func,
9403 intptr_t token_pos) const { 9451 intptr_t token_pos) const {
9404 AddMetadata(Class::Handle(func.origin()), 9452 AddMetadata(Object::Handle(func.RawOwner()),
9405 String::Handle(MakeFunctionMetaName(func)), 9453 String::Handle(MakeFunctionMetaName(func)),
9406 token_pos); 9454 token_pos);
9407 } 9455 }
9408 9456
9409 9457
9410 void Library::AddTypeParameterMetadata(const TypeParameter& param, 9458 void Library::AddTypeParameterMetadata(const TypeParameter& param,
9411 intptr_t token_pos) const { 9459 intptr_t token_pos) const {
9412 AddMetadata(Class::Handle(param.parameterized_class()), 9460 AddMetadata(Class::Handle(param.parameterized_class()),
9413 String::Handle(MakeTypeParameterMetaName(param)), 9461 String::Handle(MakeTypeParameterMetaName(param)),
9414 token_pos); 9462 token_pos);
9415 } 9463 }
9416 9464
9417 9465
9418 void Library::AddLibraryMetadata(const Class& cls, intptr_t token_pos) const { 9466 void Library::AddLibraryMetadata(const PatchClass& tl_owner,
9419 AddMetadata(cls, Symbols::TopLevel(), token_pos); 9467 intptr_t token_pos) const {
9468 AddMetadata(tl_owner, Symbols::TopLevel(), token_pos);
9420 } 9469 }
9421 9470
9422 9471
9423 RawString* Library::MakeMetadataName(const Object& obj) const { 9472 RawString* Library::MakeMetadataName(const Object& obj) const {
9424 if (obj.IsClass()) { 9473 if (obj.IsClass()) {
9425 return MakeClassMetaName(Class::Cast(obj)); 9474 return MakeClassMetaName(Class::Cast(obj));
9426 } else if (obj.IsField()) { 9475 } else if (obj.IsField()) {
9427 return MakeFieldMetaName(Field::Cast(obj)); 9476 return MakeFieldMetaName(Field::Cast(obj));
9428 } else if (obj.IsFunction()) { 9477 } else if (obj.IsFunction()) {
9429 return MakeFunctionMetaName(Function::Cast(obj)); 9478 return MakeFunctionMetaName(Function::Cast(obj));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
9461 } 9510 }
9462 const String& metaname = String::Handle(MakeMetadataName(obj)); 9511 const String& metaname = String::Handle(MakeMetadataName(obj));
9463 Field& field = Field::Handle(GetMetadataField(metaname)); 9512 Field& field = Field::Handle(GetMetadataField(metaname));
9464 if (field.IsNull()) { 9513 if (field.IsNull()) {
9465 // There is no metadata for this object. 9514 // There is no metadata for this object.
9466 return Object::empty_array().raw(); 9515 return Object::empty_array().raw();
9467 } 9516 }
9468 Object& metadata = Object::Handle(); 9517 Object& metadata = Object::Handle();
9469 metadata = field.StaticValue(); 9518 metadata = field.StaticValue();
9470 if (field.StaticValue() == Object::empty_array().raw()) { 9519 if (field.StaticValue() == Object::empty_array().raw()) {
9471 metadata = Parser::ParseMetadata(Class::Handle(field.owner()), 9520 metadata = Parser::ParseMetadata(field);
9472 field.token_pos());
9473 if (metadata.IsArray()) { 9521 if (metadata.IsArray()) {
9474 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); 9522 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw());
9475 field.SetStaticValue(Array::Cast(metadata), true); 9523 field.SetStaticValue(Array::Cast(metadata), true);
9476 } 9524 }
9477 } 9525 }
9478 return metadata.raw(); 9526 return metadata.raw();
9479 } 9527 }
9480 9528
9481 9529
9482 static bool ShouldBePrivate(const String& name) { 9530 static bool ShouldBePrivate(const String& name) {
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
9740 Class& cls = Class::Handle(); 9788 Class& cls = Class::Handle();
9741 Script& owner_script = Script::Handle(); 9789 Script& owner_script = Script::Handle();
9742 DictionaryIterator it(*this); 9790 DictionaryIterator it(*this);
9743 while (it.HasNext()) { 9791 while (it.HasNext()) {
9744 entry = it.GetNext(); 9792 entry = it.GetNext();
9745 if (entry.IsClass()) { 9793 if (entry.IsClass()) {
9746 owner_script = Class::Cast(entry).script(); 9794 owner_script = Class::Cast(entry).script();
9747 } else if (entry.IsFunction()) { 9795 } else if (entry.IsFunction()) {
9748 owner_script = Function::Cast(entry).script(); 9796 owner_script = Function::Cast(entry).script();
9749 } else if (entry.IsField()) { 9797 } else if (entry.IsField()) {
9750 cls = Field::Cast(entry).owner(); 9798 owner_script = Field::Cast(entry).script();
9751 owner_script = cls.script();
9752 } else { 9799 } else {
9753 continue; 9800 continue;
9754 } 9801 }
9755 AddScriptIfUnique(scripts, owner_script); 9802 AddScriptIfUnique(scripts, owner_script);
9756 } 9803 }
9757 9804
9758 // Add all scripts from patch classes. 9805 // Add all scripts from patch classes.
9759 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes()); 9806 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes());
9760 for (intptr_t i = 0; i < patches.Length(); i++) { 9807 for (intptr_t i = 0; i < patches.Length(); i++) {
9761 cls ^= patches.At(i); 9808 cls ^= patches.At(i);
9762 owner_script = cls.script(); 9809 owner_script = cls.script();
9763 AddScriptIfUnique(scripts, owner_script); 9810 AddScriptIfUnique(scripts, owner_script);
9764 } 9811 }
9765 9812
9766 // Special case: Scripts that only contain external top-level functions are 9813 cls ^= toplevel_class();
9767 // not included above, but can be referenced through a library's anonymous 9814 if (!cls.IsNull()) {
9768 // classes. Example: dart-core:identical.dart.
9769 Array& anon_classes = Array::Handle(anonymous_classes());
9770 Function& func = Function::Handle();
9771 Array& functions = Array::Handle();
9772 for (intptr_t i = 0; i < anon_classes.Length(); i++) {
9773 cls ^= anon_classes.At(i);
9774 if (cls.IsNull()) continue;
9775 owner_script = cls.script(); 9815 owner_script = cls.script();
9776 AddScriptIfUnique(scripts, owner_script); 9816 AddScriptIfUnique(scripts, owner_script);
9777 functions = cls.functions(); 9817 // Special case: Scripts that only contain external top-level functions
9818 // are not included above, but can be referenced through a library's
9819 // anonymous classes. Example: dart-core:identical.dart.
9820 Function& func = Function::Handle();
9821 Array& functions = Array::Handle(cls.functions());
9778 for (intptr_t j = 0; j < functions.Length(); j++) { 9822 for (intptr_t j = 0; j < functions.Length(); j++) {
9779 func ^= functions.At(j); 9823 func ^= functions.At(j);
9780 owner_script = func.script(); 9824 if (func.is_external()) {
9781 AddScriptIfUnique(scripts, owner_script); 9825 owner_script = func.script();
9826 AddScriptIfUnique(scripts, owner_script);
9827 }
9782 } 9828 }
9783 } 9829 }
9784 9830
9785 // Create the array of scripts and cache it in loaded_scripts_. 9831 // Create the array of scripts and cache it in loaded_scripts_.
9786 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts)); 9832 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts));
9787 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw()); 9833 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw());
9788 } 9834 }
9789 return loaded_scripts(); 9835 return loaded_scripts();
9790 } 9836 }
9791 9837
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
9989 10035
9990 RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const { 10036 RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const {
9991 const Object& obj = Object::Handle(LookupLocalObject(name)); 10037 const Object& obj = Object::Handle(LookupLocalObject(name));
9992 if (obj.IsLibraryPrefix()) { 10038 if (obj.IsLibraryPrefix()) {
9993 return LibraryPrefix::Cast(obj).raw(); 10039 return LibraryPrefix::Cast(obj).raw();
9994 } 10040 }
9995 return LibraryPrefix::null(); 10041 return LibraryPrefix::null();
9996 } 10042 }
9997 10043
9998 10044
9999 void Library::AddAnonymousClass(const Class& cls) const { 10045 void Library::set_toplevel_class(const Class& value) const {
10000 intptr_t num_anonymous = this->raw_ptr()->num_anonymous_; 10046 ASSERT(raw_ptr()->toplevel_class_ == Class::null());
10001 Array& anon_array = Array::Handle(this->raw_ptr()->anonymous_classes_); 10047 StorePointer(&raw_ptr()->toplevel_class_, value.raw());
10002 if (num_anonymous == anon_array.Length()) {
10003 intptr_t new_len = (num_anonymous == 0) ? 4 : num_anonymous * 2;
10004 anon_array = Array::Grow(anon_array, new_len);
10005 StorePointer(&raw_ptr()->anonymous_classes_, anon_array.raw());
10006 }
10007 anon_array.SetAt(num_anonymous, cls);
10008 num_anonymous++;
10009 StoreNonPointer(&raw_ptr()->num_anonymous_, num_anonymous);
10010 } 10048 }
10011 10049
10012 10050
10013 RawLibrary* Library::ImportLibraryAt(intptr_t index) const { 10051 RawLibrary* Library::ImportLibraryAt(intptr_t index) const {
10014 Namespace& import = Namespace::Handle(ImportAt(index)); 10052 Namespace& import = Namespace::Handle(ImportAt(index));
10015 if (import.IsNull()) { 10053 if (import.IsNull()) {
10016 return Library::null(); 10054 return Library::null();
10017 } 10055 }
10018 return import.library(); 10056 return import.library();
10019 } 10057 }
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
10129 bool import_core_lib) { 10167 bool import_core_lib) {
10130 const Library& result = Library::Handle(Library::New()); 10168 const Library& result = Library::Handle(Library::New());
10131 result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw()); 10169 result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw());
10132 result.StorePointer(&result.raw_ptr()->url_, url.raw()); 10170 result.StorePointer(&result.raw_ptr()->url_, url.raw());
10133 result.StorePointer(&result.raw_ptr()->resolved_names_, 10171 result.StorePointer(&result.raw_ptr()->resolved_names_,
10134 Object::empty_array().raw()); 10172 Object::empty_array().raw());
10135 result.StorePointer(&result.raw_ptr()->dictionary_, 10173 result.StorePointer(&result.raw_ptr()->dictionary_,
10136 Object::empty_array().raw()); 10174 Object::empty_array().raw());
10137 result.StorePointer(&result.raw_ptr()->metadata_, 10175 result.StorePointer(&result.raw_ptr()->metadata_,
10138 GrowableObjectArray::New(4, Heap::kOld)); 10176 GrowableObjectArray::New(4, Heap::kOld));
10139 result.StorePointer(&result.raw_ptr()->anonymous_classes_, 10177 result.StorePointer(&result.raw_ptr()->toplevel_class_, Class::null());
10140 Object::empty_array().raw());
10141 result.StorePointer(&result.raw_ptr()->patch_classes_, 10178 result.StorePointer(&result.raw_ptr()->patch_classes_,
10142 GrowableObjectArray::New(Object::empty_array(), 10179 GrowableObjectArray::New(Object::empty_array(),
10143 Heap::kOld)); 10180 Heap::kOld));
10144 result.StoreNonPointer(&result.raw_ptr()->num_anonymous_, 0);
10145 result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw()); 10181 result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw());
10146 result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw()); 10182 result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw());
10147 result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null()); 10183 result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null());
10148 result.StorePointer(&result.raw_ptr()->load_error_, Instance::null()); 10184 result.StorePointer(&result.raw_ptr()->load_error_, Instance::null());
10149 result.set_native_entry_resolver(NULL); 10185 result.set_native_entry_resolver(NULL);
10150 result.set_native_entry_symbol_resolver(NULL); 10186 result.set_native_entry_symbol_resolver(NULL);
10151 result.set_is_in_fullsnapshot(false); 10187 result.set_is_in_fullsnapshot(false);
10152 result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true); 10188 result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true);
10153 result.set_debuggable(false); 10189 result.set_debuggable(false);
10154 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme())); 10190 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme()));
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
10189 // classes are coming from the VM isolate, and are shared between multiple 10225 // classes are coming from the VM isolate, and are shared between multiple
10190 // isolates so setting their library pointers would be wrong. 10226 // isolates so setting their library pointers would be wrong.
10191 const Class& cls = Class::Handle(Object::dynamic_class()); 10227 const Class& cls = Class::Handle(Object::dynamic_class());
10192 core_lib.AddObject(cls, String::Handle(cls.Name())); 10228 core_lib.AddObject(cls, String::Handle(cls.Name()));
10193 } 10229 }
10194 10230
10195 10231
10196 RawObject* Library::Evaluate(const String& expr, 10232 RawObject* Library::Evaluate(const String& expr,
10197 const Array& param_names, 10233 const Array& param_names,
10198 const Array& param_values) const { 10234 const Array& param_values) const {
10199 // Take a top-level class and evaluate the expression 10235 // Evaluate the expression as a static function of the toplevel class.
10200 // as a static function of the class. 10236 Class& top_level_class = Class::Handle(toplevel_class());
10201 Class& top_level_class = Class::Handle();
10202 Array& top_level_classes = Array::Handle(anonymous_classes());
10203 ASSERT(top_level_classes.Length() > 0);
10204 top_level_class ^= top_level_classes.At(0);
10205 ASSERT(top_level_class.is_finalized()); 10237 ASSERT(top_level_class.is_finalized());
10206 return top_level_class.Evaluate(expr, param_names, param_values); 10238 return top_level_class.Evaluate(expr, param_names, param_values);
10207 } 10239 }
10208 10240
10209 10241
10210 void Library::InitNativeWrappersLibrary(Isolate* isolate) { 10242 void Library::InitNativeWrappersLibrary(Isolate* isolate) {
10211 static const int kNumNativeWrappersClasses = 4; 10243 static const int kNumNativeWrappersClasses = 4;
10212 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); 10244 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10);
10213 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); 10245 const String& native_flds_lib_url = Symbols::DartNativeWrappers();
10214 const Library& native_flds_lib = Library::Handle( 10246 const Library& native_flds_lib = Library::Handle(
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after
10859 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const { 10891 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const {
10860 Object::PrintJSONImpl(stream, ref); 10892 Object::PrintJSONImpl(stream, ref);
10861 } 10893 }
10862 10894
10863 10895
10864 void Namespace::set_metadata_field(const Field& value) const { 10896 void Namespace::set_metadata_field(const Field& value) const {
10865 StorePointer(&raw_ptr()->metadata_field_, value.raw()); 10897 StorePointer(&raw_ptr()->metadata_field_, value.raw());
10866 } 10898 }
10867 10899
10868 10900
10869 void Namespace::AddMetadata(intptr_t token_pos, const Class& owner_class) { 10901 void Namespace::AddMetadata(const PatchClass& owner, intptr_t token_pos) {
10870 ASSERT(Field::Handle(metadata_field()).IsNull()); 10902 ASSERT(Field::Handle(metadata_field()).IsNull());
10871 Field& field = Field::Handle(Field::New(Symbols::TopLevel(), 10903 Field& field = Field::Handle(Field::NewTopLevel(Symbols::TopLevel(),
10872 true, // is_static
10873 false, // is_final 10904 false, // is_final
10874 false, // is_const 10905 false, // is_const
10875 false, // is_reflectable 10906 owner,
10876 owner_class,
10877 Object::dynamic_type(),
10878 token_pos)); 10907 token_pos));
10908 field.set_is_reflectable(false);
10909 field.SetFieldType(Object::dynamic_type());
10879 field.SetStaticValue(Array::empty_array(), true); 10910 field.SetStaticValue(Array::empty_array(), true);
10880 set_metadata_field(field); 10911 set_metadata_field(field);
10881 owner_class.AddField(field);
10882 } 10912 }
10883 10913
10884 10914
10885 RawObject* Namespace::GetMetadata() const { 10915 RawObject* Namespace::GetMetadata() const {
10886 Field& field = Field::Handle(metadata_field()); 10916 Field& field = Field::Handle(metadata_field());
10887 if (field.IsNull()) { 10917 if (field.IsNull()) {
10888 // There is no metadata for this object. 10918 // There is no metadata for this object.
10889 return Object::empty_array().raw(); 10919 return Object::empty_array().raw();
10890 } 10920 }
10891 Object& metadata = Object::Handle(); 10921 Object& metadata = Object::Handle();
10892 metadata = field.StaticValue(); 10922 metadata = field.StaticValue();
10893 if (field.StaticValue() == Object::empty_array().raw()) { 10923 if (field.StaticValue() == Object::empty_array().raw()) {
10894 metadata = Parser::ParseMetadata(Class::Handle(field.owner()), 10924 metadata = Parser::ParseMetadata(field);
10895 field.token_pos());
10896 if (metadata.IsArray()) { 10925 if (metadata.IsArray()) {
10897 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); 10926 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw());
10898 field.SetStaticValue(Array::Cast(metadata), true); 10927 field.SetStaticValue(Array::Cast(metadata), true);
10899 } 10928 }
10900 } 10929 }
10901 return metadata.raw(); 10930 return metadata.raw();
10902 } 10931 }
10903 10932
10904 10933
10905 const char* Namespace::ToCString() const { 10934 const char* Namespace::ToCString() const {
(...skipping 11001 matching lines...) Expand 10 before | Expand all | Expand 10 after
21907 return tag_label.ToCString(); 21936 return tag_label.ToCString();
21908 } 21937 }
21909 21938
21910 21939
21911 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { 21940 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
21912 Instance::PrintJSONImpl(stream, ref); 21941 Instance::PrintJSONImpl(stream, ref);
21913 } 21942 }
21914 21943
21915 21944
21916 } // namespace dart 21945 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698