summaryrefslogtreecommitdiff
path: root/ext/json/ext
diff options
context:
space:
mode:
authorFlorian Frank <flori@ping.de>2009-11-07 00:37:27 +0100
committerFlorian Frank <flori@ping.de>2009-11-07 14:41:23 +0100
commitaf6975e9b627a00e8010683ae50bb862ce65d967 (patch)
tree2d253a03bcd7b36e4bae66509f2bba77453a23bf /ext/json/ext
parentc0f4e4ffc66107ee80e87e02c277326b5e206708 (diff)
downloadjson-af6975e9b627a00e8010683ae50bb862ce65d967.tar.gz
optimise execution path
Diffstat (limited to 'ext/json/ext')
-rw-r--r--ext/json/ext/generator/unicode.c74
1 files changed, 40 insertions, 34 deletions
diff --git a/ext/json/ext/generator/unicode.c b/ext/json/ext/generator/unicode.c
index 181f807..cece042 100644
--- a/ext/json/ext/generator/unicode.c
+++ b/ext/json/ext/generator/unicode.c
@@ -199,49 +199,55 @@ inline void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string)
int len = RSTRING_LEN(string), start = 0, end = 0;
const char *escape = NULL;
int escape_len;
+ unsigned char c;
char buf[6] = { '\\', 'u' };
for (start = 0, end = 0; end < len;) {
p = ptr + end;
- switch (*p) {
- case '\n':
- escape = "\\n";
- escape_len = 2;
- break;
- case '\r':
- escape = "\\r";
- escape_len = 2;
- break;
- case '\\':
- escape = "\\\\";
- escape_len = 2;
- break;
- case '"':
- escape = "\\\"";
- escape_len = 2;
- break;
- case '\t':
- escape = "\\t";
- escape_len = 2;
- break;
- case '\f':
- escape = "\\f";
- escape_len = 2;
- break;
- case '\b':
- escape = "\\b";
- escape_len = 2;
- break;
- default:
- if ((unsigned char) *p < 0x20) {
+ c = (unsigned char) *p;
+ if (c < 0x20) {
+ switch (c) {
+ case '\n':
+ escape = "\\n";
+ escape_len = 2;
+ break;
+ case '\r':
+ escape = "\\r";
+ escape_len = 2;
+ break;
+ case '\t':
+ escape = "\\t";
+ escape_len = 2;
+ break;
+ case '\f':
+ escape = "\\f";
+ escape_len = 2;
+ break;
+ case '\b':
+ escape = "\\b";
+ escape_len = 2;
+ break;
+ default:
unicode_escape(buf, (UTF16) *p);
escape = buf;
escape_len = 6;
- } else {
+ break;
+ }
+ } else {
+ switch (c) {
+ case '\\':
+ escape = "\\\\";
+ escape_len = 2;
+ break;
+ case '"':
+ escape = "\\\"";
+ escape_len = 2;
+ break;
+ default:
end++;
continue;
- }
- break;
+ break;
+ }
}
fbuffer_append(buffer, ptr + start, end - start);
fbuffer_append(buffer, escape, escape_len);