Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(323)

Side by Side Diff: runtime/vm/dart_api_impl.cc

Issue 2982823002: Option to truncate integers to 64 bits, part 2 (Closed)
Patch Set: Reverting a few test changes for now Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698