| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 "include/dart_api.h" | 5 #include "include/dart_api.h" |
| 6 #include "include/dart_mirrors_api.h" | 6 #include "include/dart_mirrors_api.h" |
| 7 #include "include/dart_native_api.h" | 7 #include "include/dart_native_api.h" |
| 8 | 8 |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 funcHandle_(Function::Handle(thread->zone())), | 100 funcHandle_(Function::Handle(thread->zone())), |
| 101 typeHandle_(AbstractType::Handle(thread->zone())) {} | 101 typeHandle_(AbstractType::Handle(thread->zone())) {} |
| 102 | 102 |
| 103 void VisitObject(RawObject* obj) { | 103 void VisitObject(RawObject* obj) { |
| 104 if (obj->IsFunction()) { | 104 if (obj->IsFunction()) { |
| 105 funcHandle_ ^= obj; | 105 funcHandle_ ^= obj; |
| 106 classHandle_ ^= funcHandle_.Owner(); | 106 classHandle_ ^= funcHandle_.Owner(); |
| 107 // Verify that the result type of a function is canonical or a | 107 // Verify that the result type of a function is canonical or a |
| 108 // TypeParameter. | 108 // TypeParameter. |
| 109 typeHandle_ ^= funcHandle_.result_type(); | 109 typeHandle_ ^= funcHandle_.result_type(); |
| 110 ASSERT(typeHandle_.IsNull() || | 110 ASSERT(typeHandle_.IsMalformed() || |
| 111 !typeHandle_.IsResolved() || | 111 !typeHandle_.IsResolved() || |
| 112 typeHandle_.IsTypeParameter() || | 112 typeHandle_.IsTypeParameter() || |
| 113 typeHandle_.IsCanonical()); | 113 typeHandle_.IsCanonical()); |
| 114 // Verify that the types in the function signature are all canonical or | 114 // Verify that the types in the function signature are all canonical or |
| 115 // a TypeParameter. | 115 // a TypeParameter. |
| 116 const intptr_t num_parameters = funcHandle_.NumParameters(); | 116 const intptr_t num_parameters = funcHandle_.NumParameters(); |
| 117 for (intptr_t i = 0; i < num_parameters; i++) { | 117 for (intptr_t i = 0; i < num_parameters; i++) { |
| 118 typeHandle_ = funcHandle_.ParameterTypeAt(i); | 118 typeHandle_ = funcHandle_.ParameterTypeAt(i); |
| 119 ASSERT(typeHandle_.IsTypeParameter() || | 119 ASSERT(typeHandle_.IsMalformed() || |
| 120 !typeHandle_.IsResolved() || | 120 !typeHandle_.IsResolved() || |
| 121 typeHandle_.IsTypeParameter() || |
| 121 typeHandle_.IsCanonical()); | 122 typeHandle_.IsCanonical()); |
| 122 } | 123 } |
| 123 } | 124 } |
| 124 } | 125 } |
| 125 | 126 |
| 126 private: | 127 private: |
| 127 Class& classHandle_; | 128 Class& classHandle_; |
| 128 Function& funcHandle_; | 129 Function& funcHandle_; |
| 129 AbstractType& typeHandle_; | 130 AbstractType& typeHandle_; |
| 130 }; | 131 }; |
| (...skipping 1716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1847 return Api::ClassId(handle) == kFieldCid; | 1848 return Api::ClassId(handle) == kFieldCid; |
| 1848 } | 1849 } |
| 1849 | 1850 |
| 1850 | 1851 |
| 1851 DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle) { | 1852 DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle) { |
| 1852 return Api::ClassId(handle) == kTypeParameterCid; | 1853 return Api::ClassId(handle) == kTypeParameterCid; |
| 1853 } | 1854 } |
| 1854 | 1855 |
| 1855 | 1856 |
| 1856 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { | 1857 DART_EXPORT bool Dart_IsClosure(Dart_Handle object) { |
| 1857 // We can't use a fast class index check here because there are many | 1858 return Api::ClassId(object) == kClosureCid; |
| 1858 // different signature classes for closures. | |
| 1859 Thread* thread = Thread::Current(); | |
| 1860 CHECK_ISOLATE(thread->isolate()); | |
| 1861 ReusableObjectHandleScope reused_obj_handle(thread); | |
| 1862 const Instance& closure_obj = | |
| 1863 Api::UnwrapInstanceHandle(reused_obj_handle, object); | |
| 1864 return (!closure_obj.IsNull() && closure_obj.IsClosure()); | |
| 1865 } | 1859 } |
| 1866 | 1860 |
| 1867 | 1861 |
| 1868 DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) { | 1862 DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) { |
| 1869 intptr_t cid = Api::ClassId(handle); | 1863 intptr_t cid = Api::ClassId(handle); |
| 1870 return RawObject::IsTypedDataClassId(cid) || | 1864 return RawObject::IsTypedDataClassId(cid) || |
| 1871 RawObject::IsExternalTypedDataClassId(cid) || | 1865 RawObject::IsExternalTypedDataClassId(cid) || |
| 1872 RawObject::IsTypedDataViewClassId(cid); | 1866 RawObject::IsTypedDataViewClassId(cid); |
| 1873 } | 1867 } |
| 1874 | 1868 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1906 API_TIMELINE_DURATION; | 1900 API_TIMELINE_DURATION; |
| 1907 DARTSCOPE(Thread::Current()); | 1901 DARTSCOPE(Thread::Current()); |
| 1908 Isolate* I = T->isolate(); | 1902 Isolate* I = T->isolate(); |
| 1909 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(instance)); | 1903 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(instance)); |
| 1910 if (obj.IsNull()) { | 1904 if (obj.IsNull()) { |
| 1911 return Api::NewHandle(T, I->object_store()->null_type()); | 1905 return Api::NewHandle(T, I->object_store()->null_type()); |
| 1912 } | 1906 } |
| 1913 if (!obj.IsInstance()) { | 1907 if (!obj.IsInstance()) { |
| 1914 RETURN_TYPE_ERROR(Z, instance, Instance); | 1908 RETURN_TYPE_ERROR(Z, instance, Instance); |
| 1915 } | 1909 } |
| 1916 const Type& type = Type::Handle(Instance::Cast(obj).GetType()); | 1910 const AbstractType& type = |
| 1911 AbstractType::Handle(Instance::Cast(obj).GetType()); |
| 1917 return Api::NewHandle(T, type.Canonicalize()); | 1912 return Api::NewHandle(T, type.Canonicalize()); |
| 1918 } | 1913 } |
| 1919 | 1914 |
| 1920 | 1915 |
| 1921 // --- Numbers, Integers and Doubles ---- | 1916 // --- Numbers, Integers and Doubles ---- |
| 1922 | 1917 |
| 1923 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, | 1918 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, |
| 1924 bool* fits) { | 1919 bool* fits) { |
| 1925 API_TIMELINE_DURATION; | 1920 API_TIMELINE_DURATION; |
| 1926 // Fast path for Smis and Mints. | 1921 // Fast path for Smis and Mints. |
| (...skipping 1950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3877 RETURN_TYPE_ERROR(Z, object, Instance); | 3872 RETURN_TYPE_ERROR(Z, object, Instance); |
| 3878 } | 3873 } |
| 3879 | 3874 |
| 3880 // Since we have allocated an object it would mean that the type | 3875 // Since we have allocated an object it would mean that the type |
| 3881 // is finalized. | 3876 // is finalized. |
| 3882 // TODO(asiva): How do we ensure that a constructor is not called more than | 3877 // TODO(asiva): How do we ensure that a constructor is not called more than |
| 3883 // once for the same object. | 3878 // once for the same object. |
| 3884 | 3879 |
| 3885 // Construct name of the constructor to invoke. | 3880 // Construct name of the constructor to invoke. |
| 3886 const String& constructor_name = Api::UnwrapStringHandle(Z, name); | 3881 const String& constructor_name = Api::UnwrapStringHandle(Z, name); |
| 3887 const Type& type_obj = Type::Handle(Z, instance.GetType()); | 3882 const AbstractType& type_obj = AbstractType::Handle(Z, instance.GetType()); |
| 3888 const Class& cls = Class::Handle(Z, type_obj.type_class()); | 3883 const Class& cls = Class::Handle(Z, type_obj.type_class()); |
| 3889 const String& class_name = String::Handle(Z, cls.Name()); | 3884 const String& class_name = String::Handle(Z, cls.Name()); |
| 3890 const Array& strings = Array::Handle(Z, Array::New(3)); | 3885 const Array& strings = Array::Handle(Z, Array::New(3)); |
| 3891 strings.SetAt(0, class_name); | 3886 strings.SetAt(0, class_name); |
| 3892 strings.SetAt(1, Symbols::Dot()); | 3887 strings.SetAt(1, Symbols::Dot()); |
| 3893 if (constructor_name.IsNull()) { | 3888 if (constructor_name.IsNull()) { |
| 3894 strings.SetAt(2, Symbols::Empty()); | 3889 strings.SetAt(2, Symbols::Empty()); |
| 3895 } else { | 3890 } else { |
| 3896 strings.SetAt(2, constructor_name); | 3891 strings.SetAt(2, constructor_name); |
| 3897 } | 3892 } |
| (...skipping 2076 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5974 return Api::Success(); | 5969 return Api::Success(); |
| 5975 } | 5970 } |
| 5976 #endif // DART_PRECOMPILED | 5971 #endif // DART_PRECOMPILED |
| 5977 | 5972 |
| 5978 | 5973 |
| 5979 DART_EXPORT bool Dart_IsRunningPrecompiledCode() { | 5974 DART_EXPORT bool Dart_IsRunningPrecompiledCode() { |
| 5980 return Dart::IsRunningPrecompiledCode(); | 5975 return Dart::IsRunningPrecompiledCode(); |
| 5981 } | 5976 } |
| 5982 | 5977 |
| 5983 } // namespace dart | 5978 } // namespace dart |
| OLD | NEW |