From 581fa005f92dd5f367c8a3a80cc71cd40a86afe3 Mon Sep 17 00:00:00 2001 From: "ngeoffray@google.com" Date: Thu, 24 Oct 2013 08:44:32 +0000 Subject: [PATCH] Faster JSNumber:toInt. R=lrn@google.com Review URL: https://codereview.chromium.org//38353005 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@29162 260f80e4-7a28-3924-810f-c04153c831b5 --- sdk/lib/_internal/lib/js_number.dart | 6 ++++++ tests/corelib/toInt_test.dart | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 tests/corelib/toInt_test.dart 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()); +}