diff --git a/sdk/lib/_internal/lib/js_number.dart b/sdk/lib/_internal/lib/js_number.dart index de6986e8d86..1e3955c89a3 100644 --- a/sdk/lib/_internal/lib/js_number.dart +++ b/sdk/lib/_internal/lib/js_number.dart @@ -58,8 +58,14 @@ class JSNumber extends Interceptor implements num { } num abs() => JS('num', r'Math.abs(#)', this); + + static const int _MIN_INT32 = -0x80000000; + static const int _MAX_INT32 = 0x7FFFFFFF; int toInt() { + if (this >= _MIN_INT32 && this <= _MAX_INT32) { + return JS('int', '# | 0', this); + } if (JS('bool', r'isFinite(#)', this)) { return JS('int', r'# + 0', truncateToDouble()); // Converts -0.0 to +0.0. } diff --git a/tests/corelib/toInt_test.dart b/tests/corelib/toInt_test.dart new file mode 100644 index 00000000000..7a69691db7b --- /dev/null +++ b/tests/corelib/toInt_test.dart @@ -0,0 +1,20 @@ +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import "package:expect/expect.dart"; + +main() { + Expect.equals(-0x80000001, (-0x80000001).toInt()); + Expect.equals(-0x80000000, (-0x80000000 - 0.7).toInt()); + Expect.equals(-0x80000000, (-0x80000000 - 0.3).toInt()); + Expect.equals(-0x7FFFFFFF, (-0x80000000 + 0.3).toInt()); + Expect.equals(-0x7FFFFFFF, (-0x80000000 + 0.7).toInt()); + Expect.equals(-0x7FFFFFFF, (-0x7FFFFFFF).toInt()); + Expect.equals(0x7FFFFFFE, (0x7FFFFFFE).toInt()); + Expect.equals(0x7FFFFFFE, (0x7FFFFFFF - 0.7).toInt()); + Expect.equals(0x7FFFFFFE, (0x7FFFFFFF - 0.3).toInt()); + Expect.equals(0x7FFFFFFF, (0x7FFFFFFF + 0.3).toInt()); + Expect.equals(0x7FFFFFFF, (0x7FFFFFFF + 0.7).toInt()); + Expect.equals(0x80000000, 0x80000000.toInt()); +}