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

Side by Side Diff: runtime/vm/object.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
« runtime/lib/double.cc ('K') | « runtime/vm/double_conversion.cc ('k') | no next file » | 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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/bigint_operations.h" 10 #include "vm/bigint_operations.h"
(...skipping 10568 matching lines...) Expand 10 before | Expand all | Expand 10 after
10579 Double::InstanceSize(), 10579 Double::InstanceSize(),
10580 space); 10580 space);
10581 NoGCScope no_gc; 10581 NoGCScope no_gc;
10582 result ^= raw; 10582 result ^= raw;
10583 } 10583 }
10584 result.set_value(d); 10584 result.set_value(d);
10585 return result.raw(); 10585 return result.raw();
10586 } 10586 }
10587 10587
10588 10588
10589 static bool IsWhiteSpace(char ch) {
10590 return ch == '\0' || ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t';
10591 }
10592
10593
10594 static bool StringToDouble(const String& str, double* double_value) {
10595 ASSERT(double_value != NULL);
10596 // TODO(regis): For now, we use strtod to convert a string to double.
10597 const char* nptr = str.ToCString();
10598 char* endptr = NULL;
10599 *double_value = strtod(nptr, &endptr);
10600 // We do not treat overflow or underflow as an error and therefore do not
10601 // check errno for ERANGE.
10602 if (!IsWhiteSpace(*endptr)) {
10603 return false;
10604 }
10605 return true;
10606 }
10607
10608
10609 RawDouble* Double::New(const String& str, Heap::Space space) { 10589 RawDouble* Double::New(const String& str, Heap::Space space) {
10610 double double_value; 10590 double double_value;
10611 if (!StringToDouble(str, &double_value)) { 10591 if (!CStringToDouble(str.ToCString(), str.Length(), &double_value)) {
10612 return Double::Handle().raw(); 10592 return Double::Handle().raw();
10613 } 10593 }
10614 return New(double_value, space); 10594 return New(double_value, space);
10615 } 10595 }
10616 10596
10617 10597
10618 RawDouble* Double::NewCanonical(double value) { 10598 RawDouble* Double::NewCanonical(double value) {
10619 const Class& cls = 10599 const Class& cls =
10620 Class::Handle(Isolate::Current()->object_store()->double_class()); 10600 Class::Handle(Isolate::Current()->object_store()->double_class());
10621 const Array& constants = Array::Handle(cls.constants()); 10601 const Array& constants = Array::Handle(cls.constants());
(...skipping 16 matching lines...) Expand all
10638 // it is full. 10618 // it is full.
10639 canonical_value = Double::New(value, Heap::kOld); 10619 canonical_value = Double::New(value, Heap::kOld);
10640 cls.InsertCanonicalConstant(index, canonical_value); 10620 cls.InsertCanonicalConstant(index, canonical_value);
10641 canonical_value.SetCanonical(); 10621 canonical_value.SetCanonical();
10642 return canonical_value.raw(); 10622 return canonical_value.raw();
10643 } 10623 }
10644 10624
10645 10625
10646 RawDouble* Double::NewCanonical(const String& str) { 10626 RawDouble* Double::NewCanonical(const String& str) {
10647 double double_value; 10627 double double_value;
10648 if (!StringToDouble(str, &double_value)) { 10628 if (!CStringToDouble(str.ToCString(), str.Length(), &double_value)) {
10649 return Double::Handle().raw(); 10629 return Double::Handle().raw();
10650 } 10630 }
10651 return NewCanonical(double_value); 10631 return NewCanonical(double_value);
10652 } 10632 }
10653 10633
10654 10634
10655 const char* Double::ToCString() const { 10635 const char* Double::ToCString() const {
10656 if (isnan(value())) { 10636 if (isnan(value())) {
10657 return "NaN"; 10637 return "NaN";
10658 } 10638 }
(...skipping 2390 matching lines...) Expand 10 before | Expand all | Expand 10 after
13049 } 13029 }
13050 return result.raw(); 13030 return result.raw();
13051 } 13031 }
13052 13032
13053 13033
13054 const char* WeakProperty::ToCString() const { 13034 const char* WeakProperty::ToCString() const {
13055 return "_WeakProperty"; 13035 return "_WeakProperty";
13056 } 13036 }
13057 13037
13058 } // namespace dart 13038 } // namespace dart
OLDNEW
« runtime/lib/double.cc ('K') | « runtime/vm/double_conversion.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698