OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 5211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |