// Copyright (c) 2012, 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. // part of "core_patch.dart"; @patch class Stopwatch { static const _maxInt = 0x7FFFFFFFFFFFFFFF; @patch static void _initTicker() { if (_frequency == null) { _frequency = _computeFrequency(); } } // Returns the current clock tick. @patch static int _now() native "Stopwatch_now"; // Returns the frequency of clock ticks in Hz. static int _computeFrequency() native "Stopwatch_frequency"; @patch int get elapsedMicroseconds { int ticks = elapsedTicks; // Special case the more likely frequencies to avoid division, // or divide by a known value. if (_frequency == 1000000000) return ticks ~/ 1000; if (_frequency == 1000000) return ticks; if (_frequency == 1000) return ticks * 1000; if (ticks <= (_maxInt ~/ 1000000)) { return (ticks * 1000000) ~/ _frequency; } // Multiplication would have overflowed. int ticksPerSecond = ticks ~/ _frequency; int remainingTicks = ticks.remainder(_frequency); return ticksPerSecond * 1000000 + (remainingTicks * 1000000) ~/ _frequency; } @patch int get elapsedMilliseconds { int ticks = elapsedTicks; if (_frequency == 1000000000) return ticks ~/ 1000000; if (_frequency == 1000000) return ticks ~/ 1000; if (_frequency == 1000) return ticks; if (ticks <= (_maxInt ~/ 1000)) { return (ticks * 1000) ~/ _frequency; } // Multiplication would have overflowed. int ticksPerSecond = ticks ~/ _frequency; int remainingTicks = ticks.remainder(_frequency); return ticksPerSecond * 1000 + (remainingTicks * 1000) ~/ _frequency; } }