Chromium Code Reviews| Index: src/json-stringifier.h |
| diff --git a/src/json-stringifier.h b/src/json-stringifier.h |
| index cd3053ae12abecb6afad4cab1cc36b00aa215a06..d639b1c061fbd0c60f614a8afc9d1fef0fcef566 100644 |
| --- a/src/json-stringifier.h |
| +++ b/src/json-stringifier.h |
| @@ -59,14 +59,8 @@ class BasicJsonStringifier BASE_EMBEDDED { |
| INLINE(void Append_(Char c)); |
| template <bool is_ascii, typename Char> |
| - INLINE(void AppendUnchecked_(Char c)); |
| - |
| - template <bool is_ascii, typename Char> |
| INLINE(void Append_(const Char* chars)); |
| - template <bool is_ascii, typename Char> |
| - INLINE(void AppendUnchecked_(const Char* chars)); |
| - |
| INLINE(void Append(char c)) { |
| if (is_ascii_) { |
| Append_<true>(c); |
| @@ -123,11 +117,19 @@ class BasicJsonStringifier BASE_EMBEDDED { |
| void SerializeString(Handle<String> object); |
| + template <typename SrcChar, typename DestChar> |
| + INLINE(void SerializeStringUnchecked_(const SrcChar* src, |
| + DestChar* dest, |
| + int length)); |
| + |
| template <bool is_ascii, typename Char> |
| INLINE(void SerializeString_(Vector<const Char> vector, |
| Handle<String> string)); |
| template <typename Char> |
| + INLINE(bool NeedsEscaping(Char c)); |
| + |
| + template <typename Char> |
| INLINE(Vector<const Char> GetCharVector(Handle<String> string)); |
| INLINE(Result StackPush(Handle<Object> object)); |
| @@ -236,30 +238,11 @@ void BasicJsonStringifier::Append_(Char c) { |
| template <bool is_ascii, typename Char> |
| -void BasicJsonStringifier::AppendUnchecked_(Char c) { |
| - if (is_ascii) { |
| - SeqAsciiString::cast(*current_part_)->SeqAsciiStringSet( |
| - current_index_++, c); |
| - } else { |
| - SeqTwoByteString::cast(*current_part_)->SeqTwoByteStringSet( |
| - current_index_++, c); |
| - } |
| - ASSERT(current_index_ < part_length_); |
| -} |
| - |
| - |
| -template <bool is_ascii, typename Char> |
| void BasicJsonStringifier::Append_(const Char* chars) { |
| for ( ; *chars != '\0'; chars++) Append_<is_ascii, Char>(*chars); |
| } |
| -template <bool is_ascii, typename Char> |
| -void BasicJsonStringifier::AppendUnchecked_(const Char* chars) { |
| - for ( ; *chars != '\0'; chars++) AppendUnchecked_<is_ascii, Char>(*chars); |
| -} |
| - |
| - |
| Handle<Object> BasicJsonStringifier::GetProperty(Handle<JSObject> object, |
| Handle<String> key) { |
| LookupResult lookup(isolate_); |
| @@ -579,31 +562,51 @@ void BasicJsonStringifier::ChangeEncoding() { |
| } |
| +template <typename SrcChar, typename DestChar> |
| +void BasicJsonStringifier::SerializeStringUnchecked_(const SrcChar* src, |
| + DestChar* dest, |
| + int length) { |
| + dest += current_index_; |
| + DestChar* dest_start = dest; |
| + |
| + *(dest++) = '"'; |
| + for (int i = 0; i < length; i++) { |
| + SrcChar c = src[i]; |
| + if (NeedsEscaping(c)) { |
|
Toon Verwaest
2012/10/23 08:24:35
This seems backwards; shouldn't it use 'JsonQuotes
Yang
2012/10/23 08:57:37
Done.
|
| + *(dest++) = c; |
| + } else { |
| + const char* chars = &JsonQuotes[c * kJsonQuotesCharactersPerEntry]; |
| + while (*chars != '\0') *(dest++) = *(chars++); |
| + } |
| + } |
| + |
| + *(dest++) = '"'; |
| + current_index_ += dest - dest_start; |
| +} |
| + |
| + |
| template <bool is_ascii, typename Char> |
| void BasicJsonStringifier::SerializeString_(Vector<const Char> vector, |
| Handle<String> string) { |
| int length = vector.length(); |
| if (current_index_ + (length << 3) < (part_length_ - 2)) { |
|
Toon Verwaest
2012/10/23 08:24:35
Please document these magic numbers somehow (eithe
Yang
2012/10/23 08:57:37
Done.
|
| - AssertNoAllocation no_allocation_scope; |
| - AppendUnchecked_<is_ascii, char>('"'); |
| - for (int i = 0; i < length; i++) { |
| - Char c = vector[i]; |
| - if ((c >= '#' && c <= '~' && c != '\\') || |
| - (!is_ascii && ((c & 0xFF80) != 0))) { |
| - AppendUnchecked_<is_ascii, Char>(c); |
| - } else { |
| - AppendUnchecked_<is_ascii, char>( |
| - &JsonQuotes[c * kJsonQuotesCharactersPerEntry]); |
| - } |
| + if (is_ascii) { |
| + SerializeStringUnchecked_( |
| + vector.start(), |
| + SeqAsciiString::cast(*current_part_)->GetChars(), |
| + length); |
| + } else { |
| + SerializeStringUnchecked_( |
| + vector.start(), |
| + SeqTwoByteString::cast(*current_part_)->GetChars(), |
| + length); |
| } |
| - AppendUnchecked_<is_ascii, char>('"'); |
| } else { |
| Append_<is_ascii, char>('"'); |
| String* string_location = *string; |
| for (int i = 0; i < length; i++) { |
| Char c = vector[i]; |
| - if ((c >= '#' && c <= '~' && c != '\\') || |
| - (!is_ascii && ((c & 0xFF80) != 0))) { |
| + if (NeedsEscaping(c)) { |
| Append_<is_ascii, Char>(c); |
| } else { |
| Append_<is_ascii, char>(&JsonQuotes[c * kJsonQuotesCharactersPerEntry]); |
| @@ -620,6 +623,18 @@ void BasicJsonStringifier::SerializeString_(Vector<const Char> vector, |
| template <> |
| +bool BasicJsonStringifier::NeedsEscaping(char c) { |
| + return c >= '#' && c <= '~' && c != '\\'; |
| +} |
| + |
| + |
| +template <> |
| +bool BasicJsonStringifier::NeedsEscaping(uc16 c) { |
| + return (c >= 0x80) || (c >= '#' && c <= '~' && c != '\\'); |
| +} |
| + |
| + |
| +template <> |
| Vector<const char> BasicJsonStringifier::GetCharVector(Handle<String> string) { |
| String::FlatContent flat = string->GetFlatContent(); |
| ASSERT(flat.IsAscii()); |