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/bigint_operations.h" | |
11 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
12 #include "vm/compiler.h" | 11 #include "vm/compiler.h" |
13 #include "vm/dart.h" | 12 #include "vm/dart.h" |
14 #include "vm/dart_api_impl.h" | 13 #include "vm/dart_api_impl.h" |
15 #include "vm/dart_api_message.h" | 14 #include "vm/dart_api_message.h" |
16 #include "vm/dart_api_state.h" | 15 #include "vm/dart_api_state.h" |
17 #include "vm/dart_entry.h" | 16 #include "vm/dart_entry.h" |
18 #include "vm/debuginfo.h" | 17 #include "vm/debuginfo.h" |
19 #include "vm/exceptions.h" | 18 #include "vm/exceptions.h" |
20 #include "vm/flags.h" | 19 #include "vm/flags.h" |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 return true; | 140 return true; |
142 } | 141 } |
143 Isolate* isolate = arguments->isolate(); | 142 Isolate* isolate = arguments->isolate(); |
144 ASSERT(isolate == Isolate::Current()); | 143 ASSERT(isolate == Isolate::Current()); |
145 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 144 REUSABLE_OBJECT_HANDLESCOPE(isolate); |
146 Object& obj = isolate->ObjectHandle(); | 145 Object& obj = isolate->ObjectHandle(); |
147 obj = arguments->NativeArgAt(arg_index); | 146 obj = arguments->NativeArgAt(arg_index); |
148 intptr_t cid = obj.GetClassId(); | 147 intptr_t cid = obj.GetClassId(); |
149 if (cid == kBigintCid) { | 148 if (cid == kBigintCid) { |
150 const Bigint& bigint = Bigint::Cast(obj); | 149 const Bigint& bigint = Bigint::Cast(obj); |
151 if (BigintOperations::FitsIntoInt64(bigint)) { | 150 if (bigint.FitsIntoInt64()) { |
152 *value = BigintOperations::ToInt64(bigint); | 151 *value = bigint.AsInt64Value(); |
153 return true; | 152 return true; |
154 } | 153 } |
155 } | 154 } |
156 return false; | 155 return false; |
157 } | 156 } |
158 | 157 |
159 | 158 |
160 static bool GetNativeUnsignedIntegerArgument(NativeArguments* arguments, | 159 static bool GetNativeUnsignedIntegerArgument(NativeArguments* arguments, |
161 int arg_index, | 160 int arg_index, |
162 uint64_t* value) { | 161 uint64_t* value) { |
163 ASSERT(value != NULL); | 162 ASSERT(value != NULL); |
164 int64_t arg_value = 0; | 163 int64_t arg_value = 0; |
165 if (Api::GetNativeIntegerArgument(arguments, arg_index, &arg_value)) { | 164 if (Api::GetNativeIntegerArgument(arguments, arg_index, &arg_value)) { |
166 *value = static_cast<uint64_t>(arg_value); | 165 *value = static_cast<uint64_t>(arg_value); |
167 return true; | 166 return true; |
168 } | 167 } |
169 Isolate* isolate = arguments->isolate(); | 168 Isolate* isolate = arguments->isolate(); |
170 ASSERT(isolate == Isolate::Current()); | 169 ASSERT(isolate == Isolate::Current()); |
171 REUSABLE_OBJECT_HANDLESCOPE(isolate); | 170 REUSABLE_OBJECT_HANDLESCOPE(isolate); |
172 Object& obj = isolate->ObjectHandle(); | 171 Object& obj = isolate->ObjectHandle(); |
173 obj = arguments->NativeArgAt(arg_index); | 172 obj = arguments->NativeArgAt(arg_index); |
174 intptr_t cid = obj.GetClassId(); | 173 intptr_t cid = obj.GetClassId(); |
175 if (cid == kBigintCid) { | 174 if (cid == kBigintCid) { |
176 const Bigint& bigint = Bigint::Cast(obj); | 175 const Bigint& bigint = Bigint::Cast(obj); |
177 if (BigintOperations::FitsIntoUint64(bigint)) { | 176 if (bigint.FitsIntoUint64()) { |
178 *value = BigintOperations::ToUint64(bigint); | 177 *value = bigint.AsUint64Value(); |
179 return true; | 178 return true; |
180 } | 179 } |
181 } | 180 } |
182 return false; | 181 return false; |
183 } | 182 } |
184 | 183 |
185 | 184 |
186 static bool GetNativeDoubleArgument(NativeArguments* arguments, | 185 static bool GetNativeDoubleArgument(NativeArguments* arguments, |
187 int arg_index, | 186 int arg_index, |
188 double* value) { | 187 double* value) { |
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
877 return Smi::Cast(result).Value(); | 876 return Smi::Cast(result).Value(); |
878 } | 877 } |
879 if (result.IsMint()) { | 878 if (result.IsMint()) { |
880 const Mint& mint = Mint::Cast(result); | 879 const Mint& mint = Mint::Cast(result); |
881 if (!mint.IsNegative()) { | 880 if (!mint.IsNegative()) { |
882 return mint.AsInt64Value(); | 881 return mint.AsInt64Value(); |
883 } | 882 } |
884 } | 883 } |
885 if (result.IsBigint()) { | 884 if (result.IsBigint()) { |
886 const Bigint& bigint = Bigint::Cast(result); | 885 const Bigint& bigint = Bigint::Cast(result); |
887 if (BigintOperations::FitsIntoUint64(bigint)) { | 886 if (bigint.FitsIntoUint64()) { |
888 return BigintOperations::ToUint64(bigint); | 887 return bigint.AsUint64Value(); |
889 } | 888 } |
890 } | 889 } |
891 return 0; | 890 return 0; |
892 } | 891 } |
893 | 892 |
894 | 893 |
895 DART_EXPORT Dart_Handle Dart_HandleFromPersistent( | 894 DART_EXPORT Dart_Handle Dart_HandleFromPersistent( |
896 Dart_PersistentHandle object) { | 895 Dart_PersistentHandle object) { |
897 Isolate* isolate = Isolate::Current(); | 896 Isolate* isolate = Isolate::Current(); |
898 CHECK_ISOLATE(isolate); | 897 CHECK_ISOLATE(isolate); |
(...skipping 1000 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1899 if (class_id == kSmiCid || class_id == kMintCid) { | 1898 if (class_id == kSmiCid || class_id == kMintCid) { |
1900 *fits = true; | 1899 *fits = true; |
1901 return Api::Success(); | 1900 return Api::Success(); |
1902 } | 1901 } |
1903 // Slow path for Mints and Bigints. | 1902 // Slow path for Mints and Bigints. |
1904 DARTSCOPE(isolate); | 1903 DARTSCOPE(isolate); |
1905 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); | 1904 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); |
1906 if (int_obj.IsNull()) { | 1905 if (int_obj.IsNull()) { |
1907 RETURN_TYPE_ERROR(isolate, integer, Integer); | 1906 RETURN_TYPE_ERROR(isolate, integer, Integer); |
1908 } | 1907 } |
1909 ASSERT(!BigintOperations::FitsIntoInt64(Bigint::Cast(int_obj))); | 1908 ASSERT(!Bigint::Cast(int_obj).FitsIntoInt64()); |
1910 *fits = false; | 1909 *fits = false; |
1911 return Api::Success(); | 1910 return Api::Success(); |
1912 } | 1911 } |
1913 | 1912 |
1914 | 1913 |
1915 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer, | 1914 DART_EXPORT Dart_Handle Dart_IntegerFitsIntoUint64(Dart_Handle integer, |
1916 bool* fits) { | 1915 bool* fits) { |
1917 // Fast path for Smis. | 1916 // Fast path for Smis. |
1918 Isolate* isolate = Isolate::Current(); | 1917 Isolate* isolate = Isolate::Current(); |
1919 CHECK_ISOLATE(isolate); | 1918 CHECK_ISOLATE(isolate); |
1920 if (Api::IsSmi(integer)) { | 1919 if (Api::IsSmi(integer)) { |
1921 *fits = (Api::SmiValue(integer) >= 0); | 1920 *fits = (Api::SmiValue(integer) >= 0); |
1922 return Api::Success(); | 1921 return Api::Success(); |
1923 } | 1922 } |
1924 // Slow path for Mints and Bigints. | 1923 // Slow path for Mints and Bigints. |
1925 DARTSCOPE(isolate); | 1924 DARTSCOPE(isolate); |
1926 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); | 1925 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); |
1927 if (int_obj.IsNull()) { | 1926 if (int_obj.IsNull()) { |
1928 RETURN_TYPE_ERROR(isolate, integer, Integer); | 1927 RETURN_TYPE_ERROR(isolate, integer, Integer); |
1929 } | 1928 } |
1930 ASSERT(!int_obj.IsSmi()); | 1929 ASSERT(!int_obj.IsSmi()); |
1931 if (int_obj.IsMint()) { | 1930 if (int_obj.IsMint()) { |
1932 *fits = !int_obj.IsNegative(); | 1931 *fits = !int_obj.IsNegative(); |
1933 } else { | 1932 } else { |
1934 *fits = BigintOperations::FitsIntoUint64(Bigint::Cast(int_obj)); | 1933 *fits = Bigint::Cast(int_obj).FitsIntoUint64(); |
1935 } | 1934 } |
1936 return Api::Success(); | 1935 return Api::Success(); |
1937 } | 1936 } |
1938 | 1937 |
1939 | 1938 |
1940 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) { | 1939 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) { |
1941 // Fast path for Smis. | 1940 // Fast path for Smis. |
1942 Isolate* isolate = Isolate::Current(); | 1941 Isolate* isolate = Isolate::Current(); |
1943 CHECK_ISOLATE(isolate); | 1942 CHECK_ISOLATE(isolate); |
1944 if (Smi::IsValid(value)) { | 1943 if (Smi::IsValid(value)) { |
(...skipping 30 matching lines...) Expand all Loading... |
1975 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); | 1974 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); |
1976 if (int_obj.IsNull()) { | 1975 if (int_obj.IsNull()) { |
1977 RETURN_TYPE_ERROR(isolate, integer, Integer); | 1976 RETURN_TYPE_ERROR(isolate, integer, Integer); |
1978 } | 1977 } |
1979 ASSERT(!int_obj.IsSmi()); | 1978 ASSERT(!int_obj.IsSmi()); |
1980 if (int_obj.IsMint()) { | 1979 if (int_obj.IsMint()) { |
1981 *value = int_obj.AsInt64Value(); | 1980 *value = int_obj.AsInt64Value(); |
1982 return Api::Success(); | 1981 return Api::Success(); |
1983 } else { | 1982 } else { |
1984 const Bigint& bigint = Bigint::Cast(int_obj); | 1983 const Bigint& bigint = Bigint::Cast(int_obj); |
1985 if (BigintOperations::FitsIntoInt64(bigint)) { | 1984 if (bigint.FitsIntoInt64()) { |
1986 *value = BigintOperations::ToInt64(bigint); | 1985 *value = bigint.AsInt64Value(); |
1987 return Api::Success(); | 1986 return Api::Success(); |
1988 } | 1987 } |
1989 } | 1988 } |
1990 return Api::NewError("%s: Integer %s cannot be represented as an int64_t.", | 1989 return Api::NewError("%s: Integer %s cannot be represented as an int64_t.", |
1991 CURRENT_FUNC, int_obj.ToCString()); | 1990 CURRENT_FUNC, int_obj.ToCString()); |
1992 } | 1991 } |
1993 | 1992 |
1994 | 1993 |
1995 DART_EXPORT Dart_Handle Dart_IntegerToUint64(Dart_Handle integer, | 1994 DART_EXPORT Dart_Handle Dart_IntegerToUint64(Dart_Handle integer, |
1996 uint64_t* value) { | 1995 uint64_t* value) { |
(...skipping 12 matching lines...) Expand all Loading... |
2009 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); | 2008 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); |
2010 if (int_obj.IsNull()) { | 2009 if (int_obj.IsNull()) { |
2011 RETURN_TYPE_ERROR(isolate, integer, Integer); | 2010 RETURN_TYPE_ERROR(isolate, integer, Integer); |
2012 } | 2011 } |
2013 ASSERT(!int_obj.IsSmi()); | 2012 ASSERT(!int_obj.IsSmi()); |
2014 if (int_obj.IsMint() && !int_obj.IsNegative()) { | 2013 if (int_obj.IsMint() && !int_obj.IsNegative()) { |
2015 *value = int_obj.AsInt64Value(); | 2014 *value = int_obj.AsInt64Value(); |
2016 return Api::Success(); | 2015 return Api::Success(); |
2017 } else { | 2016 } else { |
2018 const Bigint& bigint = Bigint::Cast(int_obj); | 2017 const Bigint& bigint = Bigint::Cast(int_obj); |
2019 if (BigintOperations::FitsIntoUint64(bigint)) { | 2018 if (bigint.FitsIntoUint64()) { |
2020 *value = BigintOperations::ToUint64(bigint); | 2019 *value = bigint.AsUint64Value(); |
2021 return Api::Success(); | 2020 return Api::Success(); |
2022 } | 2021 } |
2023 } | 2022 } |
2024 return Api::NewError("%s: Integer %s cannot be represented as a uint64_t.", | 2023 return Api::NewError("%s: Integer %s cannot be represented as a uint64_t.", |
2025 CURRENT_FUNC, int_obj.ToCString()); | 2024 CURRENT_FUNC, int_obj.ToCString()); |
2026 } | 2025 } |
2027 | 2026 |
2028 | 2027 |
2029 static uword BigintAllocate(intptr_t size) { | 2028 static uword BigintAllocate(intptr_t size) { |
2030 return Api::TopScope(Isolate::Current())->zone()->AllocUnsafe(size); | 2029 return Api::TopScope(Isolate::Current())->zone()->AllocUnsafe(size); |
2031 } | 2030 } |
2032 | 2031 |
2033 | 2032 |
2034 DART_EXPORT Dart_Handle Dart_IntegerToHexCString(Dart_Handle integer, | 2033 DART_EXPORT Dart_Handle Dart_IntegerToHexCString(Dart_Handle integer, |
2035 const char** value) { | 2034 const char** value) { |
2036 Isolate* isolate = Isolate::Current(); | 2035 Isolate* isolate = Isolate::Current(); |
2037 DARTSCOPE(isolate); | 2036 DARTSCOPE(isolate); |
2038 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); | 2037 const Integer& int_obj = Api::UnwrapIntegerHandle(isolate, integer); |
2039 if (int_obj.IsNull()) { | 2038 if (int_obj.IsNull()) { |
2040 RETURN_TYPE_ERROR(isolate, integer, Integer); | 2039 RETURN_TYPE_ERROR(isolate, integer, Integer); |
2041 } | 2040 } |
2042 if (int_obj.IsSmi() || int_obj.IsMint()) { | 2041 if (int_obj.IsSmi() || int_obj.IsMint()) { |
2043 const Bigint& bigint = Bigint::Handle(isolate, | 2042 const Bigint& bigint = Bigint::Handle(isolate, |
2044 BigintOperations::NewFromInt64(int_obj.AsInt64Value())); | 2043 Bigint::NewFromInt64(int_obj.AsInt64Value())); |
2045 *value = BigintOperations::ToHexCString(bigint, BigintAllocate); | 2044 *value = bigint.ToHexCString(BigintAllocate); |
2046 } else { | 2045 } else { |
2047 *value = BigintOperations::ToHexCString(Bigint::Cast(int_obj), | 2046 *value = Bigint::Cast(int_obj).ToHexCString(BigintAllocate); |
2048 BigintAllocate); | |
2049 } | 2047 } |
2050 return Api::Success(); | 2048 return Api::Success(); |
2051 } | 2049 } |
2052 | 2050 |
2053 | 2051 |
2054 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { | 2052 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { |
2055 Isolate* isolate = Isolate::Current(); | 2053 Isolate* isolate = Isolate::Current(); |
2056 DARTSCOPE(isolate); | 2054 DARTSCOPE(isolate); |
2057 CHECK_CALLBACK_STATE(isolate); | 2055 CHECK_CALLBACK_STATE(isolate); |
2058 return Api::NewHandle(isolate, Double::New(value)); | 2056 return Api::NewHandle(isolate, Double::New(value)); |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2478 } else if (retval.IsMint() || retval.IsBigint()) { | 2476 } else if (retval.IsMint() || retval.IsBigint()) { |
2479 if (retval.IsMint()) { | 2477 if (retval.IsMint()) { |
2480 int64_t mint_value = Mint::Cast(retval).value(); | 2478 int64_t mint_value = Mint::Cast(retval).value(); |
2481 if (mint_value >= kIntptrMin && mint_value <= kIntptrMax) { | 2479 if (mint_value >= kIntptrMin && mint_value <= kIntptrMax) { |
2482 *len = static_cast<intptr_t>(mint_value); | 2480 *len = static_cast<intptr_t>(mint_value); |
2483 } | 2481 } |
2484 } else { | 2482 } else { |
2485 // Check for a non-canonical Mint range value. | 2483 // Check for a non-canonical Mint range value. |
2486 ASSERT(retval.IsBigint()); | 2484 ASSERT(retval.IsBigint()); |
2487 const Bigint& bigint = Bigint::Handle(); | 2485 const Bigint& bigint = Bigint::Handle(); |
2488 if (BigintOperations::FitsIntoInt64(bigint)) { | 2486 if (bigint.FitsIntoInt64()) { |
2489 int64_t bigint_value = bigint.AsInt64Value(); | 2487 int64_t bigint_value = bigint.AsInt64Value(); |
2490 if (bigint_value >= kIntptrMin && bigint_value <= kIntptrMax) { | 2488 if (bigint_value >= kIntptrMin && bigint_value <= kIntptrMax) { |
2491 *len = static_cast<intptr_t>(bigint_value); | 2489 *len = static_cast<intptr_t>(bigint_value); |
2492 } | 2490 } |
2493 } | 2491 } |
2494 } | 2492 } |
2495 return Api::NewError("Length of List object is greater than the " | 2493 return Api::NewError("Length of List object is greater than the " |
2496 "maximum value that 'len' parameter can hold"); | 2494 "maximum value that 'len' parameter can hold"); |
2497 } else if (retval.IsError()) { | 2495 } else if (retval.IsError()) { |
2498 return Api::NewHandle(isolate, retval.raw()); | 2496 return Api::NewHandle(isolate, retval.raw()); |
(...skipping 2887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5386 | 5384 |
5387 | 5385 |
5388 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( | 5386 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( |
5389 const char* name, | 5387 const char* name, |
5390 Dart_ServiceRequestCallback callback, | 5388 Dart_ServiceRequestCallback callback, |
5391 void* user_data) { | 5389 void* user_data) { |
5392 Service::RegisterRootEmbedderCallback(name, callback, user_data); | 5390 Service::RegisterRootEmbedderCallback(name, callback, user_data); |
5393 } | 5391 } |
5394 | 5392 |
5395 } // namespace dart | 5393 } // namespace dart |
OLD | NEW |