| 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 | 
|---|