| Index: src/conversions.cc
|
| ===================================================================
|
| --- src/conversions.cc (revision 7267)
|
| +++ src/conversions.cc (working copy)
|
| @@ -109,9 +109,11 @@
|
|
|
| // Returns true if a nonspace found and false if the end has reached.
|
| template <class Iterator, class EndMark>
|
| -static inline bool AdvanceToNonspace(Iterator* current, EndMark end) {
|
| +static inline bool AdvanceToNonspace(ScannerConstants* scanner_constants,
|
| + Iterator* current,
|
| + EndMark end) {
|
| while (*current != end) {
|
| - if (!ScannerConstants::kIsWhiteSpace.get(**current)) return true;
|
| + if (!scanner_constants->IsWhiteSpace(**current)) return true;
|
| ++*current;
|
| }
|
| return false;
|
| @@ -132,7 +134,8 @@
|
|
|
| // Parsing integers with radix 2, 4, 8, 16, 32. Assumes current != end.
|
| template <int radix_log_2, class Iterator, class EndMark>
|
| -static double InternalStringToIntDouble(Iterator current,
|
| +static double InternalStringToIntDouble(ScannerConstants* scanner_constants,
|
| + Iterator current,
|
| EndMark end,
|
| bool negative,
|
| bool allow_trailing_junk) {
|
| @@ -157,7 +160,8 @@
|
| } else if (radix > 10 && *current >= 'A' && *current < 'A' + radix - 10) {
|
| digit = static_cast<char>(*current) - 'A' + 10;
|
| } else {
|
| - if (allow_trailing_junk || !AdvanceToNonspace(¤t, end)) {
|
| + if (allow_trailing_junk ||
|
| + !AdvanceToNonspace(scanner_constants, ¤t, end)) {
|
| break;
|
| } else {
|
| return JUNK_STRING_VALUE;
|
| @@ -188,7 +192,8 @@
|
| exponent += radix_log_2;
|
| }
|
|
|
| - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) {
|
| + if (!allow_trailing_junk &&
|
| + AdvanceToNonspace(scanner_constants, ¤t, end)) {
|
| return JUNK_STRING_VALUE;
|
| }
|
|
|
| @@ -232,11 +237,16 @@
|
|
|
|
|
| template <class Iterator, class EndMark>
|
| -static double InternalStringToInt(Iterator current, EndMark end, int radix) {
|
| +static double InternalStringToInt(ScannerConstants* scanner_constants,
|
| + Iterator current,
|
| + EndMark end,
|
| + int radix) {
|
| const bool allow_trailing_junk = true;
|
| const double empty_string_val = JUNK_STRING_VALUE;
|
|
|
| - if (!AdvanceToNonspace(¤t, end)) return empty_string_val;
|
| + if (!AdvanceToNonspace(scanner_constants, ¤t, end)) {
|
| + return empty_string_val;
|
| + }
|
|
|
| bool negative = false;
|
| bool leading_zero = false;
|
| @@ -244,10 +254,14 @@
|
| if (*current == '+') {
|
| // Ignore leading sign; skip following spaces.
|
| ++current;
|
| - if (!AdvanceToNonspace(¤t, end)) return JUNK_STRING_VALUE;
|
| + if (!AdvanceToNonspace(scanner_constants, ¤t, end)) {
|
| + return JUNK_STRING_VALUE;
|
| + }
|
| } else if (*current == '-') {
|
| ++current;
|
| - if (!AdvanceToNonspace(¤t, end)) return JUNK_STRING_VALUE;
|
| + if (!AdvanceToNonspace(scanner_constants, ¤t, end)) {
|
| + return JUNK_STRING_VALUE;
|
| + }
|
| negative = true;
|
| }
|
|
|
| @@ -298,21 +312,21 @@
|
| switch (radix) {
|
| case 2:
|
| return InternalStringToIntDouble<1>(
|
| - current, end, negative, allow_trailing_junk);
|
| + scanner_constants, current, end, negative, allow_trailing_junk);
|
| case 4:
|
| return InternalStringToIntDouble<2>(
|
| - current, end, negative, allow_trailing_junk);
|
| + scanner_constants, current, end, negative, allow_trailing_junk);
|
| case 8:
|
| return InternalStringToIntDouble<3>(
|
| - current, end, negative, allow_trailing_junk);
|
| + scanner_constants, current, end, negative, allow_trailing_junk);
|
|
|
| case 16:
|
| return InternalStringToIntDouble<4>(
|
| - current, end, negative, allow_trailing_junk);
|
| + scanner_constants, current, end, negative, allow_trailing_junk);
|
|
|
| case 32:
|
| return InternalStringToIntDouble<5>(
|
| - current, end, negative, allow_trailing_junk);
|
| + scanner_constants, current, end, negative, allow_trailing_junk);
|
| default:
|
| UNREACHABLE();
|
| }
|
| @@ -337,7 +351,8 @@
|
| if (current == end) break;
|
| }
|
|
|
| - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) {
|
| + if (!allow_trailing_junk &&
|
| + AdvanceToNonspace(scanner_constants, ¤t, end)) {
|
| return JUNK_STRING_VALUE;
|
| }
|
|
|
| @@ -402,7 +417,8 @@
|
| v = v * multiplier + part;
|
| } while (!done);
|
|
|
| - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) {
|
| + if (!allow_trailing_junk &&
|
| + AdvanceToNonspace(scanner_constants, ¤t, end)) {
|
| return JUNK_STRING_VALUE;
|
| }
|
|
|
| @@ -416,7 +432,8 @@
|
| // 2. *current - gets the current character in the sequence.
|
| // 3. ++current (advances the position).
|
| template <class Iterator, class EndMark>
|
| -static double InternalStringToDouble(Iterator current,
|
| +static double InternalStringToDouble(ScannerConstants* scanner_constants,
|
| + Iterator current,
|
| EndMark end,
|
| int flags,
|
| double empty_string_val) {
|
| @@ -428,7 +445,9 @@
|
| // 'parsing_done'.
|
| // 4. 'current' is not dereferenced after the 'parsing_done' label.
|
| // 5. Code before 'parsing_done' may rely on 'current != end'.
|
| - if (!AdvanceToNonspace(¤t, end)) return empty_string_val;
|
| + if (!AdvanceToNonspace(scanner_constants, ¤t, end)) {
|
| + return empty_string_val;
|
| + }
|
|
|
| const bool allow_trailing_junk = (flags & ALLOW_TRAILING_JUNK) != 0;
|
|
|
| @@ -463,7 +482,8 @@
|
| return JUNK_STRING_VALUE;
|
| }
|
|
|
| - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) {
|
| + if (!allow_trailing_junk &&
|
| + AdvanceToNonspace(scanner_constants, ¤t, end)) {
|
| return JUNK_STRING_VALUE;
|
| }
|
|
|
| @@ -485,7 +505,8 @@
|
| return JUNK_STRING_VALUE; // "0x".
|
| }
|
|
|
| - return InternalStringToIntDouble<4>(current,
|
| + return InternalStringToIntDouble<4>(scanner_constants,
|
| + current,
|
| end,
|
| negative,
|
| allow_trailing_junk);
|
| @@ -621,7 +642,8 @@
|
| exponent += (sign == '-' ? -num : num);
|
| }
|
|
|
| - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) {
|
| + if (!allow_trailing_junk &&
|
| + AdvanceToNonspace(scanner_constants, ¤t, end)) {
|
| return JUNK_STRING_VALUE;
|
| }
|
|
|
| @@ -629,7 +651,8 @@
|
| exponent += insignificant_digits;
|
|
|
| if (octal) {
|
| - return InternalStringToIntDouble<3>(buffer,
|
| + return InternalStringToIntDouble<3>(scanner_constants,
|
| + buffer,
|
| buffer + buffer_pos,
|
| negative,
|
| allow_trailing_junk);
|
| @@ -649,18 +672,23 @@
|
|
|
|
|
| double StringToDouble(String* str, int flags, double empty_string_val) {
|
| + ScannerConstants* scanner_constants =
|
| + Isolate::Current()->scanner_constants();
|
| StringShape shape(str);
|
| if (shape.IsSequentialAscii()) {
|
| const char* begin = SeqAsciiString::cast(str)->GetChars();
|
| const char* end = begin + str->length();
|
| - return InternalStringToDouble(begin, end, flags, empty_string_val);
|
| + return InternalStringToDouble(scanner_constants, begin, end, flags,
|
| + empty_string_val);
|
| } else if (shape.IsSequentialTwoByte()) {
|
| const uc16* begin = SeqTwoByteString::cast(str)->GetChars();
|
| const uc16* end = begin + str->length();
|
| - return InternalStringToDouble(begin, end, flags, empty_string_val);
|
| + return InternalStringToDouble(scanner_constants, begin, end, flags,
|
| + empty_string_val);
|
| } else {
|
| StringInputBuffer buffer(str);
|
| - return InternalStringToDouble(StringInputBufferIterator(&buffer),
|
| + return InternalStringToDouble(scanner_constants,
|
| + StringInputBufferIterator(&buffer),
|
| StringInputBufferIterator::EndMarker(),
|
| flags,
|
| empty_string_val);
|
| @@ -669,18 +697,21 @@
|
|
|
|
|
| double StringToInt(String* str, int radix) {
|
| + ScannerConstants* scanner_constants =
|
| + Isolate::Current()->scanner_constants();
|
| StringShape shape(str);
|
| if (shape.IsSequentialAscii()) {
|
| const char* begin = SeqAsciiString::cast(str)->GetChars();
|
| const char* end = begin + str->length();
|
| - return InternalStringToInt(begin, end, radix);
|
| + return InternalStringToInt(scanner_constants, begin, end, radix);
|
| } else if (shape.IsSequentialTwoByte()) {
|
| const uc16* begin = SeqTwoByteString::cast(str)->GetChars();
|
| const uc16* end = begin + str->length();
|
| - return InternalStringToInt(begin, end, radix);
|
| + return InternalStringToInt(scanner_constants, begin, end, radix);
|
| } else {
|
| StringInputBuffer buffer(str);
|
| - return InternalStringToInt(StringInputBufferIterator(&buffer),
|
| + return InternalStringToInt(scanner_constants,
|
| + StringInputBufferIterator(&buffer),
|
| StringInputBufferIterator::EndMarker(),
|
| radix);
|
| }
|
| @@ -688,16 +719,22 @@
|
|
|
|
|
| double StringToDouble(const char* str, int flags, double empty_string_val) {
|
| + ScannerConstants* scanner_constants =
|
| + Isolate::Current()->scanner_constants();
|
| const char* end = str + StrLength(str);
|
| - return InternalStringToDouble(str, end, flags, empty_string_val);
|
| + return InternalStringToDouble(scanner_constants, str, end, flags,
|
| + empty_string_val);
|
| }
|
|
|
|
|
| double StringToDouble(Vector<const char> str,
|
| int flags,
|
| double empty_string_val) {
|
| + ScannerConstants* scanner_constants =
|
| + Isolate::Current()->scanner_constants();
|
| const char* end = str.start() + str.length();
|
| - return InternalStringToDouble(str.start(), end, flags, empty_string_val);
|
| + return InternalStringToDouble(scanner_constants, str.start(), end, flags,
|
| + empty_string_val);
|
| }
|
|
|
|
|
| @@ -1066,4 +1103,23 @@
|
| }
|
|
|
|
|
| +static Mutex* dtoa_lock_one = OS::CreateMutex();
|
| +static Mutex* dtoa_lock_zero = OS::CreateMutex();
|
| +
|
| +
|
| } } // namespace v8::internal
|
| +
|
| +
|
| +extern "C" {
|
| +void ACQUIRE_DTOA_LOCK(int n) {
|
| + ASSERT(n == 0 || n == 1);
|
| + (n == 0 ? v8::internal::dtoa_lock_zero : v8::internal::dtoa_lock_one)->Lock();
|
| +}
|
| +
|
| +
|
| +void FREE_DTOA_LOCK(int n) {
|
| + ASSERT(n == 0 || n == 1);
|
| + (n == 0 ? v8::internal::dtoa_lock_zero : v8::internal::dtoa_lock_one)->
|
| + Unlock();
|
| +}
|
| +}
|
|
|