Index: runtime/platform/json.cc |
diff --git a/runtime/platform/json.cc b/runtime/platform/json.cc |
index a406e7a5728bf96303387fbaa070c0e2af6f55a0..6457a87304ca0fbd8c43a9228e2e53cb21bd7432 100644 |
--- a/runtime/platform/json.cc |
+++ b/runtime/platform/json.cc |
@@ -527,44 +527,6 @@ void TextBuffer::AddChar(char ch) { |
} |
-void TextBuffer::AddUTF8(uint32_t ch) { |
- static const uint32_t kMaxOneByteChar = 0x7F; |
- static const uint32_t kMaxTwoByteChar = 0x7FF; |
- static const uint32_t kMaxThreeByteChar = 0xFFFF; |
- static const uint32_t kMaxFourByteChar = 0x10FFFF; |
- static const uint32_t kMask = ~(1 << 6); |
- |
- if (ch <= kMaxOneByteChar) { |
- EnsureCapacity(1); |
- buf_[msg_len_++] = ch; |
- buf_[msg_len_] = '\0'; |
- return; |
- } |
- if (ch <= kMaxTwoByteChar) { |
- EnsureCapacity(2); |
- buf_[msg_len_++] = 0xC0 | (ch >> 6); |
- buf_[msg_len_++] = 0x80 | (ch & kMask); |
- buf_[msg_len_] = '\0'; |
- return; |
- } |
- if (ch <= kMaxThreeByteChar) { |
- EnsureCapacity(3); |
- buf_[msg_len_++] = 0xE0 | (ch >> 12); |
- buf_[msg_len_++] = 0x80 | ((ch >> 6) & kMask); |
- buf_[msg_len_++] = 0x80 | (ch & kMask); |
- buf_[msg_len_] = '\0'; |
- return; |
- } |
- ASSERT(ch <= kMaxFourByteChar); |
- EnsureCapacity(4); |
- buf_[msg_len_++] = 0xF0 | (ch >> 18); |
- buf_[msg_len_++] = 0x80 | ((ch >> 12) & kMask); |
- buf_[msg_len_++] = 0x80 | ((ch >> 6) & kMask); |
- buf_[msg_len_++] = 0x80 | (ch & kMask); |
- buf_[msg_len_] = '\0'; |
-} |
- |
- |
intptr_t TextBuffer::Printf(const char* format, ...) { |
va_list args; |
va_start(args, format); |
@@ -588,8 +550,10 @@ intptr_t TextBuffer::Printf(const char* format, ...) { |
} |
-void TextBuffer::AddEscapedChar(uint32_t cp) { |
- switch (cp) { |
+// Write a UTF-16 code unit so it can be read by a JSON parser in a string |
+// literal. Use escape sequences for characters other than printable ASCII. |
+void TextBuffer::EscapeAndAddCodeUnit(uint32_t codeunit) { |
+ switch (codeunit) { |
case '"': |
Printf("%s", "\\\""); |
break; |
@@ -615,15 +579,26 @@ void TextBuffer::AddEscapedChar(uint32_t cp) { |
Printf("%s", "\\t"); |
break; |
default: |
- if (cp < 0x20) { |
+ if (codeunit < 0x20) { |
// Encode character as \u00HH. |
- uint32_t digit2 = (cp >> 4) & 0xf; |
- uint32_t digit3 = (cp & 0xf); |
+ uint32_t digit2 = (codeunit >> 4) & 0xf; |
+ uint32_t digit3 = (codeunit & 0xf); |
Printf("\\u00%c%c", |
digit2 > 9 ? 'A' + (digit2 - 10) : '0' + digit2, |
digit3 > 9 ? 'A' + (digit3 - 10) : '0' + digit3); |
+ } else if (codeunit > 127) { |
+ // Encode character as \uHHHH. |
+ uint32_t digit0 = (codeunit >> 12) & 0xf; |
+ uint32_t digit1 = (codeunit >> 8) & 0xf; |
+ uint32_t digit2 = (codeunit >> 4) & 0xf; |
+ uint32_t digit3 = (codeunit & 0xf); |
+ Printf("\\u%c%c%c%c", |
+ digit0 > 9 ? 'A' + (digit0 - 10) : '0' + digit0, |
+ digit1 > 9 ? 'A' + (digit1 - 10) : '0' + digit1, |
+ digit2 > 9 ? 'A' + (digit2 - 10) : '0' + digit2, |
+ digit3 > 9 ? 'A' + (digit3 - 10) : '0' + digit3); |
} else { |
- AddUTF8(cp); |
+ AddChar(codeunit); |
} |
} |
} |
@@ -637,7 +612,7 @@ void TextBuffer::AddString(const char* s) { |
void TextBuffer::AddEscapedString(const char* s) { |
intptr_t len = strlen(s); |
for (int i = 0; i < len; i++) { |
- AddEscapedChar(s[i]); |
+ EscapeAndAddCodeUnit(s[i]); |
} |
} |