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/become.h" | 10 #include "vm/become.h" |
(...skipping 15389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15400 Isolate* isolate = thread->isolate(); | 15400 Isolate* isolate = thread->isolate(); |
15401 Instance& result = Instance::Handle(zone); | 15401 Instance& result = Instance::Handle(zone); |
15402 const Class& cls = Class::Handle(zone, this->clazz()); | 15402 const Class& cls = Class::Handle(zone, this->clazz()); |
15403 SafepointMutexLocker ml(isolate->constant_canonicalization_mutex()); | 15403 SafepointMutexLocker ml(isolate->constant_canonicalization_mutex()); |
15404 result ^= cls.LookupCanonicalInstance(zone, *this); | 15404 result ^= cls.LookupCanonicalInstance(zone, *this); |
15405 return (result.raw() == this->raw()); | 15405 return (result.raw() == this->raw()); |
15406 } | 15406 } |
15407 #endif // DEBUG | 15407 #endif // DEBUG |
15408 | 15408 |
15409 | 15409 |
15410 RawAbstractType* Instance::GetType() const { | 15410 RawAbstractType* Instance::GetType(Heap::Space space) const { |
15411 if (IsNull()) { | 15411 if (IsNull()) { |
15412 return Type::NullType(); | 15412 return Type::NullType(); |
15413 } | 15413 } |
15414 const Class& cls = Class::Handle(clazz()); | 15414 const Class& cls = Class::Handle(clazz()); |
15415 if (cls.IsClosureClass()) { | 15415 if (cls.IsClosureClass()) { |
15416 const Function& signature = | 15416 const Function& signature = |
15417 Function::Handle(Closure::Cast(*this).function()); | 15417 Function::Handle(Closure::Cast(*this).function()); |
15418 Type& type = Type::Handle(signature.SignatureType()); | 15418 Type& type = Type::Handle(signature.SignatureType()); |
15419 if (type.type_class() == cls.raw()) { | 15419 if (type.type_class() == cls.raw()) { |
15420 // Type is not parameterized. | 15420 // Type is not parameterized. |
15421 if (!type.IsCanonical()) { | 15421 if (!type.IsCanonical()) { |
15422 type ^= type.Canonicalize(); | 15422 type ^= type.Canonicalize(); |
15423 signature.SetSignatureType(type); | 15423 signature.SetSignatureType(type); |
15424 } | 15424 } |
15425 return type.raw(); | 15425 return type.raw(); |
15426 } | 15426 } |
15427 const Class& scope_cls = Class::Handle(type.type_class()); | 15427 const Class& scope_cls = Class::Handle(type.type_class()); |
15428 ASSERT(scope_cls.NumTypeArguments() > 0); | 15428 ASSERT(scope_cls.NumTypeArguments() > 0); |
15429 TypeArguments& type_arguments = TypeArguments::Handle(GetTypeArguments()); | 15429 TypeArguments& type_arguments = TypeArguments::Handle(GetTypeArguments()); |
15430 type = Type::New(scope_cls, type_arguments, TokenPosition::kNoSource, | 15430 type = |
15431 Heap::kNew); | 15431 Type::New(scope_cls, type_arguments, TokenPosition::kNoSource, space); |
15432 type.set_signature(signature); | 15432 type.set_signature(signature); |
15433 type.SetIsFinalized(); | 15433 type.SetIsFinalized(); |
15434 type ^= type.Canonicalize(); | 15434 type ^= type.Canonicalize(); |
15435 return type.raw(); | 15435 return type.raw(); |
15436 } | 15436 } |
15437 Type& type = Type::Handle(); | 15437 Type& type = Type::Handle(); |
15438 if (!cls.IsGeneric()) { | 15438 if (!cls.IsGeneric()) { |
15439 type = cls.CanonicalType(); | 15439 type = cls.CanonicalType(); |
15440 } | 15440 } |
15441 if (type.IsNull()) { | 15441 if (type.IsNull()) { |
15442 TypeArguments& type_arguments = TypeArguments::Handle(); | 15442 TypeArguments& type_arguments = TypeArguments::Handle(); |
15443 if (cls.NumTypeArguments() > 0) { | 15443 if (cls.NumTypeArguments() > 0) { |
15444 type_arguments = GetTypeArguments(); | 15444 type_arguments = GetTypeArguments(); |
15445 } | 15445 } |
15446 type = Type::New(cls, type_arguments, TokenPosition::kNoSource); | 15446 type = Type::New(cls, type_arguments, TokenPosition::kNoSource, space); |
15447 type.SetIsFinalized(); | 15447 type.SetIsFinalized(); |
15448 type ^= type.Canonicalize(); | 15448 type ^= type.Canonicalize(); |
15449 } | 15449 } |
15450 return type.raw(); | 15450 return type.raw(); |
15451 } | 15451 } |
15452 | 15452 |
15453 | 15453 |
15454 RawTypeArguments* Instance::GetTypeArguments() const { | 15454 RawTypeArguments* Instance::GetTypeArguments() const { |
15455 const Class& cls = Class::Handle(clazz()); | 15455 const Class& cls = Class::Handle(clazz()); |
15456 intptr_t field_offset = cls.type_arguments_field_offset(); | 15456 intptr_t field_offset = cls.type_arguments_field_offset(); |
(...skipping 7232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22689 return UserTag::null(); | 22689 return UserTag::null(); |
22690 } | 22690 } |
22691 | 22691 |
22692 | 22692 |
22693 const char* UserTag::ToCString() const { | 22693 const char* UserTag::ToCString() const { |
22694 const String& tag_label = String::Handle(label()); | 22694 const String& tag_label = String::Handle(label()); |
22695 return tag_label.ToCString(); | 22695 return tag_label.ToCString(); |
22696 } | 22696 } |
22697 | 22697 |
22698 } // namespace dart | 22698 } // namespace dart |
OLD | NEW |