Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: runtime/lib/double.cc

Issue 13529014: Use locale insensitive method to parse double literals. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address Srdjan's comments Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | runtime/vm/double_conversion.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include <math.h> 5 #include <math.h>
6 6
7 #include "vm/bootstrap_natives.h" 7 #include "vm/bootstrap_natives.h"
8 8
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/code_generator.h" // DartModulo. 10 #include "vm/code_generator.h" // DartModulo.
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 const char* tmp = cstr; 214 const char* tmp = cstr;
215 while (*tmp != '\0') { 215 while (*tmp != '\0') {
216 const char ch = *tmp++; 216 const char ch = *tmp++;
217 if (ch == '.') { 217 if (ch == '.') {
218 const char nextCh = *tmp; 218 const char nextCh = *tmp;
219 dot_ok = ('0' <= nextCh) && (nextCh <= '9'); 219 dot_ok = ('0' <= nextCh) && (nextCh <= '9');
220 break; 220 break;
221 } 221 }
222 } 222 }
223 if (dot_ok) { 223 if (dot_ok) {
224 char* p_end = NULL; 224 double double_value;
225 const double double_value = strtod(cstr, &p_end); 225 if (CStringToDouble(cstr, len, &double_value)) {
226 if (p_end == (cstr + len)) {
227 return Double::New(double_value); 226 return Double::New(double_value);
228 } 227 }
229 } 228 }
230 } 229 }
231 } 230 }
232 } 231 }
233 Scanner scanner(value, Symbols::Empty()); 232 Scanner scanner(value, Symbols::Empty());
234 const Scanner::GrowableTokenStream& tokens = scanner.GetStream(); 233 const Scanner::GrowableTokenStream& tokens = scanner.GetStream();
235 String* number_string; 234 String* number_string;
236 bool is_positive; 235 bool is_positive;
237 if (Scanner::IsValidLiteral(tokens, 236 if (Scanner::IsValidLiteral(tokens,
238 Token::kDOUBLE, 237 Token::kDOUBLE,
239 &is_positive, 238 &is_positive,
240 &number_string)) { 239 &number_string)) {
240 ASSERT(number_string->IsOneByteString());
Ivan Posva 2013/04/05 21:56:42 Please explain here why you are allowed to make th
Vyacheslav Egorov (Google) 2013/04/08 14:25:04 Done.
241 const char* cstr = number_string->ToCString(); 241 const char* cstr = number_string->ToCString();
242 char* p_end = NULL; 242
243 double double_value = strtod(cstr, &p_end); 243 double double_value;
244 ASSERT(p_end != cstr); 244 bool ok = CStringToDouble(cstr, number_string->Length(), &double_value);
245 USE(ok);
Ivan Posva 2013/04/05 21:56:42 I would have thought USE is not necessary here.
Vyacheslav Egorov (Google) 2013/04/08 14:25:04 Done.
246 ASSERT(ok);
247
245 if (!is_positive) { 248 if (!is_positive) {
246 double_value = -double_value; 249 double_value = -double_value;
247 } 250 }
248 return Double::New(double_value); 251 return Double::New(double_value);
249 } 252 }
250 253
251 if (Scanner::IsValidLiteral(tokens, 254 if (Scanner::IsValidLiteral(tokens,
252 Token::kINTEGER, 255 Token::kINTEGER,
253 &is_positive, 256 &is_positive,
254 &number_string)) { 257 &number_string)) {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 356
354 DEFINE_NATIVE_ENTRY(Double_getIsNegative, 1) { 357 DEFINE_NATIVE_ENTRY(Double_getIsNegative, 1) {
355 const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0)); 358 const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
356 // Include negative zero, infinity. 359 // Include negative zero, infinity.
357 return Bool::Get(signbit(arg.value()) && !isnan(arg.value())); 360 return Bool::Get(signbit(arg.value()) && !isnan(arg.value()));
358 } 361 }
359 362
360 // Add here only functions using/referring to old-style casts. 363 // Add here only functions using/referring to old-style casts.
361 364
362 } // namespace dart 365 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/double_conversion.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698