// 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.
// Dart core library.

// VM implementation of double.

patch class double {

  static double _native_parse(_OneByteString string) native "Double_parse";

  static double _parse(var str) {
    str = str.trim();

    if (str.length == 0) return null;

    final ccid = str._cid;
    _OneByteString oneByteString;
    // TODO(floitsch): Allow _ExternalOneByteStrings. As of May 2013 they don't
    // have any _classId.
    if (ccid != _OneByteString._classId) {
      int length = str.length;
      var s = _OneByteString._allocate(length);
      for (int i = 0; i < length; i++) {
        int currentUnit = str.codeUnitAt(i);
        // All valid trimmed double strings must be ASCII.
        if (currentUnit < 128) {
          s._setAt(i, currentUnit);
        } else {
          return null;
        }
      }
      oneByteString = s;
    } else {
      oneByteString = str;
    }

    return _native_parse(oneByteString);
  }

  /* patch */ static double parse(String str,
                                  [double onError(String str)]) {
    var result = _parse(str);
    if (result == null) {
      if (onError == null) throw new FormatException(str);
      return onError(str);
    }
    return result;
  }
}
