Index: runtime/lib/double.cc |
=================================================================== |
--- runtime/lib/double.cc (revision 18922) |
+++ runtime/lib/double.cc (working copy) |
@@ -200,6 +200,36 @@ |
DEFINE_NATIVE_ENTRY(Double_parse, 1) { |
GET_NON_NULL_NATIVE_ARGUMENT(String, value, arguments->NativeArgAt(0)); |
+ if (value.IsOneByteString()) { |
+ // Quick conversion for unpadded doubles in strings. |
+ const intptr_t len = value.Length(); |
+ if (len > 0) { |
+ const char* cstr = value.ToCString(); |
+ ASSERT(cstr != NULL); |
+ // Dart differences from strtod: |
+ // a) '5.' is not a valid double (no digit after period). |
+ // b) '+5.0' is not a valid double (leading plus). |
+ if (cstr[0] != '+') { |
+ bool dot_ok = true; |
+ const char* tmp = cstr; |
+ while (*tmp != '\0') { |
+ const char ch = *tmp++; |
+ if (ch == '.') { |
+ const char nextCh = *tmp; |
+ dot_ok = ('0' <= nextCh) && (nextCh <= '9'); |
+ break; |
+ } |
+ } |
+ if (dot_ok) { |
+ char* p_end = NULL; |
+ const double double_value = strtod(cstr, &p_end); |
+ if (p_end == (cstr + len)) { |
+ return Double::New(double_value); |
+ } |
+ } |
+ } |
+ } |
+ } |
Scanner scanner(value, Symbols::Empty()); |
const Scanner::GrowableTokenStream& tokens = scanner.GetStream(); |
String* number_string; |