| 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/bigint_operations.h" | 10 #include "vm/bigint_operations.h" |
| (...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 875 // allocated, because the classes reside in the VM isolate. | 875 // allocated, because the classes reside in the VM isolate. |
| 876 // The corresponding types are stored in the object store. | 876 // The corresponding types are stored in the object store. |
| 877 cls = null_class(); | 877 cls = null_class(); |
| 878 type = Type::NewNonParameterizedType(cls); | 878 type = Type::NewNonParameterizedType(cls); |
| 879 object_store->set_null_type(type); | 879 object_store->set_null_type(type); |
| 880 | 880 |
| 881 cls = void_class(); | 881 cls = void_class(); |
| 882 type = Type::NewNonParameterizedType(cls); | 882 type = Type::NewNonParameterizedType(cls); |
| 883 object_store->set_void_type(type); | 883 object_store->set_void_type(type); |
| 884 | 884 |
| 885 // The class 'Dynamic' is registered in the class dictionary because its name | 885 // The class 'dynamic' is registered in the class dictionary because its name |
| 886 // is a built-in identifier, rather than a reserved keyword. Its name is not | 886 // is a built-in identifier, rather than a reserved keyword. Its name is not |
| 887 // heap allocated, because the class resides in the VM isolate. | 887 // heap allocated, because the class resides in the VM isolate. |
| 888 // The corresponding type, the "unknown type", is stored in the object store. | 888 // The corresponding type, the "unknown type", is stored in the object store. |
| 889 cls = dynamic_class(); | 889 cls = dynamic_class(); |
| 890 type = Type::NewNonParameterizedType(cls); | 890 type = Type::NewNonParameterizedType(cls); |
| 891 object_store->set_dynamic_type(type); | 891 object_store->set_dynamic_type(type); |
| 892 | 892 |
| 893 // Allocate pre-initialized values. | 893 // Allocate pre-initialized values. |
| 894 Bool& bool_value = Bool::Handle(); | 894 Bool& bool_value = Bool::Handle(); |
| 895 bool_value = Bool::New(true); | 895 bool_value = Bool::New(true); |
| (...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2003 // This class and class 'other' do not need to be finalized, however, they must | 2003 // This class and class 'other' do not need to be finalized, however, they must |
| 2004 // be resolved as well as their interfaces. | 2004 // be resolved as well as their interfaces. |
| 2005 bool Class::TypeTest( | 2005 bool Class::TypeTest( |
| 2006 TypeTestKind test_kind, | 2006 TypeTestKind test_kind, |
| 2007 const AbstractTypeArguments& type_arguments, | 2007 const AbstractTypeArguments& type_arguments, |
| 2008 const Class& other, | 2008 const Class& other, |
| 2009 const AbstractTypeArguments& other_type_arguments, | 2009 const AbstractTypeArguments& other_type_arguments, |
| 2010 Error* malformed_error) const { | 2010 Error* malformed_error) const { |
| 2011 ASSERT(!IsVoidClass()); | 2011 ASSERT(!IsVoidClass()); |
| 2012 // Check for DynamicType. | 2012 // Check for DynamicType. |
| 2013 // Each occurrence of DynamicType in type T is interpreted as the Dynamic | 2013 // Each occurrence of DynamicType in type T is interpreted as the dynamic |
| 2014 // type, a supertype of all types. | 2014 // type, a supertype of all types. |
| 2015 if (other.IsDynamicClass()) { | 2015 if (other.IsDynamicClass()) { |
| 2016 return true; | 2016 return true; |
| 2017 } | 2017 } |
| 2018 // In the case of a subtype test, each occurrence of DynamicType in type S is | 2018 // In the case of a subtype test, each occurrence of DynamicType in type S is |
| 2019 // interpreted as the bottom type, a subtype of all types. | 2019 // interpreted as the bottom type, a subtype of all types. |
| 2020 // However, DynamicType is not more specific than any type. | 2020 // However, DynamicType is not more specific than any type. |
| 2021 if (IsDynamicClass()) { | 2021 if (IsDynamicClass()) { |
| 2022 return test_kind == kIsSubtypeOf; | 2022 return test_kind == kIsSubtypeOf; |
| 2023 } | 2023 } |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2581 bool AbstractTypeArguments::IsDynamicTypes(bool raw_instantiated, | 2581 bool AbstractTypeArguments::IsDynamicTypes(bool raw_instantiated, |
| 2582 intptr_t len) const { | 2582 intptr_t len) const { |
| 2583 ASSERT(Length() >= len); | 2583 ASSERT(Length() >= len); |
| 2584 AbstractType& type = AbstractType::Handle(); | 2584 AbstractType& type = AbstractType::Handle(); |
| 2585 Class& type_class = Class::Handle(); | 2585 Class& type_class = Class::Handle(); |
| 2586 for (intptr_t i = 0; i < len; i++) { | 2586 for (intptr_t i = 0; i < len; i++) { |
| 2587 type = TypeAt(i); | 2587 type = TypeAt(i); |
| 2588 ASSERT(!type.IsNull()); | 2588 ASSERT(!type.IsNull()); |
| 2589 if (!type.HasResolvedTypeClass()) { | 2589 if (!type.HasResolvedTypeClass()) { |
| 2590 if (raw_instantiated && type.IsTypeParameter()) { | 2590 if (raw_instantiated && type.IsTypeParameter()) { |
| 2591 // An uninstantiated type parameter is equivalent to Dynamic. | 2591 // An uninstantiated type parameter is equivalent to dynamic. |
| 2592 continue; | 2592 continue; |
| 2593 } | 2593 } |
| 2594 ASSERT((!raw_instantiated && type.IsTypeParameter()) || | 2594 ASSERT((!raw_instantiated && type.IsTypeParameter()) || |
| 2595 type.IsMalformed()); | 2595 type.IsMalformed()); |
| 2596 return false; | 2596 return false; |
| 2597 } | 2597 } |
| 2598 type_class = type.type_class(); | 2598 type_class = type.type_class(); |
| 2599 if (!type_class.IsDynamicClass()) { | 2599 if (!type_class.IsDynamicClass()) { |
| 2600 return false; | 2600 return false; |
| 2601 } | 2601 } |
| (...skipping 5436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8038 // are not the Object::null() instance. | 8038 // are not the Object::null() instance. |
| 8039 ASSERT((raw() == Object::transition_sentinel()) || | 8039 ASSERT((raw() == Object::transition_sentinel()) || |
| 8040 (raw() == Object::sentinel())); | 8040 (raw() == Object::sentinel())); |
| 8041 ASSERT(!FLAG_eliminate_type_checks); | 8041 ASSERT(!FLAG_eliminate_type_checks); |
| 8042 return true; // We are doing an instance of test as part of a type check. | 8042 return true; // We are doing an instance of test as part of a type check. |
| 8043 } | 8043 } |
| 8044 // The null instance can be returned from a void function. | 8044 // The null instance can be returned from a void function. |
| 8045 if (other.IsVoidType()) { | 8045 if (other.IsVoidType()) { |
| 8046 return true; | 8046 return true; |
| 8047 } | 8047 } |
| 8048 // Otherwise, null is only an instance of Object and of Dynamic. | 8048 // Otherwise, null is only an instance of Object and of dynamic. |
| 8049 // It is not necessary to fully instantiate the other type for this test. | 8049 // It is not necessary to fully instantiate the other type for this test. |
| 8050 Class& other_class = Class::Handle(); | 8050 Class& other_class = Class::Handle(); |
| 8051 if (other.IsTypeParameter()) { | 8051 if (other.IsTypeParameter()) { |
| 8052 if (other_instantiator.IsNull()) { | 8052 if (other_instantiator.IsNull()) { |
| 8053 return true; // Other type is uninstantiated, i.e. Dynamic. | 8053 return true; // Other type is uninstantiated, i.e. dynamic. |
| 8054 } | 8054 } |
| 8055 const TypeParameter& other_type_param = TypeParameter::Cast(other); | 8055 const TypeParameter& other_type_param = TypeParameter::Cast(other); |
| 8056 const AbstractType& instantiated_other = AbstractType::Handle( | 8056 const AbstractType& instantiated_other = AbstractType::Handle( |
| 8057 other_instantiator.TypeAt(other_type_param.index())); | 8057 other_instantiator.TypeAt(other_type_param.index())); |
| 8058 ASSERT(instantiated_other.IsInstantiated()); | 8058 ASSERT(instantiated_other.IsInstantiated()); |
| 8059 other_class = instantiated_other.type_class(); | 8059 other_class = instantiated_other.type_class(); |
| 8060 } else { | 8060 } else { |
| 8061 other_class = other.type_class(); | 8061 other_class = other.type_class(); |
| 8062 } | 8062 } |
| 8063 return other_class.IsObjectClass() || other_class.IsDynamicClass(); | 8063 return other_class.IsObjectClass() || other_class.IsDynamicClass(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 8084 (cls.IsSignatureClass() && | 8084 (cls.IsSignatureClass() && |
| 8085 (type_arguments.Length() > num_type_arguments))); | 8085 (type_arguments.Length() > num_type_arguments))); |
| 8086 } | 8086 } |
| 8087 Class& other_class = Class::Handle(); | 8087 Class& other_class = Class::Handle(); |
| 8088 AbstractTypeArguments& other_type_arguments = AbstractTypeArguments::Handle(); | 8088 AbstractTypeArguments& other_type_arguments = AbstractTypeArguments::Handle(); |
| 8089 // In case 'other' is not instantiated, we could simply call | 8089 // In case 'other' is not instantiated, we could simply call |
| 8090 // other.InstantiateFrom(other_instantiator), however, we can save the | 8090 // other.InstantiateFrom(other_instantiator), however, we can save the |
| 8091 // allocation of a new AbstractType by inlining the code. | 8091 // allocation of a new AbstractType by inlining the code. |
| 8092 if (other.IsTypeParameter()) { | 8092 if (other.IsTypeParameter()) { |
| 8093 if (other_instantiator.IsNull()) { | 8093 if (other_instantiator.IsNull()) { |
| 8094 // An uninstantiated type parameter is equivalent to Dynamic. | 8094 // An uninstantiated type parameter is equivalent to dynamic. |
| 8095 return true; | 8095 return true; |
| 8096 } | 8096 } |
| 8097 const TypeParameter& other_type_param = TypeParameter::Cast(other); | 8097 const TypeParameter& other_type_param = TypeParameter::Cast(other); |
| 8098 AbstractType& instantiated_other = AbstractType::Handle( | 8098 AbstractType& instantiated_other = AbstractType::Handle( |
| 8099 other_instantiator.TypeAt(other_type_param.index())); | 8099 other_instantiator.TypeAt(other_type_param.index())); |
| 8100 if (instantiated_other.IsDynamicType() || | 8100 if (instantiated_other.IsDynamicType() || |
| 8101 instantiated_other.IsTypeParameter()) { | 8101 instantiated_other.IsTypeParameter()) { |
| 8102 return true; | 8102 return true; |
| 8103 } | 8103 } |
| 8104 other_class = instantiated_other.type_class(); | 8104 other_class = instantiated_other.type_class(); |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8314 if (name_visibility == kInternalName) { | 8314 if (name_visibility == kInternalName) { |
| 8315 class_name = cls.Name(); | 8315 class_name = cls.Name(); |
| 8316 } else { | 8316 } else { |
| 8317 ASSERT(name_visibility == kUserVisibleName); | 8317 ASSERT(name_visibility == kUserVisibleName); |
| 8318 // Map internal types to their corresponding public interfaces. | 8318 // Map internal types to their corresponding public interfaces. |
| 8319 class_name = cls.UserVisibleName(); | 8319 class_name = cls.UserVisibleName(); |
| 8320 } | 8320 } |
| 8321 if (num_type_params > num_args) { | 8321 if (num_type_params > num_args) { |
| 8322 first_type_param_index = 0; | 8322 first_type_param_index = 0; |
| 8323 if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) { | 8323 if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) { |
| 8324 // Most probably a malformed type. Do not fill up with "Dynamic", | 8324 // Most probably a malformed type. Do not fill up with "dynamic", |
| 8325 // but use actual vector. | 8325 // but use actual vector. |
| 8326 num_type_params = num_args; | 8326 num_type_params = num_args; |
| 8327 } else { | 8327 } else { |
| 8328 ASSERT(num_args == 0); // Type is raw. | 8328 ASSERT(num_args == 0); // Type is raw. |
| 8329 // No need to fill up with "Dynamic". | 8329 // No need to fill up with "dynamic". |
| 8330 num_type_params = 0; | 8330 num_type_params = 0; |
| 8331 } | 8331 } |
| 8332 } else { | 8332 } else { |
| 8333 first_type_param_index = num_args - num_type_params; | 8333 first_type_param_index = num_args - num_type_params; |
| 8334 } | 8334 } |
| 8335 if (cls.IsSignatureClass()) { | 8335 if (cls.IsSignatureClass()) { |
| 8336 // We may be reporting an error about a malformed function type. In that | 8336 // We may be reporting an error about a malformed function type. In that |
| 8337 // case, avoid instantiating the signature, since it may lead to cycles. | 8337 // case, avoid instantiating the signature, since it may lead to cycles. |
| 8338 if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) { | 8338 if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) { |
| 8339 return class_name.raw(); | 8339 return class_name.raw(); |
| (...skipping 3861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12201 } | 12201 } |
| 12202 return result.raw(); | 12202 return result.raw(); |
| 12203 } | 12203 } |
| 12204 | 12204 |
| 12205 | 12205 |
| 12206 const char* WeakProperty::ToCString() const { | 12206 const char* WeakProperty::ToCString() const { |
| 12207 return "_WeakProperty"; | 12207 return "_WeakProperty"; |
| 12208 } | 12208 } |
| 12209 | 12209 |
| 12210 } // namespace dart | 12210 } // namespace dart |
| OLD | NEW |