Index: src/json-parser.h |
=================================================================== |
--- src/json-parser.h (revision 8350) |
+++ src/json-parser.h (working copy) |
@@ -109,7 +109,7 @@ |
Handle<String> ScanJsonString(); |
// Slow version for unicode support, uses the first ascii_count characters, |
// as first part of a ConsString |
- Handle<String> SlowScanJsonString(); |
+ Handle<String> SlowScanJsonString(int beg_pos); |
// A JSON number (production JSONNumber) is a subset of the valid JavaScript |
// decimal number literals. |
@@ -156,15 +156,9 @@ |
int source_length_; |
Handle<SeqAsciiString> seq_source_; |
- // begin and end position of scanned string or number |
- int beg_pos_; |
- int end_pos_; |
- |
Isolate* isolate_; |
uc32 c0_; |
int position_; |
- |
- double number_; |
}; |
template <bool seq_ascii> |
@@ -353,7 +347,7 @@ |
template <bool seq_ascii> |
Handle<Object> JsonParser<seq_ascii>::ParseJsonNumber() { |
bool negative = false; |
- beg_pos_ = position_; |
+ int beg_pos = position_; |
if (c0_ == '-') { |
Advance(); |
negative = true; |
@@ -373,9 +367,8 @@ |
Advance(); |
} while (c0_ >= '0' && c0_ <= '9'); |
if (c0_ != '.' && c0_ != 'e' && c0_ != 'E' && digits < 10) { |
- number_ = (negative ? -i : i); |
SkipWhitespace(); |
- return isolate()->factory()->NewNumber(number_); |
+ return Handle<Smi>(Smi::FromInt((negative ? -i : i)), isolate()); |
} |
} |
if (c0_ == '.') { |
@@ -393,35 +386,36 @@ |
Advance(); |
} while (c0_ >= '0' && c0_ <= '9'); |
} |
- int length = position_ - beg_pos_; |
+ int length = position_ - beg_pos; |
+ double number; |
if (seq_ascii) { |
- Vector<const char> chars(seq_source_->GetChars() + beg_pos_, length); |
- number_ = StringToDouble(isolate()->unicode_cache(), |
+ Vector<const char> chars(seq_source_->GetChars() + beg_pos, length); |
+ number = StringToDouble(isolate()->unicode_cache(), |
chars, |
NO_FLAGS, // Hex, octal or trailing junk. |
OS::nan_value()); |
} else { |
Vector<char> buffer = Vector<char>::New(length); |
- String::WriteToFlat(*source_, buffer.start(), beg_pos_, position_); |
+ String::WriteToFlat(*source_, buffer.start(), beg_pos, position_); |
Vector<const char> result = |
Vector<const char>(reinterpret_cast<const char*>(buffer.start()), |
length); |
- number_ = StringToDouble(isolate()->unicode_cache(), |
+ number = StringToDouble(isolate()->unicode_cache(), |
result, |
NO_FLAGS, // Hex, octal or trailing junk. |
0.0); |
buffer.Dispose(); |
} |
SkipWhitespace(); |
- return isolate()->factory()->NewNumber(number_); |
+ return isolate()->factory()->NewNumber(number); |
} |
template <bool seq_ascii> |
-Handle<String> JsonParser<seq_ascii>::SlowScanJsonString() { |
+Handle<String> JsonParser<seq_ascii>::SlowScanJsonString(int beg_pos) { |
// The currently scanned ascii characters. |
- Handle<String> ascii(isolate()->factory()->NewSubString(source_, |
- beg_pos_, |
- position_)); |
+ Handle<String> ascii(isolate()->factory()->NewStrictSubString(source_, |
+ beg_pos, |
+ position_)); |
Handle<String> two_byte = |
isolate()->factory()->NewRawTwoByteString(kInitialSpecialStringSize, |
NOT_TENURED); |
@@ -518,7 +512,7 @@ |
Handle<String> JsonParser<seq_ascii>::ScanJsonString() { |
ASSERT_EQ('"', c0_); |
Advance(); |
- beg_pos_ = position_; |
+ int beg_pos = position_; |
// Fast case for ascii only without escape characters. |
while (c0_ != '"') { |
// Check for control character (0x00-0x1f) or unterminated string (<0). |
@@ -526,19 +520,21 @@ |
if (c0_ != '\\' && (seq_ascii || c0_ < kMaxAsciiCharCode)) { |
Advance(); |
} else { |
- return this->SlowScanJsonString(); |
+ return this->SlowScanJsonString(beg_pos); |
} |
} |
ASSERT_EQ('"', c0_); |
- end_pos_ = position_; |
+ int end_pos = position_; |
// Advance past the last '"'. |
AdvanceSkipWhitespace(); |
if (seq_ascii && is_symbol) { |
return isolate()->factory()->LookupAsciiSymbol(seq_source_, |
- beg_pos_, |
- end_pos_ - beg_pos_); |
+ beg_pos, |
+ end_pos - beg_pos); |
} else { |
- return isolate()->factory()->NewSubString(source_, beg_pos_, end_pos_); |
+ return isolate()->factory()->NewStrictSubString(source_, |
+ beg_pos, |
+ end_pos); |
} |
} |