summaryrefslogtreecommitdiff
path: root/ext/json/parser/parser.rl
diff options
context:
space:
mode:
-rw-r--r--ext/json/parser/parser.rl60
1 files changed, 46 insertions, 14 deletions
@@ -658,10 +658,10 @@ main := ignore* (
Vtrue @parse_true |
VNaN @parse_nan |
VInfinity @parse_infinity |
- begin_number >parse_number |
- begin_string >parse_string |
- begin_array >parse_array |
- begin_object >parse_object
) ignore* %*exit;
}%%
@@ -876,6 +876,26 @@ static inline VALUE build_string(const char *start, const char *end, bool intern
return result;
}
static VALUE json_string_unescape(JSON_Parser *json, char *string, char *stringEnd, bool is_name, bool intern, bool symbolize)
{
size_t bufferSize = stringEnd - string;
@@ -897,7 +917,7 @@ static VALUE json_string_unescape(JSON_Parser *json, char *string, char *stringE
}
pe = memchr(p, '\\', bufferSize);
- if (RB_LIKELY(pe == NULL)) {
return build_string(string, stringEnd, intern, symbolize);
}
@@ -1003,19 +1023,31 @@ static VALUE json_string_unescape(JSON_Parser *json, char *string, char *stringE
write data;
- action parse_string {
*result = json_string_unescape(json, json->memo + 1, p, json->parsing_name, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
- if (NIL_P(*result)) {
- fhold;
- fbreak;
- } else {
- fexec p + 1;
- }
}
- action exit { fhold; fbreak; }
- main := '"' ((^([\"\\] | 0..0x1f) | '\\'[\"\\/bfnrt] | '\\u'[0-9a-fA-F]{4} | '\\'^([\"\\/bfnrtu]|0..0x1f))* %parse_string) '"' @exit;
}%%
static int