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 "lib/stacktrace.h" | 9 #include "lib/stacktrace.h" |
10 #include "platform/assert.h" | 10 #include "platform/assert.h" |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
262 *value = static_cast<uint64_t>(arg_value); | 262 *value = static_cast<uint64_t>(arg_value); |
263 return true; | 263 return true; |
264 } | 264 } |
265 Thread* thread = arguments->thread(); | 265 Thread* thread = arguments->thread(); |
266 ASSERT(thread == Thread::Current()); | 266 ASSERT(thread == Thread::Current()); |
267 REUSABLE_OBJECT_HANDLESCOPE(thread); | 267 REUSABLE_OBJECT_HANDLESCOPE(thread); |
268 Object& obj = thread->ObjectHandle(); | 268 Object& obj = thread->ObjectHandle(); |
269 obj = arguments->NativeArgAt(arg_index); | 269 obj = arguments->NativeArgAt(arg_index); |
270 intptr_t cid = obj.GetClassId(); | 270 intptr_t cid = obj.GetClassId(); |
271 if (cid == kBigintCid) { | 271 if (cid == kBigintCid) { |
272 ASSERT(!Bigint::IsDisabled()); | |
272 const Bigint& bigint = Bigint::Cast(obj); | 273 const Bigint& bigint = Bigint::Cast(obj); |
273 if (bigint.FitsIntoUint64()) { | 274 if (bigint.FitsIntoUint64()) { |
274 *value = bigint.AsUint64Value(); | 275 *value = bigint.AsUint64Value(); |
275 return true; | 276 return true; |
276 } | 277 } |
277 } | 278 } |
278 return false; | 279 return false; |
279 } | 280 } |
280 | 281 |
281 static bool GetNativeDoubleArgument(NativeArguments* arguments, | 282 static bool GetNativeDoubleArgument(NativeArguments* arguments, |
(...skipping 1723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2005 // Slow path for Mints and Bigints. | 2006 // Slow path for Mints and Bigints. |
2006 DARTSCOPE(thread); | 2007 DARTSCOPE(thread); |
2007 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); | 2008 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
2008 if (int_obj.IsNull()) { | 2009 if (int_obj.IsNull()) { |
2009 RETURN_TYPE_ERROR(Z, integer, Integer); | 2010 RETURN_TYPE_ERROR(Z, integer, Integer); |
2010 } | 2011 } |
2011 ASSERT(!int_obj.IsSmi()); | 2012 ASSERT(!int_obj.IsSmi()); |
2012 if (int_obj.IsMint()) { | 2013 if (int_obj.IsMint()) { |
2013 *fits = !int_obj.IsNegative(); | 2014 *fits = !int_obj.IsNegative(); |
2014 } else { | 2015 } else { |
2016 ASSERT(!Bigint::IsDisabled()); | |
2015 *fits = Bigint::Cast(int_obj).FitsIntoUint64(); | 2017 *fits = Bigint::Cast(int_obj).FitsIntoUint64(); |
2016 } | 2018 } |
2017 return Api::Success(); | 2019 return Api::Success(); |
2018 } | 2020 } |
2019 | 2021 |
2020 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) { | 2022 DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value) { |
2021 // Fast path for Smis. | 2023 // Fast path for Smis. |
2022 Thread* thread = Thread::Current(); | 2024 Thread* thread = Thread::Current(); |
2023 Isolate* isolate = thread->isolate(); | 2025 Isolate* isolate = thread->isolate(); |
2024 CHECK_ISOLATE(isolate); | 2026 CHECK_ISOLATE(isolate); |
2025 API_TIMELINE_DURATION; | 2027 API_TIMELINE_DURATION; |
2026 if (Smi::IsValid(value)) { | 2028 if (Smi::IsValid(value)) { |
2027 NOHANDLESCOPE(thread); | 2029 NOHANDLESCOPE(thread); |
2028 return Api::NewHandle(thread, Smi::New(static_cast<intptr_t>(value))); | 2030 return Api::NewHandle(thread, Smi::New(static_cast<intptr_t>(value))); |
2029 } | 2031 } |
2030 // Slow path for Mints and Bigints. | 2032 // Slow path for Mints and Bigints. |
2031 DARTSCOPE(thread); | 2033 DARTSCOPE(thread); |
2032 CHECK_CALLBACK_STATE(thread); | 2034 CHECK_CALLBACK_STATE(thread); |
2033 return Api::NewHandle(thread, Integer::New(value)); | 2035 return Api::NewHandle(thread, Integer::New(value)); |
2034 } | 2036 } |
2035 | 2037 |
2036 DART_EXPORT Dart_Handle Dart_NewIntegerFromUint64(uint64_t value) { | 2038 DART_EXPORT Dart_Handle Dart_NewIntegerFromUint64(uint64_t value) { |
2037 DARTSCOPE(Thread::Current()); | 2039 DARTSCOPE(Thread::Current()); |
2038 CHECK_CALLBACK_STATE(T); | 2040 CHECK_CALLBACK_STATE(T); |
2039 API_TIMELINE_DURATION; | 2041 API_TIMELINE_DURATION; |
2040 return Api::NewHandle(T, Integer::NewFromUint64(value)); | 2042 RawInteger* integer = Integer::NewFromUint64(value); |
2043 if (integer == Integer::null()) { | |
2044 return Api::NewError("%s: Cannot create Dart integer from value %" Pu64, | |
2045 CURRENT_FUNC, value); | |
2046 } | |
2047 return Api::NewHandle(T, integer); | |
2041 } | 2048 } |
2042 | 2049 |
2043 DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) { | 2050 DART_EXPORT Dart_Handle Dart_NewIntegerFromHexCString(const char* str) { |
2044 DARTSCOPE(Thread::Current()); | 2051 DARTSCOPE(Thread::Current()); |
2045 CHECK_CALLBACK_STATE(T); | 2052 CHECK_CALLBACK_STATE(T); |
2046 API_TIMELINE_DURATION; | 2053 API_TIMELINE_DURATION; |
2047 const String& str_obj = String::Handle(Z, String::New(str)); | 2054 const String& str_obj = String::Handle(Z, String::New(str)); |
2048 return Api::NewHandle(T, Integer::New(str_obj)); | 2055 RawInteger* integer = Integer::New(str_obj); |
2056 if (integer == Integer::null()) { | |
2057 return Api::NewError("%s: Cannot create Dart integer from string %s", | |
2058 CURRENT_FUNC, str); | |
2059 } | |
2060 return Api::NewHandle(T, integer); | |
2049 } | 2061 } |
2050 | 2062 |
2051 DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, | 2063 DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, |
2052 int64_t* value) { | 2064 int64_t* value) { |
2053 // Fast path for Smis. | 2065 // Fast path for Smis. |
2054 Thread* thread = Thread::Current(); | 2066 Thread* thread = Thread::Current(); |
2055 Isolate* isolate = thread->isolate(); | 2067 Isolate* isolate = thread->isolate(); |
2056 CHECK_ISOLATE(isolate); | 2068 CHECK_ISOLATE(isolate); |
2057 if (Api::IsSmi(integer)) { | 2069 if (Api::IsSmi(integer)) { |
2058 *value = Api::SmiValue(integer); | 2070 *value = Api::SmiValue(integer); |
2059 return Api::Success(); | 2071 return Api::Success(); |
2060 } | 2072 } |
2061 // Slow path for Mints and Bigints. | 2073 // Slow path for Mints and Bigints. |
2062 DARTSCOPE(thread); | 2074 DARTSCOPE(thread); |
2063 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); | 2075 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
2064 if (int_obj.IsNull()) { | 2076 if (int_obj.IsNull()) { |
2065 RETURN_TYPE_ERROR(Z, integer, Integer); | 2077 RETURN_TYPE_ERROR(Z, integer, Integer); |
2066 } | 2078 } |
2067 ASSERT(!int_obj.IsSmi()); | 2079 ASSERT(!int_obj.IsSmi()); |
2068 if (int_obj.IsMint()) { | 2080 if (int_obj.IsMint()) { |
2069 *value = int_obj.AsInt64Value(); | 2081 *value = int_obj.AsInt64Value(); |
2070 return Api::Success(); | 2082 return Api::Success(); |
2071 } else { | 2083 } else { |
2084 ASSERT(!Bigint::IsDisabled()); | |
2072 const Bigint& bigint = Bigint::Cast(int_obj); | 2085 const Bigint& bigint = Bigint::Cast(int_obj); |
2073 if (bigint.FitsIntoInt64()) { | 2086 if (bigint.FitsIntoInt64()) { |
2074 *value = bigint.AsInt64Value(); | 2087 *value = bigint.AsInt64Value(); |
2075 return Api::Success(); | 2088 return Api::Success(); |
2076 } | 2089 } |
2077 } | 2090 } |
2078 return Api::NewError("%s: Integer %s cannot be represented as an int64_t.", | 2091 return Api::NewError("%s: Integer %s cannot be represented as an int64_t.", |
2079 CURRENT_FUNC, int_obj.ToCString()); | 2092 CURRENT_FUNC, int_obj.ToCString()); |
2080 } | 2093 } |
2081 | 2094 |
(...skipping 17 matching lines...) Expand all Loading... | |
2099 RETURN_TYPE_ERROR(Z, integer, Integer); | 2112 RETURN_TYPE_ERROR(Z, integer, Integer); |
2100 } | 2113 } |
2101 if (int_obj.IsSmi()) { | 2114 if (int_obj.IsSmi()) { |
2102 ASSERT(int_obj.IsNegative()); | 2115 ASSERT(int_obj.IsNegative()); |
2103 } else if (int_obj.IsMint()) { | 2116 } else if (int_obj.IsMint()) { |
2104 if (!int_obj.IsNegative()) { | 2117 if (!int_obj.IsNegative()) { |
2105 *value = int_obj.AsInt64Value(); | 2118 *value = int_obj.AsInt64Value(); |
2106 return Api::Success(); | 2119 return Api::Success(); |
2107 } | 2120 } |
2108 } else { | 2121 } else { |
2122 ASSERT(!Bigint::IsDisabled()); | |
2109 const Bigint& bigint = Bigint::Cast(int_obj); | 2123 const Bigint& bigint = Bigint::Cast(int_obj); |
2110 if (bigint.FitsIntoUint64()) { | 2124 if (bigint.FitsIntoUint64()) { |
2111 *value = bigint.AsUint64Value(); | 2125 *value = bigint.AsUint64Value(); |
2112 return Api::Success(); | 2126 return Api::Success(); |
2113 } | 2127 } |
2114 } | 2128 } |
2115 return Api::NewError("%s: Integer %s cannot be represented as a uint64_t.", | 2129 return Api::NewError("%s: Integer %s cannot be represented as a uint64_t.", |
2116 CURRENT_FUNC, int_obj.ToCString()); | 2130 CURRENT_FUNC, int_obj.ToCString()); |
2117 } | 2131 } |
2118 | 2132 |
(...skipping 959 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3078 type = Dart_TypedData_kUint32; | 3092 type = Dart_TypedData_kUint32; |
3079 break; | 3093 break; |
3080 case kTypedDataInt64ArrayCid: | 3094 case kTypedDataInt64ArrayCid: |
3081 case kTypedDataInt64ArrayViewCid: | 3095 case kTypedDataInt64ArrayViewCid: |
3082 case kExternalTypedDataInt64ArrayCid: | 3096 case kExternalTypedDataInt64ArrayCid: |
3083 type = Dart_TypedData_kInt64; | 3097 type = Dart_TypedData_kInt64; |
3084 break; | 3098 break; |
3085 case kTypedDataUint64ArrayCid: | 3099 case kTypedDataUint64ArrayCid: |
3086 case kTypedDataUint64ArrayViewCid: | 3100 case kTypedDataUint64ArrayViewCid: |
3087 case kExternalTypedDataUint64ArrayCid: | 3101 case kExternalTypedDataUint64ArrayCid: |
3102 // TODO(alexmarkov): Figure out if Uint64 should be rejected in | |
zra
2017/07/14 17:36:30
I think we'll probably need to keep these. When we
alexmarkov
2017/07/14 18:23:45
Done.
| |
3103 // --limit-ints-to-64-bits mode. | |
3088 type = Dart_TypedData_kUint64; | 3104 type = Dart_TypedData_kUint64; |
3089 break; | 3105 break; |
3090 case kTypedDataFloat32ArrayCid: | 3106 case kTypedDataFloat32ArrayCid: |
3091 case kTypedDataFloat32ArrayViewCid: | 3107 case kTypedDataFloat32ArrayViewCid: |
3092 case kExternalTypedDataFloat32ArrayCid: | 3108 case kExternalTypedDataFloat32ArrayCid: |
3093 type = Dart_TypedData_kFloat32; | 3109 type = Dart_TypedData_kFloat32; |
3094 break; | 3110 break; |
3095 case kTypedDataFloat64ArrayCid: | 3111 case kTypedDataFloat64ArrayCid: |
3096 case kTypedDataFloat64ArrayViewCid: | 3112 case kTypedDataFloat64ArrayViewCid: |
3097 case kExternalTypedDataFloat64ArrayCid: | 3113 case kExternalTypedDataFloat64ArrayCid: |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3246 return NewTypedData(T, kTypedDataInt16ArrayCid, length); | 3262 return NewTypedData(T, kTypedDataInt16ArrayCid, length); |
3247 case Dart_TypedData_kUint16: | 3263 case Dart_TypedData_kUint16: |
3248 return NewTypedData(T, kTypedDataUint16ArrayCid, length); | 3264 return NewTypedData(T, kTypedDataUint16ArrayCid, length); |
3249 case Dart_TypedData_kInt32: | 3265 case Dart_TypedData_kInt32: |
3250 return NewTypedData(T, kTypedDataInt32ArrayCid, length); | 3266 return NewTypedData(T, kTypedDataInt32ArrayCid, length); |
3251 case Dart_TypedData_kUint32: | 3267 case Dart_TypedData_kUint32: |
3252 return NewTypedData(T, kTypedDataUint32ArrayCid, length); | 3268 return NewTypedData(T, kTypedDataUint32ArrayCid, length); |
3253 case Dart_TypedData_kInt64: | 3269 case Dart_TypedData_kInt64: |
3254 return NewTypedData(T, kTypedDataInt64ArrayCid, length); | 3270 return NewTypedData(T, kTypedDataInt64ArrayCid, length); |
3255 case Dart_TypedData_kUint64: | 3271 case Dart_TypedData_kUint64: |
3272 // TODO(alexmarkov): Figure out if Uint64 should be rejected in | |
zra
2017/07/14 17:36:30
ditto
alexmarkov
2017/07/14 18:23:45
Done.
| |
3273 // --limit-ints-to-64-bits mode. | |
3256 return NewTypedData(T, kTypedDataUint64ArrayCid, length); | 3274 return NewTypedData(T, kTypedDataUint64ArrayCid, length); |
3257 case Dart_TypedData_kFloat32: | 3275 case Dart_TypedData_kFloat32: |
3258 return NewTypedData(T, kTypedDataFloat32ArrayCid, length); | 3276 return NewTypedData(T, kTypedDataFloat32ArrayCid, length); |
3259 case Dart_TypedData_kFloat64: | 3277 case Dart_TypedData_kFloat64: |
3260 return NewTypedData(T, kTypedDataFloat64ArrayCid, length); | 3278 return NewTypedData(T, kTypedDataFloat64ArrayCid, length); |
3261 case Dart_TypedData_kFloat32x4: | 3279 case Dart_TypedData_kFloat32x4: |
3262 return NewTypedData(T, kTypedDataFloat32x4ArrayCid, length); | 3280 return NewTypedData(T, kTypedDataFloat32x4ArrayCid, length); |
3263 default: | 3281 default: |
3264 return Api::NewError("%s expects argument 'type' to be of 'TypedData'", | 3282 return Api::NewError("%s expects argument 'type' to be of 'TypedData'", |
3265 CURRENT_FUNC); | 3283 CURRENT_FUNC); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3297 case Dart_TypedData_kInt32: | 3315 case Dart_TypedData_kInt32: |
3298 return NewExternalTypedData(T, kExternalTypedDataInt32ArrayCid, data, | 3316 return NewExternalTypedData(T, kExternalTypedDataInt32ArrayCid, data, |
3299 length); | 3317 length); |
3300 case Dart_TypedData_kUint32: | 3318 case Dart_TypedData_kUint32: |
3301 return NewExternalTypedData(T, kExternalTypedDataUint32ArrayCid, data, | 3319 return NewExternalTypedData(T, kExternalTypedDataUint32ArrayCid, data, |
3302 length); | 3320 length); |
3303 case Dart_TypedData_kInt64: | 3321 case Dart_TypedData_kInt64: |
3304 return NewExternalTypedData(T, kExternalTypedDataInt64ArrayCid, data, | 3322 return NewExternalTypedData(T, kExternalTypedDataInt64ArrayCid, data, |
3305 length); | 3323 length); |
3306 case Dart_TypedData_kUint64: | 3324 case Dart_TypedData_kUint64: |
3325 // TODO(alexmarkov): Figure out if Uint64 should be rejected in | |
3326 // --limit-ints-to-64-bits mode. | |
3307 return NewExternalTypedData(T, kExternalTypedDataUint64ArrayCid, data, | 3327 return NewExternalTypedData(T, kExternalTypedDataUint64ArrayCid, data, |
3308 length); | 3328 length); |
3309 case Dart_TypedData_kFloat32: | 3329 case Dart_TypedData_kFloat32: |
3310 return NewExternalTypedData(T, kExternalTypedDataFloat32ArrayCid, data, | 3330 return NewExternalTypedData(T, kExternalTypedDataFloat32ArrayCid, data, |
3311 length); | 3331 length); |
3312 case Dart_TypedData_kFloat64: | 3332 case Dart_TypedData_kFloat64: |
3313 return NewExternalTypedData(T, kExternalTypedDataFloat64ArrayCid, data, | 3333 return NewExternalTypedData(T, kExternalTypedDataFloat64ArrayCid, data, |
3314 length); | 3334 length); |
3315 case Dart_TypedData_kFloat32x4: | 3335 case Dart_TypedData_kFloat32x4: |
3316 return NewExternalTypedData(T, kExternalTypedDataFloat32x4ArrayCid, data, | 3336 return NewExternalTypedData(T, kExternalTypedDataFloat32x4ArrayCid, data, |
(...skipping 3339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6656 #endif | 6676 #endif |
6657 } | 6677 } |
6658 | 6678 |
6659 DART_EXPORT void Dart_DumpNativeStackTrace(void* context) { | 6679 DART_EXPORT void Dart_DumpNativeStackTrace(void* context) { |
6660 #ifndef PRODUCT | 6680 #ifndef PRODUCT |
6661 Profiler::DumpStackTrace(context); | 6681 Profiler::DumpStackTrace(context); |
6662 #endif | 6682 #endif |
6663 } | 6683 } |
6664 | 6684 |
6665 } // namespace dart | 6685 } // namespace dart |
OLD | NEW |