| commit e7da0fc34e8ed7fa250fc38f1109e4944cbad808 |
| Author: eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> |
| Date: Fri Aug 3 15:11:36 2018 +0000 |
| |
| ext/json/parser/parser.c: do not call rb_str_resize() on Time object |
| |
| * See https://github.com/flori/json/issues/342 |
| |
| git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64177 b2dd03c8-39d4-4d8f-98ff-823fe69b080e |
| |
| diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c |
| index b5ed093c1f..c8012796a4 100644 |
| --- a/ext/json/ext/parser/parser.c |
| +++ b/ext/json/ext/parser/parser.c |
| @@ -1659,7 +1659,9 @@ case 7: |
| if (json->symbolize_names && json->parsing_name) { |
| *result = rb_str_intern(*result); |
| } else { |
| - rb_str_resize(*result, RSTRING_LEN(*result)); |
| + if (RB_TYPE_P(*result, T_STRING)) { |
| + rb_str_resize(*result, RSTRING_LEN(*result)); |
| + } |
| } |
| if (cs >= JSON_string_first_final) { |
| return p + 1; |
| @@ -1830,7 +1832,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self) |
| } |
| |
| |
| -#line 1834 "parser.c" |
| +#line 1836 "parser.c" |
| enum {JSON_start = 1}; |
| enum {JSON_first_final = 10}; |
| enum {JSON_error = 0}; |
| @@ -1838,7 +1840,7 @@ enum {JSON_error = 0}; |
| enum {JSON_en_main = 1}; |
| |
| |
| -#line 742 "parser.rl" |
| +#line 744 "parser.rl" |
| |
| |
| /* |
| @@ -1855,16 +1857,16 @@ static VALUE cParser_parse(VALUE self) |
| GET_PARSER; |
| |
| |
| -#line 1859 "parser.c" |
| +#line 1861 "parser.c" |
| { |
| cs = JSON_start; |
| } |
| |
| -#line 758 "parser.rl" |
| +#line 760 "parser.rl" |
| p = json->source; |
| pe = p + json->len; |
| |
| -#line 1868 "parser.c" |
| +#line 1870 "parser.c" |
| { |
| if ( p == pe ) |
| goto _test_eof; |
| @@ -1898,7 +1900,7 @@ st0: |
| cs = 0; |
| goto _out; |
| tr2: |
| -#line 734 "parser.rl" |
| +#line 736 "parser.rl" |
| { |
| char *np = JSON_parse_value(json, p, pe, &result, 0); |
| if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;} |
| @@ -1908,7 +1910,7 @@ st10: |
| if ( ++p == pe ) |
| goto _test_eof10; |
| case 10: |
| -#line 1912 "parser.c" |
| +#line 1914 "parser.c" |
| switch( (*p) ) { |
| case 13: goto st10; |
| case 32: goto st10; |
| @@ -1997,7 +1999,7 @@ case 9: |
| _out: {} |
| } |
| |
| -#line 761 "parser.rl" |
| +#line 763 "parser.rl" |
| |
| if (cs >= JSON_first_final && p == pe) { |
| return result; |
| diff --git a/ext/json/parser/parser.rl b/ext/json/parser/parser.rl |
| index fba01ac0e5..edab32b78f 100644 |
| --- a/ext/json/ext/parser/parser.rl |
| +++ b/ext/json/ext/parser/parser.rl |
| @@ -554,7 +554,9 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu |
| if (json->symbolize_names && json->parsing_name) { |
| *result = rb_str_intern(*result); |
| } else { |
| - rb_str_resize(*result, RSTRING_LEN(*result)); |
| + if (RB_TYPE_P(*result, T_STRING)) { |
| + rb_str_resize(*result, RSTRING_LEN(*result)); |
| + } |
| } |
| if (cs >= JSON_string_first_final) { |
| return p + 1; |