diff options
author | Florian Frank <flori@ping.de> | 2009-11-07 00:37:27 +0100 |
---|---|---|
committer | Florian Frank <flori@ping.de> | 2009-11-07 14:41:23 +0100 |
commit | af6975e9b627a00e8010683ae50bb862ce65d967 (patch) | |
tree | 2d253a03bcd7b36e4bae66509f2bba77453a23bf /ext/json/ext | |
parent | c0f4e4ffc66107ee80e87e02c277326b5e206708 (diff) | |
download | json-af6975e9b627a00e8010683ae50bb862ce65d967.tar.gz |
optimise execution path
Diffstat (limited to 'ext/json/ext')
-rw-r--r-- | ext/json/ext/generator/unicode.c | 74 |
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); |