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

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
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 5171 matching lines...) Expand 10 before | Expand all | Expand 10 after
5182 "PatchClass for %s", cls_name); 5182 "PatchClass for %s", cls_name);
5183 } 5183 }
5184 5184
5185 5185
5186 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const { 5186 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const {
5187 Object::PrintJSONImpl(stream, ref); 5187 Object::PrintJSONImpl(stream, ref);
5188 } 5188 }
5189 5189
5190 5190
5191 RawPatchClass* PatchClass::New(const Class& patched_class, 5191 RawPatchClass* PatchClass::New(const Class& patched_class,
5192 const Class& source_class) { 5192 const Class& origin_class) {
5193 const PatchClass& result = PatchClass::Handle(PatchClass::New()); 5193 const PatchClass& result = PatchClass::Handle(PatchClass::New());
5194 result.set_patched_class(patched_class); 5194 result.set_patched_class(patched_class);
5195 result.set_source_class(source_class); 5195 result.set_origin_class(origin_class);
5196 result.set_script(Script::Handle(origin_class.script()));
5196 return result.raw(); 5197 return result.raw();
5197 } 5198 }
5198 5199
5200
5201 RawPatchClass* PatchClass::New(const Class& patched_class,
5202 const Script& script) {
5203 const PatchClass& result = PatchClass::Handle(PatchClass::New());
5204 result.set_patched_class(patched_class);
5205 result.set_origin_class(patched_class);
5206 result.set_script(script);
5207 return result.raw();
5208 }
5209
5199 5210
5200 RawPatchClass* PatchClass::New() { 5211 RawPatchClass* PatchClass::New() {
5201 ASSERT(Object::patch_class_class() != Class::null()); 5212 ASSERT(Object::patch_class_class() != Class::null());
5202 RawObject* raw = Object::Allocate(PatchClass::kClassId, 5213 RawObject* raw = Object::Allocate(PatchClass::kClassId,
5203 PatchClass::InstanceSize(), 5214 PatchClass::InstanceSize(),
5204 Heap::kOld); 5215 Heap::kOld);
5205 return reinterpret_cast<RawPatchClass*>(raw); 5216 return reinterpret_cast<RawPatchClass*>(raw);
5206 } 5217 }
5207 5218
5208 5219
5209 RawScript* PatchClass::Script() const {
5210 const Class& source_class = Class::Handle(this->source_class());
5211 return source_class.script();
5212 }
5213
5214
5215 void PatchClass::set_patched_class(const Class& value) const { 5220 void PatchClass::set_patched_class(const Class& value) const {
5216 StorePointer(&raw_ptr()->patched_class_, value.raw()); 5221 StorePointer(&raw_ptr()->patched_class_, value.raw());
5217 } 5222 }
5218 5223
5219 5224
5220 void PatchClass::set_source_class(const Class& value) const { 5225 void PatchClass::set_origin_class(const Class& value) const {
5221 StorePointer(&raw_ptr()->source_class_, value.raw()); 5226 StorePointer(&raw_ptr()->origin_class_, value.raw());
5222 } 5227 }
5223 5228
5224 5229
5230 void PatchClass::set_script(const Script& value) const {
5231 StorePointer(&raw_ptr()->script_, value.raw());
5232 }
5233
5234
5225 bool Function::HasBreakpoint() const { 5235 bool Function::HasBreakpoint() const {
5226 Thread* thread = Thread::Current(); 5236 Thread* thread = Thread::Current();
5227 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()); 5237 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone());
5228 } 5238 }
5229 5239
5230 5240
5231 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const { 5241 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const {
5232 DEBUG_ASSERT(IsMutatorOrAtSafepoint()); 5242 DEBUG_ASSERT(IsMutatorOrAtSafepoint());
5233 // We may not have previous code if 'always_optimize' is set. 5243 // We may not have previous code if 'always_optimize' is set.
5234 if (!is_osr && HasCode()) { 5244 if (!is_osr && HasCode()) {
(...skipping 1575 matching lines...) Expand 10 before | Expand all | Expand 10 after
6810 return PatchClass::Cast(obj).patched_class(); 6820 return PatchClass::Cast(obj).patched_class();
6811 } 6821 }
6812 6822
6813 6823
6814 RawClass* Function::origin() const { 6824 RawClass* Function::origin() const {
6815 const Object& obj = Object::Handle(raw_ptr()->owner_); 6825 const Object& obj = Object::Handle(raw_ptr()->owner_);
6816 if (obj.IsClass()) { 6826 if (obj.IsClass()) {
6817 return Class::Cast(obj).raw(); 6827 return Class::Cast(obj).raw();
6818 } 6828 }
6819 ASSERT(obj.IsPatchClass()); 6829 ASSERT(obj.IsPatchClass());
6820 return PatchClass::Cast(obj).source_class(); 6830 return PatchClass::Cast(obj).origin_class();
6821 } 6831 }
6822 6832
6823 6833
6824 RawScript* Function::script() const { 6834 RawScript* Function::script() const {
6825 if (token_pos() == 0) { 6835 if (token_pos() == 0) {
6826 // Testing for position 0 is an optimization that relies on temporary 6836 // Testing for position 0 is an optimization that relies on temporary
6827 // eval functions having token position 0. 6837 // eval functions having token position 0.
6828 const Script& script = Script::Handle(eval_script()); 6838 const Script& script = Script::Handle(eval_script());
6829 if (!script.IsNull()) { 6839 if (!script.IsNull()) {
6830 return script.raw(); 6840 return script.raw();
6831 } 6841 }
6832 } 6842 }
6833 if (IsClosureFunction()) { 6843 if (IsClosureFunction()) {
6834 return Function::Handle(parent_function()).script(); 6844 return Function::Handle(parent_function()).script();
6835 } 6845 }
6836 const Object& obj = Object::Handle(raw_ptr()->owner_); 6846 const Object& obj = Object::Handle(raw_ptr()->owner_);
6837 if (obj.IsClass()) { 6847 if (obj.IsClass()) {
6838 return Class::Cast(obj).script(); 6848 return Class::Cast(obj).script();
6839 } 6849 }
6840 ASSERT(obj.IsPatchClass()); 6850 ASSERT(obj.IsPatchClass());
6841 return PatchClass::Cast(obj).Script(); 6851 return PatchClass::Cast(obj).script();
6842 } 6852 }
6843 6853
6844 6854
6845 bool Function::HasOptimizedCode() const { 6855 bool Function::HasOptimizedCode() const {
6846 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); 6856 return HasCode() && Code::Handle(CurrentCode()).is_optimized();
6847 } 6857 }
6848 6858
6849 6859
6850 RawString* Function::PrettyName() const { 6860 RawString* Function::PrettyName() const {
6851 const String& str = String::Handle(name()); 6861 const String& str = String::Handle(name());
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
7383 return PatchClass::Cast(obj).patched_class(); 7393 return PatchClass::Cast(obj).patched_class();
7384 } 7394 }
7385 7395
7386 7396
7387 RawClass* Field::origin() const { 7397 RawClass* Field::origin() const {
7388 const Object& obj = Object::Handle(raw_ptr()->owner_); 7398 const Object& obj = Object::Handle(raw_ptr()->owner_);
7389 if (obj.IsClass()) { 7399 if (obj.IsClass()) {
7390 return Class::Cast(obj).raw(); 7400 return Class::Cast(obj).raw();
7391 } 7401 }
7392 ASSERT(obj.IsPatchClass()); 7402 ASSERT(obj.IsPatchClass());
7393 return PatchClass::Cast(obj).source_class(); 7403 return PatchClass::Cast(obj).origin_class();
7394 } 7404 }
7395 7405
7396 7406
7407 RawScript* Field::script() const {
7408 const Object& obj = Object::Handle(raw_ptr()->owner_);
7409 if (obj.IsClass()) {
7410 return Class::Cast(obj).script();
7411 }
7412 ASSERT(obj.IsPatchClass());
7413 return PatchClass::Cast(obj).script();
7414 }
7415
7416
7397 // Called at finalization time 7417 // Called at finalization time
7398 void Field::SetFieldType(const AbstractType& value) const { 7418 void Field::SetFieldType(const AbstractType& value) const {
7399 ASSERT(Thread::Current()->IsMutatorThread()); 7419 ASSERT(Thread::Current()->IsMutatorThread());
7400 ASSERT(!value.IsNull()); 7420 ASSERT(!value.IsNull());
7401 if (value.raw() != type()) { 7421 if (value.raw() != type()) {
7402 StorePointer(&raw_ptr()->type_, value.raw()); 7422 StorePointer(&raw_ptr()->type_, value.raw());
7403 } 7423 }
7404 } 7424 }
7405 7425
7406 7426
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
7443 // Presently, we only attempt to remember the list length for final fields. 7463 // Presently, we only attempt to remember the list length for final fields.
7444 if (is_final && FLAG_use_field_guards) { 7464 if (is_final && FLAG_use_field_guards) {
7445 result.set_guarded_list_length(Field::kUnknownFixedLength); 7465 result.set_guarded_list_length(Field::kUnknownFixedLength);
7446 } else { 7466 } else {
7447 result.set_guarded_list_length(Field::kNoFixedLength); 7467 result.set_guarded_list_length(Field::kNoFixedLength);
7448 } 7468 }
7449 return result.raw(); 7469 return result.raw();
7450 } 7470 }
7451 7471
7452 7472
7473 RawField* Field::NewTopLevel(const String& name,
7474 bool is_final,
7475 bool is_const,
7476 const Object& owner,
7477 intptr_t token_pos) {
7478 ASSERT(!owner.IsNull());
7479 const Field& result = Field::Handle(Field::New());
7480 result.set_name(name);
7481 result.set_is_static(true);
7482 result.set_is_final(is_final);
7483 result.set_is_const(is_const);
7484 result.set_is_reflectable(true);
7485 result.set_is_double_initialized(false);
7486 result.set_owner(owner);
7487 result.set_token_pos(token_pos);
7488 result.set_has_initializer(false);
7489 result.set_is_unboxing_candidate(true);
7490 result.set_guarded_cid(FLAG_use_field_guards ? kIllegalCid : kDynamicCid);
7491 result.set_is_nullable(FLAG_use_field_guards ? false : true);
7492 result.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset);
7493 // Presently, we only attempt to remember the list length for final fields.
7494 if (is_final && FLAG_use_field_guards) {
7495 result.set_guarded_list_length(Field::kUnknownFixedLength);
7496 } else {
7497 result.set_guarded_list_length(Field::kNoFixedLength);
7498 }
7499 return result.raw();
7500 }
7501
7453 7502
7454 RawField* Field::Clone(const Class& new_owner) const { 7503 RawField* Field::Clone(const Class& new_owner) const {
7455 Field& clone = Field::Handle(); 7504 Field& clone = Field::Handle();
7456 clone ^= Object::Clone(*this, Heap::kOld); 7505 clone ^= Object::Clone(*this, Heap::kOld);
7457 const Class& owner = Class::Handle(this->owner()); 7506 const Class& owner = Class::Handle(this->owner());
7458 const PatchClass& clone_owner = 7507 const PatchClass& clone_owner =
7459 PatchClass::Handle(PatchClass::New(new_owner, owner)); 7508 PatchClass::Handle(PatchClass::New(new_owner, owner));
7460 clone.set_owner(clone_owner); 7509 clone.set_owner(clone_owner);
7461 if (!clone.is_static()) { 7510 if (!clone.is_static()) {
7462 clone.SetOffset(0); 7511 clone.SetOffset(0);
(...skipping 1649 matching lines...) Expand 10 before | Expand all | Expand 10 after
9112 while (obj.IsNull() && HasNext()) { 9161 while (obj.IsNull() && HasNext()) {
9113 next_ix_++; 9162 next_ix_++;
9114 obj = array_.At(next_ix_); 9163 obj = array_.At(next_ix_);
9115 } 9164 }
9116 } 9165 }
9117 9166
9118 9167
9119 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library, 9168 ClassDictionaryIterator::ClassDictionaryIterator(const Library& library,
9120 IterationKind kind) 9169 IterationKind kind)
9121 : DictionaryIterator(library), 9170 : DictionaryIterator(library),
9122 anon_array_((kind == kIteratePrivate) ? 9171 toplevel_class_(Class::Handle(
9123 Array::Handle(library.anonymous_classes()) : Object::empty_array()), 9172 (kind == kIteratePrivate)
9124 anon_size_((kind == kIteratePrivate) ? 9173 ? library.toplevel_class()
9125 library.num_anonymous_classes() : 0), 9174 : Class::null())) {
9126 anon_ix_(0) {
9127 MoveToNextClass(); 9175 MoveToNextClass();
9128 } 9176 }
9129 9177
9130 9178
9131 RawClass* ClassDictionaryIterator::GetNextClass() { 9179 RawClass* ClassDictionaryIterator::GetNextClass() {
9132 ASSERT(HasNext()); 9180 ASSERT(HasNext());
9133 Class& cls = Class::Handle(); 9181 Class& cls = Class::Handle();
9134 if (next_ix_ < size_) { 9182 if (next_ix_ < size_) {
9135 int ix = next_ix_++; 9183 int ix = next_ix_++;
9136 cls ^= array_.At(ix); 9184 cls ^= array_.At(ix);
9137 MoveToNextClass(); 9185 MoveToNextClass();
9138 return cls.raw(); 9186 return cls.raw();
9139 } 9187 }
9140 ASSERT(anon_ix_ < anon_size_); 9188 ASSERT(!toplevel_class_.IsNull());
9141 cls ^= anon_array_.At(anon_ix_++); 9189 cls = toplevel_class_.raw();
9190 toplevel_class_ = Class::null();
9142 return cls.raw(); 9191 return cls.raw();
9143 } 9192 }
9144 9193
9145 9194
9146 void ClassDictionaryIterator::MoveToNextClass() { 9195 void ClassDictionaryIterator::MoveToNextClass() {
9147 Object& obj = Object::Handle(); 9196 Object& obj = Object::Handle();
9148 while (next_ix_ < size_) { 9197 while (next_ix_ < size_) {
9149 obj = array_.At(next_ix_); 9198 obj = array_.At(next_ix_);
9150 if (obj.IsClass()) { 9199 if (obj.IsClass()) {
9151 return; 9200 return;
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
9316 const String& cname = String::Handle( 9365 const String& cname = String::Handle(
9317 MakeClassMetaName(Class::Handle(param.parameterized_class()))); 9366 MakeClassMetaName(Class::Handle(param.parameterized_class())));
9318 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); 9367 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3);
9319 pieces.Add(cname); 9368 pieces.Add(cname);
9320 pieces.Add(Symbols::At()); 9369 pieces.Add(Symbols::At());
9321 pieces.Add(String::Handle(param.name())); 9370 pieces.Add(String::Handle(param.name()));
9322 return Symbols::FromConcatAll(pieces); 9371 return Symbols::FromConcatAll(pieces);
9323 } 9372 }
9324 9373
9325 9374
9326 void Library::AddMetadata(const Class& cls, 9375 void Library::AddMetadata(const Object& owner,
9327 const String& name, 9376 const String& name,
9328 intptr_t token_pos) const { 9377 intptr_t token_pos) const {
9329 const String& metaname = String::Handle(Symbols::New(name)); 9378 const String& metaname = String::Handle(Symbols::New(name));
9330 Field& field = Field::Handle(Field::New(metaname, 9379 const Field& field = Field::Handle(
9331 true, // is_static 9380 Field::NewTopLevel(metaname,
9332 false, // is_final 9381 false, // is_final
9333 false, // is_const 9382 false, // is_const
9334 false, // is_reflectable 9383 owner,
9335 cls, 9384 token_pos));
9336 Object::dynamic_type(), 9385 field.SetFieldType(Object::dynamic_type());
9337 token_pos)); 9386 field.set_is_reflectable(false);
9338 field.SetStaticValue(Array::empty_array(), true); 9387 field.SetStaticValue(Array::empty_array(), true);
9339 GrowableObjectArray& metadata = 9388 GrowableObjectArray& metadata =
9340 GrowableObjectArray::Handle(this->metadata()); 9389 GrowableObjectArray::Handle(this->metadata());
9341 metadata.Add(field, Heap::kOld); 9390 metadata.Add(field, Heap::kOld);
9342 cls.AddField(field);
9343 } 9391 }
9344 9392
9345 9393
9346 void Library::AddClassMetadata(const Class& cls, 9394 void Library::AddClassMetadata(const Class& cls,
9347 const Class& toplevel_class, 9395 const Object& tl_owner,
9348 intptr_t token_pos) const { 9396 intptr_t token_pos) const {
9349 // We use the toplevel class as the owner of a class's metadata field because 9397 // We use the toplevel class as the owner of a class's metadata field because
9350 // a class's metadata is in scope of the library, not the class. 9398 // a class's metadata is in scope of the library, not the class.
9351 AddMetadata(toplevel_class, 9399 AddMetadata(tl_owner,
9352 String::Handle(MakeClassMetaName(cls)), 9400 String::Handle(MakeClassMetaName(cls)),
9353 token_pos); 9401 token_pos);
9354 } 9402 }
9355 9403
9356 9404
9357 void Library::AddFieldMetadata(const Field& field, 9405 void Library::AddFieldMetadata(const Field& field,
9358 intptr_t token_pos) const { 9406 intptr_t token_pos) const {
9359 AddMetadata(Class::Handle(field.origin()), 9407 AddMetadata(Object::Handle(field.RawOwner()),
9360 String::Handle(MakeFieldMetaName(field)), 9408 String::Handle(MakeFieldMetaName(field)),
9361 token_pos); 9409 token_pos);
9362 } 9410 }
9363 9411
9364 9412
9365 void Library::AddFunctionMetadata(const Function& func, 9413 void Library::AddFunctionMetadata(const Function& func,
9366 intptr_t token_pos) const { 9414 intptr_t token_pos) const {
9367 AddMetadata(Class::Handle(func.origin()), 9415 AddMetadata(Object::Handle(func.RawOwner()),
9368 String::Handle(MakeFunctionMetaName(func)), 9416 String::Handle(MakeFunctionMetaName(func)),
9369 token_pos); 9417 token_pos);
9370 } 9418 }
9371 9419
9372 9420
9373 void Library::AddTypeParameterMetadata(const TypeParameter& param, 9421 void Library::AddTypeParameterMetadata(const TypeParameter& param,
9374 intptr_t token_pos) const { 9422 intptr_t token_pos) const {
9375 AddMetadata(Class::Handle(param.parameterized_class()), 9423 AddMetadata(Class::Handle(param.parameterized_class()),
9376 String::Handle(MakeTypeParameterMetaName(param)), 9424 String::Handle(MakeTypeParameterMetaName(param)),
9377 token_pos); 9425 token_pos);
9378 } 9426 }
9379 9427
9380 9428
9381 void Library::AddLibraryMetadata(const Class& cls, intptr_t token_pos) const { 9429 void Library::AddLibraryMetadata(const Object& tl_owner,
9382 AddMetadata(cls, Symbols::TopLevel(), token_pos); 9430 intptr_t token_pos) const {
9431 AddMetadata(tl_owner, Symbols::TopLevel(), token_pos);
9383 } 9432 }
9384 9433
9385 9434
9386 RawString* Library::MakeMetadataName(const Object& obj) const { 9435 RawString* Library::MakeMetadataName(const Object& obj) const {
9387 if (obj.IsClass()) { 9436 if (obj.IsClass()) {
9388 return MakeClassMetaName(Class::Cast(obj)); 9437 return MakeClassMetaName(Class::Cast(obj));
9389 } else if (obj.IsField()) { 9438 } else if (obj.IsField()) {
9390 return MakeFieldMetaName(Field::Cast(obj)); 9439 return MakeFieldMetaName(Field::Cast(obj));
9391 } else if (obj.IsFunction()) { 9440 } else if (obj.IsFunction()) {
9392 return MakeFunctionMetaName(Function::Cast(obj)); 9441 return MakeFunctionMetaName(Function::Cast(obj));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
9424 } 9473 }
9425 const String& metaname = String::Handle(MakeMetadataName(obj)); 9474 const String& metaname = String::Handle(MakeMetadataName(obj));
9426 Field& field = Field::Handle(GetMetadataField(metaname)); 9475 Field& field = Field::Handle(GetMetadataField(metaname));
9427 if (field.IsNull()) { 9476 if (field.IsNull()) {
9428 // There is no metadata for this object. 9477 // There is no metadata for this object.
9429 return Object::empty_array().raw(); 9478 return Object::empty_array().raw();
9430 } 9479 }
9431 Object& metadata = Object::Handle(); 9480 Object& metadata = Object::Handle();
9432 metadata = field.StaticValue(); 9481 metadata = field.StaticValue();
9433 if (field.StaticValue() == Object::empty_array().raw()) { 9482 if (field.StaticValue() == Object::empty_array().raw()) {
9434 metadata = Parser::ParseMetadata(Class::Handle(field.owner()), 9483 metadata = Parser::ParseMetadata(field);
9435 field.token_pos());
9436 if (metadata.IsArray()) { 9484 if (metadata.IsArray()) {
9437 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); 9485 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw());
9438 field.SetStaticValue(Array::Cast(metadata), true); 9486 field.SetStaticValue(Array::Cast(metadata), true);
9439 } 9487 }
9440 } 9488 }
9441 return metadata.raw(); 9489 return metadata.raw();
9442 } 9490 }
9443 9491
9444 9492
9445 static bool ShouldBePrivate(const String& name) { 9493 static bool ShouldBePrivate(const String& name) {
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
9703 Class& cls = Class::Handle(); 9751 Class& cls = Class::Handle();
9704 Script& owner_script = Script::Handle(); 9752 Script& owner_script = Script::Handle();
9705 DictionaryIterator it(*this); 9753 DictionaryIterator it(*this);
9706 while (it.HasNext()) { 9754 while (it.HasNext()) {
9707 entry = it.GetNext(); 9755 entry = it.GetNext();
9708 if (entry.IsClass()) { 9756 if (entry.IsClass()) {
9709 owner_script = Class::Cast(entry).script(); 9757 owner_script = Class::Cast(entry).script();
9710 } else if (entry.IsFunction()) { 9758 } else if (entry.IsFunction()) {
9711 owner_script = Function::Cast(entry).script(); 9759 owner_script = Function::Cast(entry).script();
9712 } else if (entry.IsField()) { 9760 } else if (entry.IsField()) {
9713 cls = Field::Cast(entry).owner(); 9761 owner_script = Field::Cast(entry).script();
9714 owner_script = cls.script();
9715 } else { 9762 } else {
9716 continue; 9763 continue;
9717 } 9764 }
9718 AddScriptIfUnique(scripts, owner_script); 9765 AddScriptIfUnique(scripts, owner_script);
9719 } 9766 }
9720 9767
9721 // Add all scripts from patch classes. 9768 // Add all scripts from patch classes.
9722 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes()); 9769 GrowableObjectArray& patches = GrowableObjectArray::Handle(patch_classes());
9723 for (intptr_t i = 0; i < patches.Length(); i++) { 9770 for (intptr_t i = 0; i < patches.Length(); i++) {
9724 cls ^= patches.At(i); 9771 cls ^= patches.At(i);
9725 owner_script = cls.script(); 9772 owner_script = cls.script();
9726 AddScriptIfUnique(scripts, owner_script); 9773 AddScriptIfUnique(scripts, owner_script);
9727 } 9774 }
9728 9775
9729 // Special case: Scripts that only contain external top-level functions are 9776 cls ^= toplevel_class();
9730 // not included above, but can be referenced through a library's anonymous 9777 if (!cls.IsNull()) {
9731 // classes. Example: dart-core:identical.dart.
9732 Array& anon_classes = Array::Handle(anonymous_classes());
9733 Function& func = Function::Handle();
9734 Array& functions = Array::Handle();
9735 for (intptr_t i = 0; i < anon_classes.Length(); i++) {
9736 cls ^= anon_classes.At(i);
9737 if (cls.IsNull()) continue;
9738 owner_script = cls.script(); 9778 owner_script = cls.script();
9739 AddScriptIfUnique(scripts, owner_script); 9779 AddScriptIfUnique(scripts, owner_script);
9740 functions = cls.functions(); 9780 // Special case: Scripts that only contain external top-level functions
9781 // are not included above, but can be referenced through a library's
9782 // anonymous classes. Example: dart-core:identical.dart.
9783 Function& func = Function::Handle();
9784 Array& functions = Array::Handle(cls.functions());
9741 for (intptr_t j = 0; j < functions.Length(); j++) { 9785 for (intptr_t j = 0; j < functions.Length(); j++) {
9742 func ^= functions.At(j); 9786 func ^= functions.At(j);
9743 owner_script = func.script(); 9787 if (func.is_external()) {
9744 AddScriptIfUnique(scripts, owner_script); 9788 owner_script = func.script();
9789 AddScriptIfUnique(scripts, owner_script);
9790 }
9745 } 9791 }
9746 } 9792 }
9747 9793
9748 // Create the array of scripts and cache it in loaded_scripts_. 9794 // Create the array of scripts and cache it in loaded_scripts_.
9749 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts)); 9795 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts));
9750 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw()); 9796 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw());
9751 } 9797 }
9752 return loaded_scripts(); 9798 return loaded_scripts();
9753 } 9799 }
9754 9800
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
9952 9998
9953 RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const { 9999 RawLibraryPrefix* Library::LookupLocalLibraryPrefix(const String& name) const {
9954 const Object& obj = Object::Handle(LookupLocalObject(name)); 10000 const Object& obj = Object::Handle(LookupLocalObject(name));
9955 if (obj.IsLibraryPrefix()) { 10001 if (obj.IsLibraryPrefix()) {
9956 return LibraryPrefix::Cast(obj).raw(); 10002 return LibraryPrefix::Cast(obj).raw();
9957 } 10003 }
9958 return LibraryPrefix::null(); 10004 return LibraryPrefix::null();
9959 } 10005 }
9960 10006
9961 10007
9962 void Library::AddAnonymousClass(const Class& cls) const { 10008 void Library::set_toplevel_class(const Class& value) const {
9963 intptr_t num_anonymous = this->raw_ptr()->num_anonymous_; 10009 ASSERT(raw_ptr()->toplevel_class_ == Class::null());
9964 Array& anon_array = Array::Handle(this->raw_ptr()->anonymous_classes_); 10010 StorePointer(&raw_ptr()->toplevel_class_, value.raw());
9965 if (num_anonymous == anon_array.Length()) {
9966 intptr_t new_len = (num_anonymous == 0) ? 4 : num_anonymous * 2;
9967 anon_array = Array::Grow(anon_array, new_len);
9968 StorePointer(&raw_ptr()->anonymous_classes_, anon_array.raw());
9969 }
9970 anon_array.SetAt(num_anonymous, cls);
9971 num_anonymous++;
9972 StoreNonPointer(&raw_ptr()->num_anonymous_, num_anonymous);
9973 } 10011 }
9974 10012
9975 10013
9976 RawLibrary* Library::ImportLibraryAt(intptr_t index) const { 10014 RawLibrary* Library::ImportLibraryAt(intptr_t index) const {
9977 Namespace& import = Namespace::Handle(ImportAt(index)); 10015 Namespace& import = Namespace::Handle(ImportAt(index));
9978 if (import.IsNull()) { 10016 if (import.IsNull()) {
9979 return Library::null(); 10017 return Library::null();
9980 } 10018 }
9981 return import.library(); 10019 return import.library();
9982 } 10020 }
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
10092 bool import_core_lib) { 10130 bool import_core_lib) {
10093 const Library& result = Library::Handle(Library::New()); 10131 const Library& result = Library::Handle(Library::New());
10094 result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw()); 10132 result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw());
10095 result.StorePointer(&result.raw_ptr()->url_, url.raw()); 10133 result.StorePointer(&result.raw_ptr()->url_, url.raw());
10096 result.StorePointer(&result.raw_ptr()->resolved_names_, 10134 result.StorePointer(&result.raw_ptr()->resolved_names_,
10097 Object::empty_array().raw()); 10135 Object::empty_array().raw());
10098 result.StorePointer(&result.raw_ptr()->dictionary_, 10136 result.StorePointer(&result.raw_ptr()->dictionary_,
10099 Object::empty_array().raw()); 10137 Object::empty_array().raw());
10100 result.StorePointer(&result.raw_ptr()->metadata_, 10138 result.StorePointer(&result.raw_ptr()->metadata_,
10101 GrowableObjectArray::New(4, Heap::kOld)); 10139 GrowableObjectArray::New(4, Heap::kOld));
10102 result.StorePointer(&result.raw_ptr()->anonymous_classes_, 10140 result.StorePointer(&result.raw_ptr()->toplevel_class_, Class::null());
10103 Object::empty_array().raw());
10104 result.StorePointer(&result.raw_ptr()->patch_classes_, 10141 result.StorePointer(&result.raw_ptr()->patch_classes_,
10105 GrowableObjectArray::New(Object::empty_array(), 10142 GrowableObjectArray::New(Object::empty_array(),
10106 Heap::kOld)); 10143 Heap::kOld));
10107 result.StoreNonPointer(&result.raw_ptr()->num_anonymous_, 0);
10108 result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw()); 10144 result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw());
10109 result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw()); 10145 result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw());
10110 result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null()); 10146 result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null());
10111 result.StorePointer(&result.raw_ptr()->load_error_, Instance::null()); 10147 result.StorePointer(&result.raw_ptr()->load_error_, Instance::null());
10112 result.set_native_entry_resolver(NULL); 10148 result.set_native_entry_resolver(NULL);
10113 result.set_native_entry_symbol_resolver(NULL); 10149 result.set_native_entry_symbol_resolver(NULL);
10114 result.set_is_in_fullsnapshot(false); 10150 result.set_is_in_fullsnapshot(false);
10115 result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true); 10151 result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true);
10116 result.set_debuggable(false); 10152 result.set_debuggable(false);
10117 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme())); 10153 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme()));
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
10152 // classes are coming from the VM isolate, and are shared between multiple 10188 // classes are coming from the VM isolate, and are shared between multiple
10153 // isolates so setting their library pointers would be wrong. 10189 // isolates so setting their library pointers would be wrong.
10154 const Class& cls = Class::Handle(Object::dynamic_class()); 10190 const Class& cls = Class::Handle(Object::dynamic_class());
10155 core_lib.AddObject(cls, String::Handle(cls.Name())); 10191 core_lib.AddObject(cls, String::Handle(cls.Name()));
10156 } 10192 }
10157 10193
10158 10194
10159 RawObject* Library::Evaluate(const String& expr, 10195 RawObject* Library::Evaluate(const String& expr,
10160 const Array& param_names, 10196 const Array& param_names,
10161 const Array& param_values) const { 10197 const Array& param_values) const {
10162 // Take a top-level class and evaluate the expression 10198 // Evaluate the expression as a static function of the toplevel class.
10163 // as a static function of the class. 10199 Class& top_level_class = Class::Handle(toplevel_class());
10164 Class& top_level_class = Class::Handle();
10165 Array& top_level_classes = Array::Handle(anonymous_classes());
10166 ASSERT(top_level_classes.Length() > 0);
10167 top_level_class ^= top_level_classes.At(0);
10168 ASSERT(top_level_class.is_finalized()); 10200 ASSERT(top_level_class.is_finalized());
10169 return top_level_class.Evaluate(expr, param_names, param_values); 10201 return top_level_class.Evaluate(expr, param_names, param_values);
10170 } 10202 }
10171 10203
10172 10204
10173 void Library::InitNativeWrappersLibrary(Isolate* isolate) { 10205 void Library::InitNativeWrappersLibrary(Isolate* isolate) {
10174 static const int kNumNativeWrappersClasses = 4; 10206 static const int kNumNativeWrappersClasses = 4;
10175 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); 10207 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10);
10176 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); 10208 const String& native_flds_lib_url = Symbols::DartNativeWrappers();
10177 const Library& native_flds_lib = Library::Handle( 10209 const Library& native_flds_lib = Library::Handle(
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after
10822 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const { 10854 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const {
10823 Object::PrintJSONImpl(stream, ref); 10855 Object::PrintJSONImpl(stream, ref);
10824 } 10856 }
10825 10857
10826 10858
10827 void Namespace::set_metadata_field(const Field& value) const { 10859 void Namespace::set_metadata_field(const Field& value) const {
10828 StorePointer(&raw_ptr()->metadata_field_, value.raw()); 10860 StorePointer(&raw_ptr()->metadata_field_, value.raw());
10829 } 10861 }
10830 10862
10831 10863
10832 void Namespace::AddMetadata(intptr_t token_pos, const Class& owner_class) { 10864 void Namespace::AddMetadata(const Object& owner, intptr_t token_pos) {
10833 ASSERT(Field::Handle(metadata_field()).IsNull()); 10865 ASSERT(Field::Handle(metadata_field()).IsNull());
10834 Field& field = Field::Handle(Field::New(Symbols::TopLevel(), 10866 Field& field = Field::Handle(Field::NewTopLevel(Symbols::TopLevel(),
10835 true, // is_static
10836 false, // is_final 10867 false, // is_final
10837 false, // is_const 10868 false, // is_const
10838 false, // is_reflectable 10869 owner,
10839 owner_class,
10840 Object::dynamic_type(),
10841 token_pos)); 10870 token_pos));
10871 field.set_is_reflectable(false);
10872 field.SetFieldType(Object::dynamic_type());
10842 field.SetStaticValue(Array::empty_array(), true); 10873 field.SetStaticValue(Array::empty_array(), true);
10843 set_metadata_field(field); 10874 set_metadata_field(field);
10844 owner_class.AddField(field);
10845 } 10875 }
10846 10876
10847 10877
10848 RawObject* Namespace::GetMetadata() const { 10878 RawObject* Namespace::GetMetadata() const {
10849 Field& field = Field::Handle(metadata_field()); 10879 Field& field = Field::Handle(metadata_field());
10850 if (field.IsNull()) { 10880 if (field.IsNull()) {
10851 // There is no metadata for this object. 10881 // There is no metadata for this object.
10852 return Object::empty_array().raw(); 10882 return Object::empty_array().raw();
10853 } 10883 }
10854 Object& metadata = Object::Handle(); 10884 Object& metadata = Object::Handle();
10855 metadata = field.StaticValue(); 10885 metadata = field.StaticValue();
10856 if (field.StaticValue() == Object::empty_array().raw()) { 10886 if (field.StaticValue() == Object::empty_array().raw()) {
10857 metadata = Parser::ParseMetadata(Class::Handle(field.owner()), 10887 metadata = Parser::ParseMetadata(field);
10858 field.token_pos());
10859 if (metadata.IsArray()) { 10888 if (metadata.IsArray()) {
10860 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw()); 10889 ASSERT(Array::Cast(metadata).raw() != Object::empty_array().raw());
10861 field.SetStaticValue(Array::Cast(metadata), true); 10890 field.SetStaticValue(Array::Cast(metadata), true);
10862 } 10891 }
10863 } 10892 }
10864 return metadata.raw(); 10893 return metadata.raw();
10865 } 10894 }
10866 10895
10867 10896
10868 const char* Namespace::ToCString() const { 10897 const char* Namespace::ToCString() const {
(...skipping 11001 matching lines...) Expand 10 before | Expand all | Expand 10 after
21870 return tag_label.ToCString(); 21899 return tag_label.ToCString();
21871 } 21900 }
21872 21901
21873 21902
21874 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { 21903 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
21875 Instance::PrintJSONImpl(stream, ref); 21904 Instance::PrintJSONImpl(stream, ref);
21876 } 21905 }
21877 21906
21878 21907
21879 } // namespace dart 21908 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698