| Index: src/json-parser.h
|
| diff --git a/src/json-parser.h b/src/json-parser.h
|
| index 82ab9c57622c9ed7b20151b4eb27962437dfdade..caa2e14d2c311d2ab58566dba53753afaff47567 100644
|
| --- a/src/json-parser.h
|
| +++ b/src/json-parser.h
|
| @@ -17,7 +17,7 @@ namespace v8 {
|
| namespace internal {
|
|
|
| // A simple json parser.
|
| -template <bool seq_ascii>
|
| +template <bool seq_one_byte>
|
| class JsonParser BASE_EMBEDDED {
|
| public:
|
| MUST_USE_RESULT static MaybeHandle<Object> Parse(Handle<String> source) {
|
| @@ -39,8 +39,8 @@ class JsonParser BASE_EMBEDDED {
|
| source_ = String::Flatten(source_);
|
| pretenure_ = (source_length_ >= kPretenureTreshold) ? TENURED : NOT_TENURED;
|
|
|
| - // Optimized fast case where we only have ASCII characters.
|
| - if (seq_ascii) {
|
| + // Optimized fast case where we only have Latin1 characters.
|
| + if (seq_one_byte) {
|
| seq_source_ = Handle<SeqOneByteString>::cast(source_);
|
| }
|
| }
|
| @@ -52,7 +52,7 @@ class JsonParser BASE_EMBEDDED {
|
| position_++;
|
| if (position_ >= source_length_) {
|
| c0_ = kEndOfString;
|
| - } else if (seq_ascii) {
|
| + } else if (seq_one_byte) {
|
| c0_ = seq_source_->SeqOneByteStringGet(position_);
|
| } else {
|
| c0_ = source_->Get(position_);
|
| @@ -103,7 +103,7 @@ class JsonParser BASE_EMBEDDED {
|
| if (source_->length() - position_ - 1 > length) {
|
| DisallowHeapAllocation no_gc;
|
| String::FlatContent content = expected->GetFlatContent();
|
| - if (content.IsAscii()) {
|
| + if (content.IsOneByte()) {
|
| DCHECK_EQ('"', c0_);
|
| const uint8_t* input_chars = seq_source_->GetChars() + position_ + 1;
|
| const uint8_t* expected_chars = content.ToOneByteVector().start();
|
| @@ -132,7 +132,7 @@ class JsonParser BASE_EMBEDDED {
|
| Handle<String> ScanJsonString();
|
| // Creates a new string and copies prefix[start..end] into the beginning
|
| // of it. Then scans the rest of the string, adding characters after the
|
| - // prefix. Called by ScanJsonString when reaching a '\' or non-ASCII char.
|
| + // prefix. Called by ScanJsonString when reaching a '\' or non-Latin1 char.
|
| template <typename StringType, typename SinkChar>
|
| Handle<String> SlowScanJsonString(Handle<String> prefix, int start, int end);
|
|
|
| @@ -195,8 +195,8 @@ class JsonParser BASE_EMBEDDED {
|
| int position_;
|
| };
|
|
|
| -template <bool seq_ascii>
|
| -MaybeHandle<Object> JsonParser<seq_ascii>::ParseJson() {
|
| +template <bool seq_one_byte>
|
| +MaybeHandle<Object> JsonParser<seq_one_byte>::ParseJson() {
|
| // Advance to the first character (possibly EOS)
|
| AdvanceSkipWhitespace();
|
| Handle<Object> result = ParseJsonValue();
|
| @@ -254,8 +254,8 @@ MaybeHandle<Object> JsonParser<seq_ascii>::ParseJson() {
|
|
|
|
|
| // Parse any JSON value.
|
| -template <bool seq_ascii>
|
| -Handle<Object> JsonParser<seq_ascii>::ParseJsonValue() {
|
| +template <bool seq_one_byte>
|
| +Handle<Object> JsonParser<seq_one_byte>::ParseJsonValue() {
|
| StackLimitCheck stack_check(isolate_);
|
| if (stack_check.HasOverflowed()) {
|
| isolate_->StackOverflow();
|
| @@ -295,8 +295,8 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonValue() {
|
|
|
|
|
| // Parse a JSON object. Position must be right at '{'.
|
| -template <bool seq_ascii>
|
| -Handle<Object> JsonParser<seq_ascii>::ParseJsonObject() {
|
| +template <bool seq_one_byte>
|
| +Handle<Object> JsonParser<seq_one_byte>::ParseJsonObject() {
|
| HandleScope scope(isolate());
|
| Handle<JSObject> json_object =
|
| factory()->NewJSObject(object_constructor(), pretenure_);
|
| @@ -359,7 +359,7 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonObject() {
|
| // to parse it first.
|
| bool follow_expected = false;
|
| Handle<Map> target;
|
| - if (seq_ascii) {
|
| + if (seq_one_byte) {
|
| key = Map::ExpectedTransitionKey(map);
|
| follow_expected = !key.is_null() && ParseJsonString(key);
|
| }
|
| @@ -449,8 +449,8 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonObject() {
|
| }
|
|
|
| // Parse a JSON array. Position must be right at '['.
|
| -template <bool seq_ascii>
|
| -Handle<Object> JsonParser<seq_ascii>::ParseJsonArray() {
|
| +template <bool seq_one_byte>
|
| +Handle<Object> JsonParser<seq_one_byte>::ParseJsonArray() {
|
| HandleScope scope(isolate());
|
| ZoneList<Handle<Object> > elements(4, zone());
|
| DCHECK_EQ(c0_, '[');
|
| @@ -479,8 +479,8 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonArray() {
|
| }
|
|
|
|
|
| -template <bool seq_ascii>
|
| -Handle<Object> JsonParser<seq_ascii>::ParseJsonNumber() {
|
| +template <bool seq_one_byte>
|
| +Handle<Object> JsonParser<seq_one_byte>::ParseJsonNumber() {
|
| bool negative = false;
|
| int beg_pos = position_;
|
| if (c0_ == '-') {
|
| @@ -523,7 +523,7 @@ Handle<Object> JsonParser<seq_ascii>::ParseJsonNumber() {
|
| }
|
| int length = position_ - beg_pos;
|
| double number;
|
| - if (seq_ascii) {
|
| + if (seq_one_byte) {
|
| Vector<const uint8_t> chars(seq_source_->GetChars() + beg_pos, length);
|
| number = StringToDouble(isolate()->unicode_cache(),
|
| chars,
|
| @@ -581,9 +581,9 @@ inline Handle<SeqOneByteString> NewRawString(Factory* factory,
|
| // Scans the rest of a JSON string starting from position_ and writes
|
| // prefix[start..end] along with the scanned characters into a
|
| // sequential string of type StringType.
|
| -template <bool seq_ascii>
|
| +template <bool seq_one_byte>
|
| template <typename StringType, typename SinkChar>
|
| -Handle<String> JsonParser<seq_ascii>::SlowScanJsonString(
|
| +Handle<String> JsonParser<seq_one_byte>::SlowScanJsonString(
|
| Handle<String> prefix, int start, int end) {
|
| int count = end - start;
|
| int max_length = count + source_length_ - position_;
|
| @@ -603,16 +603,15 @@ Handle<String> JsonParser<seq_ascii>::SlowScanJsonString(
|
| }
|
| if (c0_ != '\\') {
|
| // If the sink can contain UC16 characters, or source_ contains only
|
| - // ASCII characters, there's no need to test whether we can store the
|
| + // Latin1 characters, there's no need to test whether we can store the
|
| // character. Otherwise check whether the UC16 source character can fit
|
| - // in the ASCII sink.
|
| - if (sizeof(SinkChar) == kUC16Size ||
|
| - seq_ascii ||
|
| + // in the Latin1 sink.
|
| + if (sizeof(SinkChar) == kUC16Size || seq_one_byte ||
|
| c0_ <= String::kMaxOneByteCharCode) {
|
| SeqStringSet(seq_string, count++, c0_);
|
| Advance();
|
| } else {
|
| - // StringType is SeqOneByteString and we just read a non-ASCII char.
|
| + // StringType is SeqOneByteString and we just read a non-Latin1 char.
|
| return SlowScanJsonString<SeqTwoByteString, uc16>(seq_string, 0, count);
|
| }
|
| } else {
|
| @@ -653,7 +652,8 @@ Handle<String> JsonParser<seq_ascii>::SlowScanJsonString(
|
| SeqStringSet(seq_string, count++, value);
|
| break;
|
| } else {
|
| - // StringType is SeqOneByteString and we just read a non-ASCII char.
|
| + // StringType is SeqOneByteString and we just read a non-Latin1
|
| + // char.
|
| position_ -= 6; // Rewind position_ to \ in \uxxxx.
|
| Advance();
|
| return SlowScanJsonString<SeqTwoByteString, uc16>(seq_string,
|
| @@ -677,9 +677,9 @@ Handle<String> JsonParser<seq_ascii>::SlowScanJsonString(
|
| }
|
|
|
|
|
| -template <bool seq_ascii>
|
| +template <bool seq_one_byte>
|
| template <bool is_internalized>
|
| -Handle<String> JsonParser<seq_ascii>::ScanJsonString() {
|
| +Handle<String> JsonParser<seq_one_byte>::ScanJsonString() {
|
| DCHECK_EQ('"', c0_);
|
| Advance();
|
| if (c0_ == '"') {
|
| @@ -687,7 +687,7 @@ Handle<String> JsonParser<seq_ascii>::ScanJsonString() {
|
| return factory()->empty_string();
|
| }
|
|
|
| - if (seq_ascii && is_internalized) {
|
| + if (seq_one_byte && is_internalized) {
|
| // Fast path for existing internalized strings. If the the string being
|
| // parsed is not a known internalized string, contains backslashes or
|
| // unexpectedly reaches the end of string, return with an empty handle.
|
| @@ -758,12 +758,12 @@ Handle<String> JsonParser<seq_ascii>::ScanJsonString() {
|
| }
|
|
|
| int beg_pos = position_;
|
| - // Fast case for ASCII only without escape characters.
|
| + // Fast case for Latin1 only without escape characters.
|
| do {
|
| // Check for control character (0x00-0x1f) or unterminated string (<0).
|
| if (c0_ < 0x20) return Handle<String>::null();
|
| if (c0_ != '\\') {
|
| - if (seq_ascii || c0_ <= String::kMaxOneByteCharCode) {
|
| + if (seq_one_byte || c0_ <= String::kMaxOneByteCharCode) {
|
| Advance();
|
| } else {
|
| return SlowScanJsonString<SeqTwoByteString, uc16>(source_,
|
|
|