json 1.8.2 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +2 -0
- data/.travis.yml +11 -9
- data/{CHANGES → CHANGES.md} +220 -89
- data/Gemfile +10 -6
- data/{README-json-jruby.markdown → README-json-jruby.md} +0 -0
- data/{README.rdoc → README.md} +204 -137
- data/Rakefile +35 -113
- data/VERSION +1 -1
- data/ext/json/ext/fbuffer/fbuffer.h +0 -3
- data/ext/json/ext/generator/generator.c +215 -110
- data/ext/json/ext/generator/generator.h +18 -5
- data/ext/json/ext/parser/extconf.rb +3 -0
- data/ext/json/ext/parser/parser.c +422 -508
- data/ext/json/ext/parser/parser.h +15 -8
- data/ext/json/ext/parser/parser.rl +151 -200
- data/ext/json/extconf.rb +0 -1
- data/java/src/json/ext/ByteListTranscoder.java +1 -2
- data/java/src/json/ext/Generator.java +44 -22
- data/java/src/json/ext/GeneratorMethods.java +1 -2
- data/java/src/json/ext/GeneratorService.java +1 -2
- data/java/src/json/ext/GeneratorState.java +3 -56
- data/java/src/json/ext/OptionsReader.java +2 -3
- data/java/src/json/ext/Parser.java +132 -415
- data/java/src/json/ext/Parser.rl +48 -124
- data/java/src/json/ext/ParserService.java +1 -2
- data/java/src/json/ext/RuntimeInfo.java +1 -6
- data/java/src/json/ext/StringDecoder.java +1 -2
- data/java/src/json/ext/StringEncoder.java +5 -0
- data/java/src/json/ext/Utils.java +1 -2
- data/json-java.gemspec +16 -2
- data/json.gemspec +0 -0
- data/json_pure.gemspec +22 -29
- data/lib/json.rb +379 -29
- data/lib/json/add/bigdecimal.rb +3 -2
- data/lib/json/add/complex.rb +4 -3
- data/lib/json/add/core.rb +1 -0
- data/lib/json/add/date.rb +1 -1
- data/lib/json/add/date_time.rb +1 -1
- data/lib/json/add/exception.rb +1 -1
- data/lib/json/add/ostruct.rb +3 -3
- data/lib/json/add/range.rb +1 -1
- data/lib/json/add/rational.rb +3 -2
- data/lib/json/add/regexp.rb +3 -3
- data/lib/json/add/set.rb +29 -0
- data/lib/json/add/struct.rb +1 -1
- data/lib/json/add/symbol.rb +1 -1
- data/lib/json/add/time.rb +1 -1
- data/lib/json/common.rb +335 -128
- data/lib/json/ext.rb +0 -6
- data/lib/json/generic_object.rb +5 -4
- data/lib/json/pure.rb +2 -8
- data/lib/json/pure/generator.rb +64 -127
- data/lib/json/pure/parser.rb +42 -82
- data/lib/json/version.rb +2 -1
- data/references/rfc7159.txt +899 -0
- data/tests/fixtures/obsolete_fail1.json +1 -0
- data/tests/{test_json_addition.rb → json_addition_test.rb} +32 -25
- data/tests/json_common_interface_test.rb +126 -0
- data/tests/json_encoding_test.rb +107 -0
- data/tests/json_ext_parser_test.rb +15 -0
- data/tests/{test_json_fixtures.rb → json_fixtures_test.rb} +10 -8
- data/tests/{test_json_generate.rb → json_generator_test.rb} +123 -39
- data/tests/{test_json_generic_object.rb → json_generic_object_test.rb} +15 -8
- data/tests/json_parser_test.rb +472 -0
- data/tests/json_string_matching_test.rb +38 -0
- data/tests/{setup_variant.rb → test_helper.rb} +6 -0
- data/tools/diff.sh +18 -0
- data/tools/fuzz.rb +1 -9
- metadata +46 -53
- data/COPYING +0 -58
- data/COPYING-json-jruby +0 -57
- data/GPL +0 -340
- data/TODO +0 -1
- data/data/example.json +0 -1
- data/data/index.html +0 -38
- data/data/prototype.js +0 -4184
- data/tests/fixtures/fail1.json +0 -1
- data/tests/test_json.rb +0 -553
- data/tests/test_json_encoding.rb +0 -65
- data/tests/test_json_string_matching.rb +0 -39
- data/tests/test_json_unicode.rb +0 -72
| @@ -1,7 +1,6 @@ | |
| 1 1 | 
             
            #ifndef _GENERATOR_H_
         | 
| 2 2 | 
             
            #define _GENERATOR_H_
         | 
| 3 3 |  | 
| 4 | 
            -
            #include <string.h>
         | 
| 5 4 | 
             
            #include <math.h>
         | 
| 6 5 | 
             
            #include <ctype.h>
         | 
| 7 6 |  | 
| @@ -73,7 +72,6 @@ typedef struct JSON_Generator_StateStruct { | |
| 73 72 | 
             
                long max_nesting;
         | 
| 74 73 | 
             
                char allow_nan;
         | 
| 75 74 | 
             
                char ascii_only;
         | 
| 76 | 
            -
                char quirks_mode;
         | 
| 77 75 | 
             
                long depth;
         | 
| 78 76 | 
             
                long buffer_initial_length;
         | 
| 79 77 | 
             
            } JSON_Generator_State;
         | 
| @@ -99,8 +97,12 @@ typedef struct JSON_Generator_StateStruct { | |
| 99 97 |  | 
| 100 98 | 
             
            static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self);
         | 
| 101 99 | 
             
            static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self);
         | 
| 100 | 
            +
            #ifdef RUBY_INTEGER_UNIFICATION
         | 
| 101 | 
            +
            static VALUE mInteger_to_json(int argc, VALUE *argv, VALUE self);
         | 
| 102 | 
            +
            #else
         | 
| 102 103 | 
             
            static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self);
         | 
| 103 104 | 
             
            static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self);
         | 
| 105 | 
            +
            #endif
         | 
| 104 106 | 
             
            static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self);
         | 
| 105 107 | 
             
            static VALUE mString_included_s(VALUE self, VALUE modul);
         | 
| 106 108 | 
             
            static VALUE mString_to_json(int argc, VALUE *argv, VALUE self);
         | 
| @@ -112,7 +114,6 @@ static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self); | |
| 112 114 | 
             
            static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self);
         | 
| 113 115 | 
             
            static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self);
         | 
| 114 116 | 
             
            static void State_free(void *state);
         | 
| 115 | 
            -
            static JSON_Generator_State *State_allocate(void);
         | 
| 116 117 | 
             
            static VALUE cState_s_allocate(VALUE klass);
         | 
| 117 118 | 
             
            static VALUE cState_configure(VALUE self, VALUE opts);
         | 
| 118 119 | 
             
            static VALUE cState_to_h(VALUE self);
         | 
| @@ -123,6 +124,9 @@ static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_S | |
| 123 124 | 
             
            static void generate_json_null(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
         | 
| 124 125 | 
             
            static void generate_json_false(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
         | 
| 125 126 | 
             
            static void generate_json_true(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
         | 
| 127 | 
            +
            #ifdef RUBY_INTEGER_UNIFICATION
         | 
| 128 | 
            +
            static void generate_json_integer(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
         | 
| 129 | 
            +
            #endif
         | 
| 126 130 | 
             
            static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
         | 
| 127 131 | 
             
            static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
         | 
| 128 132 | 
             
            static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
         | 
| @@ -147,11 +151,20 @@ static VALUE cState_ascii_only_p(VALUE self); | |
| 147 151 | 
             
            static VALUE cState_depth(VALUE self);
         | 
| 148 152 | 
             
            static VALUE cState_depth_set(VALUE self, VALUE depth);
         | 
| 149 153 | 
             
            static FBuffer *cState_prepare_buffer(VALUE self);
         | 
| 150 | 
            -
            # | 
| 154 | 
            +
            #ifndef ZALLOC
         | 
| 155 | 
            +
            #define ZALLOC(type) ((type *)ruby_zalloc(sizeof(type)))
         | 
| 156 | 
            +
            static inline void *ruby_zalloc(size_t n)
         | 
| 157 | 
            +
            {
         | 
| 158 | 
            +
                void *p = ruby_xmalloc(n);
         | 
| 159 | 
            +
                memset(p, 0, n);
         | 
| 160 | 
            +
                return p;
         | 
| 161 | 
            +
            }
         | 
| 162 | 
            +
            #endif
         | 
| 163 | 
            +
            #ifdef TypedData_Make_Struct
         | 
| 151 164 | 
             
            static const rb_data_type_t JSON_Generator_State_type;
         | 
| 152 165 | 
             
            #define NEW_TYPEDDATA_WRAPPER 1
         | 
| 153 166 | 
             
            #else
         | 
| 154 | 
            -
            #define  | 
| 167 | 
            +
            #define TypedData_Make_Struct(klass, type, ignore, json) Data_Make_Struct(klass, type, NULL, State_free, json)
         | 
| 155 168 | 
             
            #define TypedData_Get_Struct(self, JSON_Generator_State, ignore, json) Data_Get_Struct(self, JSON_Generator_State, json)
         | 
| 156 169 | 
             
            #endif
         | 
| 157 170 |  | 
| @@ -1,11 +1,33 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            /* This file is automatically generated from parser.rl by using ragel */
         | 
| 2 2 | 
             
            #line 1 "parser.rl"
         | 
| 3 3 | 
             
            #include "../fbuffer/fbuffer.h"
         | 
| 4 4 | 
             
            #include "parser.h"
         | 
| 5 5 |  | 
| 6 | 
            +
            #if defined HAVE_RUBY_ENCODING_H
         | 
| 7 | 
            +
            # define EXC_ENCODING rb_utf8_encoding(),
         | 
| 8 | 
            +
            # ifndef HAVE_RB_ENC_RAISE
         | 
| 9 | 
            +
            static void
         | 
| 10 | 
            +
            enc_raise(rb_encoding *enc, VALUE exc, const char *fmt, ...)
         | 
| 11 | 
            +
            {
         | 
| 12 | 
            +
                va_list args;
         | 
| 13 | 
            +
                VALUE mesg;
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                va_start(args, fmt);
         | 
| 16 | 
            +
                mesg = rb_enc_vsprintf(enc, fmt, args);
         | 
| 17 | 
            +
                va_end(args);
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                rb_exc_raise(rb_exc_new3(exc, mesg));
         | 
| 20 | 
            +
            }
         | 
| 21 | 
            +
            #   define rb_enc_raise enc_raise
         | 
| 22 | 
            +
            # endif
         | 
| 23 | 
            +
            #else
         | 
| 24 | 
            +
            # define EXC_ENCODING /* nothing */
         | 
| 25 | 
            +
            # define rb_enc_raise rb_raise
         | 
| 26 | 
            +
            #endif
         | 
| 27 | 
            +
             | 
| 6 28 | 
             
            /* unicode */
         | 
| 7 29 |  | 
| 8 | 
            -
            static const char digit_values[256] = {
         | 
| 30 | 
            +
            static const signed char digit_values[256] = {
         | 
| 9 31 | 
             
                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
         | 
| 10 32 | 
             
                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
         | 
| 11 33 | 
             
                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1,
         | 
| @@ -24,20 +46,20 @@ static const char digit_values[256] = { | |
| 24 46 |  | 
| 25 47 | 
             
            static UTF32 unescape_unicode(const unsigned char *p)
         | 
| 26 48 | 
             
            {
         | 
| 27 | 
            -
                char b;
         | 
| 49 | 
            +
                signed char b;
         | 
| 28 50 | 
             
                UTF32 result = 0;
         | 
| 29 51 | 
             
                b = digit_values[p[0]];
         | 
| 30 52 | 
             
                if (b < 0) return UNI_REPLACEMENT_CHAR;
         | 
| 31 | 
            -
                result = (result << 4) | b;
         | 
| 53 | 
            +
                result = (result << 4) | (unsigned char)b;
         | 
| 32 54 | 
             
                b = digit_values[p[1]];
         | 
| 33 | 
            -
                result = (result << 4) | b;
         | 
| 34 55 | 
             
                if (b < 0) return UNI_REPLACEMENT_CHAR;
         | 
| 56 | 
            +
                result = (result << 4) | (unsigned char)b;
         | 
| 35 57 | 
             
                b = digit_values[p[2]];
         | 
| 36 | 
            -
                result = (result << 4) | b;
         | 
| 37 58 | 
             
                if (b < 0) return UNI_REPLACEMENT_CHAR;
         | 
| 59 | 
            +
                result = (result << 4) | (unsigned char)b;
         | 
| 38 60 | 
             
                b = digit_values[p[3]];
         | 
| 39 | 
            -
                result = (result << 4) | b;
         | 
| 40 61 | 
             
                if (b < 0) return UNI_REPLACEMENT_CHAR;
         | 
| 62 | 
            +
                result = (result << 4) | (unsigned char)b;
         | 
| 41 63 | 
             
                return result;
         | 
| 42 64 | 
             
            }
         | 
| 43 65 |  | 
| @@ -67,59 +89,53 @@ static int convert_UTF32_to_UTF8(char *buf, UTF32 ch) | |
| 67 89 | 
             
                return len;
         | 
| 68 90 | 
             
            }
         | 
| 69 91 |  | 
| 70 | 
            -
            #ifdef HAVE_RUBY_ENCODING_H
         | 
| 71 | 
            -
            static VALUE CEncoding_ASCII_8BIT, CEncoding_UTF_8, CEncoding_UTF_16BE,
         | 
| 72 | 
            -
                CEncoding_UTF_16LE, CEncoding_UTF_32BE, CEncoding_UTF_32LE;
         | 
| 73 | 
            -
            static ID i_encoding, i_encode;
         | 
| 74 | 
            -
            #else
         | 
| 75 | 
            -
            static ID i_iconv;
         | 
| 76 | 
            -
            #endif
         | 
| 77 | 
            -
             | 
| 78 92 | 
             
            static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
         | 
| 79 93 | 
             
            static VALUE CNaN, CInfinity, CMinusInfinity;
         | 
| 94 | 
            +
            static VALUE cBigDecimal = Qundef;
         | 
| 80 95 |  | 
| 81 96 | 
             
            static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
         | 
| 82 | 
            -
                      i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, | 
| 83 | 
            -
                      i_object_class, i_array_class,  | 
| 84 | 
            -
                      i_match_string, i_aset, i_aref, | 
| 97 | 
            +
                      i_chr, i_max_nesting, i_allow_nan, i_symbolize_names,
         | 
| 98 | 
            +
                      i_object_class, i_array_class, i_decimal_class, i_key_p,
         | 
| 99 | 
            +
                      i_deep_const_get, i_match, i_match_string, i_aset, i_aref,
         | 
| 100 | 
            +
                      i_leftshift, i_new, i_BigDecimal;
         | 
| 85 101 |  | 
| 86 102 |  | 
| 87 | 
            -
            #line  | 
| 103 | 
            +
            #line 126 "parser.rl"
         | 
| 88 104 |  | 
| 89 105 |  | 
| 90 106 |  | 
| 91 | 
            -
            #line  | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 107 | 
            +
            #line 108 "parser.c"
         | 
| 108 | 
            +
            enum {JSON_object_start = 1};
         | 
| 109 | 
            +
            enum {JSON_object_first_final = 27};
         | 
| 110 | 
            +
            enum {JSON_object_error = 0};
         | 
| 95 111 |  | 
| 96 | 
            -
             | 
| 112 | 
            +
            enum {JSON_object_en_main = 1};
         | 
| 97 113 |  | 
| 98 114 |  | 
| 99 | 
            -
            #line  | 
| 115 | 
            +
            #line 168 "parser.rl"
         | 
| 100 116 |  | 
| 101 117 |  | 
| 102 | 
            -
            static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result)
         | 
| 118 | 
            +
            static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
         | 
| 103 119 | 
             
            {
         | 
| 104 120 | 
             
                int cs = EVIL;
         | 
| 105 121 | 
             
                VALUE last_name = Qnil;
         | 
| 106 122 | 
             
                VALUE object_class = json->object_class;
         | 
| 107 123 |  | 
| 108 | 
            -
                if (json->max_nesting &&  | 
| 109 | 
            -
                    rb_raise(eNestingError, "nesting of %d is too deep",  | 
| 124 | 
            +
                if (json->max_nesting && current_nesting > json->max_nesting) {
         | 
| 125 | 
            +
                    rb_raise(eNestingError, "nesting of %d is too deep", current_nesting);
         | 
| 110 126 | 
             
                }
         | 
| 111 127 |  | 
| 112 128 | 
             
                *result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class);
         | 
| 113 129 |  | 
| 114 130 |  | 
| 115 | 
            -
            #line  | 
| 131 | 
            +
            #line 132 "parser.c"
         | 
| 116 132 | 
             
            	{
         | 
| 117 133 | 
             
            	cs = JSON_object_start;
         | 
| 118 134 | 
             
            	}
         | 
| 119 135 |  | 
| 120 | 
            -
            #line  | 
| 136 | 
            +
            #line 183 "parser.rl"
         | 
| 121 137 |  | 
| 122 | 
            -
            #line  | 
| 138 | 
            +
            #line 139 "parser.c"
         | 
| 123 139 | 
             
            	{
         | 
| 124 140 | 
             
            	if ( p == pe )
         | 
| 125 141 | 
             
            		goto _test_eof;
         | 
| @@ -147,7 +163,7 @@ case 2: | |
| 147 163 | 
             
            		goto st2;
         | 
| 148 164 | 
             
            	goto st0;
         | 
| 149 165 | 
             
            tr2:
         | 
| 150 | 
            -
            #line  | 
| 166 | 
            +
            #line 150 "parser.rl"
         | 
| 151 167 | 
             
            	{
         | 
| 152 168 | 
             
                    char *np;
         | 
| 153 169 | 
             
                    json->parsing_name = 1;
         | 
| @@ -160,7 +176,7 @@ st3: | |
| 160 176 | 
             
            	if ( ++p == pe )
         | 
| 161 177 | 
             
            		goto _test_eof3;
         | 
| 162 178 | 
             
            case 3:
         | 
| 163 | 
            -
            #line  | 
| 179 | 
            +
            #line 180 "parser.c"
         | 
| 164 180 | 
             
            	switch( (*p) ) {
         | 
| 165 181 | 
             
            		case 13: goto st3;
         | 
| 166 182 | 
             
            		case 32: goto st3;
         | 
| @@ -227,14 +243,15 @@ case 8: | |
| 227 243 | 
             
            		goto st8;
         | 
| 228 244 | 
             
            	goto st0;
         | 
| 229 245 | 
             
            tr11:
         | 
| 230 | 
            -
            #line  | 
| 246 | 
            +
            #line 134 "parser.rl"
         | 
| 231 247 | 
             
            	{
         | 
| 232 248 | 
             
                    VALUE v = Qnil;
         | 
| 233 | 
            -
                    char *np = JSON_parse_value(json, p, pe, &v);
         | 
| 249 | 
            +
                    char *np = JSON_parse_value(json, p, pe, &v, current_nesting);
         | 
| 234 250 | 
             
                    if (np == NULL) {
         | 
| 235 251 | 
             
                        p--; {p++; cs = 9; goto _out;}
         | 
| 236 252 | 
             
                    } else {
         | 
| 237 253 | 
             
                        if (NIL_P(json->object_class)) {
         | 
| 254 | 
            +
                            OBJ_FREEZE(last_name);
         | 
| 238 255 | 
             
                            rb_hash_aset(*result, last_name, v);
         | 
| 239 256 | 
             
                        } else {
         | 
| 240 257 | 
             
                            rb_funcall(*result, i_aset, 2, last_name, v);
         | 
| @@ -247,7 +264,7 @@ st9: | |
| 247 264 | 
             
            	if ( ++p == pe )
         | 
| 248 265 | 
             
            		goto _test_eof9;
         | 
| 249 266 | 
             
            case 9:
         | 
| 250 | 
            -
            #line  | 
| 267 | 
            +
            #line 268 "parser.c"
         | 
| 251 268 | 
             
            	switch( (*p) ) {
         | 
| 252 269 | 
             
            		case 13: goto st9;
         | 
| 253 270 | 
             
            		case 32: goto st9;
         | 
| @@ -336,14 +353,14 @@ case 18: | |
| 336 353 | 
             
            		goto st9;
         | 
| 337 354 | 
             
            	goto st18;
         | 
| 338 355 | 
             
            tr4:
         | 
| 339 | 
            -
            #line  | 
| 356 | 
            +
            #line 158 "parser.rl"
         | 
| 340 357 | 
             
            	{ p--; {p++; cs = 27; goto _out;} }
         | 
| 341 358 | 
             
            	goto st27;
         | 
| 342 359 | 
             
            st27:
         | 
| 343 360 | 
             
            	if ( ++p == pe )
         | 
| 344 361 | 
             
            		goto _test_eof27;
         | 
| 345 362 | 
             
            case 27:
         | 
| 346 | 
            -
            #line  | 
| 363 | 
            +
            #line 364 "parser.c"
         | 
| 347 364 | 
             
            	goto st0;
         | 
| 348 365 | 
             
            st19:
         | 
| 349 366 | 
             
            	if ( ++p == pe )
         | 
| @@ -441,7 +458,7 @@ case 26: | |
| 441 458 | 
             
            	_out: {}
         | 
| 442 459 | 
             
            	}
         | 
| 443 460 |  | 
| 444 | 
            -
            #line  | 
| 461 | 
            +
            #line 184 "parser.rl"
         | 
| 445 462 |  | 
| 446 463 | 
             
                if (cs >= JSON_object_first_final) {
         | 
| 447 464 | 
             
                    if (json->create_additions) {
         | 
| @@ -466,281 +483,358 @@ case 26: | |
| 466 483 |  | 
| 467 484 |  | 
| 468 485 |  | 
| 469 | 
            -
            #line  | 
| 470 | 
            -
             | 
| 471 | 
            -
             | 
| 472 | 
            -
             | 
| 486 | 
            +
            #line 487 "parser.c"
         | 
| 487 | 
            +
            enum {JSON_value_start = 1};
         | 
| 488 | 
            +
            enum {JSON_value_first_final = 29};
         | 
| 489 | 
            +
            enum {JSON_value_error = 0};
         | 
| 473 490 |  | 
| 474 | 
            -
             | 
| 491 | 
            +
            enum {JSON_value_en_main = 1};
         | 
| 475 492 |  | 
| 476 493 |  | 
| 477 | 
            -
            #line  | 
| 494 | 
            +
            #line 284 "parser.rl"
         | 
| 478 495 |  | 
| 479 496 |  | 
| 480 | 
            -
            static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result)
         | 
| 497 | 
            +
            static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
         | 
| 481 498 | 
             
            {
         | 
| 482 499 | 
             
                int cs = EVIL;
         | 
| 483 500 |  | 
| 484 501 |  | 
| 485 | 
            -
            #line  | 
| 502 | 
            +
            #line 503 "parser.c"
         | 
| 486 503 | 
             
            	{
         | 
| 487 504 | 
             
            	cs = JSON_value_start;
         | 
| 488 505 | 
             
            	}
         | 
| 489 506 |  | 
| 490 | 
            -
            #line  | 
| 507 | 
            +
            #line 291 "parser.rl"
         | 
| 491 508 |  | 
| 492 | 
            -
            #line  | 
| 509 | 
            +
            #line 510 "parser.c"
         | 
| 493 510 | 
             
            	{
         | 
| 494 511 | 
             
            	if ( p == pe )
         | 
| 495 512 | 
             
            		goto _test_eof;
         | 
| 496 513 | 
             
            	switch ( cs )
         | 
| 497 514 | 
             
            	{
         | 
| 515 | 
            +
            st1:
         | 
| 516 | 
            +
            	if ( ++p == pe )
         | 
| 517 | 
            +
            		goto _test_eof1;
         | 
| 498 518 | 
             
            case 1:
         | 
| 499 519 | 
             
            	switch( (*p) ) {
         | 
| 500 | 
            -
            		case  | 
| 501 | 
            -
            		case  | 
| 502 | 
            -
            		case  | 
| 503 | 
            -
            		case  | 
| 504 | 
            -
            		case  | 
| 505 | 
            -
            		case  | 
| 506 | 
            -
            		case  | 
| 507 | 
            -
            		case  | 
| 508 | 
            -
            		case  | 
| 520 | 
            +
            		case 13: goto st1;
         | 
| 521 | 
            +
            		case 32: goto st1;
         | 
| 522 | 
            +
            		case 34: goto tr2;
         | 
| 523 | 
            +
            		case 45: goto tr3;
         | 
| 524 | 
            +
            		case 47: goto st6;
         | 
| 525 | 
            +
            		case 73: goto st10;
         | 
| 526 | 
            +
            		case 78: goto st17;
         | 
| 527 | 
            +
            		case 91: goto tr7;
         | 
| 528 | 
            +
            		case 102: goto st19;
         | 
| 529 | 
            +
            		case 110: goto st23;
         | 
| 530 | 
            +
            		case 116: goto st26;
         | 
| 531 | 
            +
            		case 123: goto tr11;
         | 
| 509 532 | 
             
            	}
         | 
| 510 | 
            -
            	if (  | 
| 511 | 
            -
            		 | 
| 533 | 
            +
            	if ( (*p) > 10 ) {
         | 
| 534 | 
            +
            		if ( 48 <= (*p) && (*p) <= 57 )
         | 
| 535 | 
            +
            			goto tr3;
         | 
| 536 | 
            +
            	} else if ( (*p) >= 9 )
         | 
| 537 | 
            +
            		goto st1;
         | 
| 512 538 | 
             
            	goto st0;
         | 
| 513 539 | 
             
            st0:
         | 
| 514 540 | 
             
            cs = 0;
         | 
| 515 541 | 
             
            	goto _out;
         | 
| 516 | 
            -
             | 
| 517 | 
            -
            #line  | 
| 542 | 
            +
            tr2:
         | 
| 543 | 
            +
            #line 236 "parser.rl"
         | 
| 518 544 | 
             
            	{
         | 
| 519 545 | 
             
                    char *np = JSON_parse_string(json, p, pe, result);
         | 
| 520 | 
            -
                    if (np == NULL) { p--; {p++; cs =  | 
| 546 | 
            +
                    if (np == NULL) { p--; {p++; cs = 29; goto _out;} } else {p = (( np))-1;}
         | 
| 521 547 | 
             
                }
         | 
| 522 | 
            -
            	goto  | 
| 523 | 
            -
             | 
| 524 | 
            -
            #line  | 
| 548 | 
            +
            	goto st29;
         | 
| 549 | 
            +
            tr3:
         | 
| 550 | 
            +
            #line 241 "parser.rl"
         | 
| 525 551 | 
             
            	{
         | 
| 526 552 | 
             
                    char *np;
         | 
| 527 | 
            -
                    if(pe > p +  | 
| 553 | 
            +
                    if(pe > p + 8 && !strncmp(MinusInfinity, p, 9)) {
         | 
| 528 554 | 
             
                        if (json->allow_nan) {
         | 
| 529 555 | 
             
                            *result = CMinusInfinity;
         | 
| 530 556 | 
             
                            {p = (( p + 10))-1;}
         | 
| 531 | 
            -
                            p--; {p++; cs =  | 
| 557 | 
            +
                            p--; {p++; cs = 29; goto _out;}
         | 
| 532 558 | 
             
                        } else {
         | 
| 533 | 
            -
                             | 
| 559 | 
            +
                            rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p);
         | 
| 534 560 | 
             
                        }
         | 
| 535 561 | 
             
                    }
         | 
| 536 562 | 
             
                    np = JSON_parse_float(json, p, pe, result);
         | 
| 537 563 | 
             
                    if (np != NULL) {p = (( np))-1;}
         | 
| 538 564 | 
             
                    np = JSON_parse_integer(json, p, pe, result);
         | 
| 539 565 | 
             
                    if (np != NULL) {p = (( np))-1;}
         | 
| 540 | 
            -
                    p--; {p++; cs =  | 
| 566 | 
            +
                    p--; {p++; cs = 29; goto _out;}
         | 
| 541 567 | 
             
                }
         | 
| 542 | 
            -
            	goto  | 
| 543 | 
            -
             | 
| 544 | 
            -
            #line  | 
| 568 | 
            +
            	goto st29;
         | 
| 569 | 
            +
            tr7:
         | 
| 570 | 
            +
            #line 259 "parser.rl"
         | 
| 545 571 | 
             
            	{
         | 
| 546 572 | 
             
                    char *np;
         | 
| 547 | 
            -
                    json | 
| 548 | 
            -
                    np =  | 
| 549 | 
            -
                    json->current_nesting--;
         | 
| 550 | 
            -
                    if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
         | 
| 573 | 
            +
                    np = JSON_parse_array(json, p, pe, result, current_nesting + 1);
         | 
| 574 | 
            +
                    if (np == NULL) { p--; {p++; cs = 29; goto _out;} } else {p = (( np))-1;}
         | 
| 551 575 | 
             
                }
         | 
| 552 | 
            -
            	goto  | 
| 553 | 
            -
             | 
| 554 | 
            -
            #line  | 
| 576 | 
            +
            	goto st29;
         | 
| 577 | 
            +
            tr11:
         | 
| 578 | 
            +
            #line 265 "parser.rl"
         | 
| 555 579 | 
             
            	{
         | 
| 556 580 | 
             
                    char *np;
         | 
| 557 | 
            -
                    json | 
| 558 | 
            -
                    np = | 
| 559 | 
            -
                    json->current_nesting--;
         | 
| 560 | 
            -
                    if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
         | 
| 581 | 
            +
                    np =  JSON_parse_object(json, p, pe, result, current_nesting + 1);
         | 
| 582 | 
            +
                    if (np == NULL) { p--; {p++; cs = 29; goto _out;} } else {p = (( np))-1;}
         | 
| 561 583 | 
             
                }
         | 
| 562 | 
            -
            	goto  | 
| 563 | 
            -
             | 
| 564 | 
            -
            #line  | 
| 584 | 
            +
            	goto st29;
         | 
| 585 | 
            +
            tr25:
         | 
| 586 | 
            +
            #line 229 "parser.rl"
         | 
| 565 587 | 
             
            	{
         | 
| 566 588 | 
             
                    if (json->allow_nan) {
         | 
| 567 589 | 
             
                        *result = CInfinity;
         | 
| 568 590 | 
             
                    } else {
         | 
| 569 | 
            -
                         | 
| 591 | 
            +
                        rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p - 8);
         | 
| 570 592 | 
             
                    }
         | 
| 571 593 | 
             
                }
         | 
| 572 | 
            -
            	goto  | 
| 573 | 
            -
             | 
| 574 | 
            -
            #line  | 
| 594 | 
            +
            	goto st29;
         | 
| 595 | 
            +
            tr27:
         | 
| 596 | 
            +
            #line 222 "parser.rl"
         | 
| 575 597 | 
             
            	{
         | 
| 576 598 | 
             
                    if (json->allow_nan) {
         | 
| 577 599 | 
             
                        *result = CNaN;
         | 
| 578 600 | 
             
                    } else {
         | 
| 579 | 
            -
                         | 
| 601 | 
            +
                        rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p - 2);
         | 
| 580 602 | 
             
                    }
         | 
| 581 603 | 
             
                }
         | 
| 582 | 
            -
            	goto  | 
| 583 | 
            -
             | 
| 584 | 
            -
            #line  | 
| 604 | 
            +
            	goto st29;
         | 
| 605 | 
            +
            tr31:
         | 
| 606 | 
            +
            #line 216 "parser.rl"
         | 
| 585 607 | 
             
            	{
         | 
| 586 608 | 
             
                    *result = Qfalse;
         | 
| 587 609 | 
             
                }
         | 
| 588 | 
            -
            	goto  | 
| 589 | 
            -
             | 
| 590 | 
            -
            #line  | 
| 610 | 
            +
            	goto st29;
         | 
| 611 | 
            +
            tr34:
         | 
| 612 | 
            +
            #line 213 "parser.rl"
         | 
| 591 613 | 
             
            	{
         | 
| 592 614 | 
             
                    *result = Qnil;
         | 
| 593 615 | 
             
                }
         | 
| 594 | 
            -
            	goto  | 
| 595 | 
            -
             | 
| 596 | 
            -
            #line  | 
| 616 | 
            +
            	goto st29;
         | 
| 617 | 
            +
            tr37:
         | 
| 618 | 
            +
            #line 219 "parser.rl"
         | 
| 597 619 | 
             
            	{
         | 
| 598 620 | 
             
                    *result = Qtrue;
         | 
| 599 621 | 
             
                }
         | 
| 600 | 
            -
            	goto  | 
| 601 | 
            -
             | 
| 622 | 
            +
            	goto st29;
         | 
| 623 | 
            +
            st29:
         | 
| 602 624 | 
             
            	if ( ++p == pe )
         | 
| 603 | 
            -
            		goto  | 
| 604 | 
            -
            case  | 
| 605 | 
            -
            #line  | 
| 606 | 
            -
            	{ p--; {p++; cs =  | 
| 607 | 
            -
            #line  | 
| 625 | 
            +
            		goto _test_eof29;
         | 
| 626 | 
            +
            case 29:
         | 
| 627 | 
            +
            #line 271 "parser.rl"
         | 
| 628 | 
            +
            	{ p--; {p++; cs = 29; goto _out;} }
         | 
| 629 | 
            +
            #line 630 "parser.c"
         | 
| 630 | 
            +
            	switch( (*p) ) {
         | 
| 631 | 
            +
            		case 13: goto st29;
         | 
| 632 | 
            +
            		case 32: goto st29;
         | 
| 633 | 
            +
            		case 47: goto st2;
         | 
| 634 | 
            +
            	}
         | 
| 635 | 
            +
            	if ( 9 <= (*p) && (*p) <= 10 )
         | 
| 636 | 
            +
            		goto st29;
         | 
| 608 637 | 
             
            	goto st0;
         | 
| 609 638 | 
             
            st2:
         | 
| 610 639 | 
             
            	if ( ++p == pe )
         | 
| 611 640 | 
             
            		goto _test_eof2;
         | 
| 612 641 | 
             
            case 2:
         | 
| 613 | 
            -
            	 | 
| 614 | 
            -
            		goto st3;
         | 
| 642 | 
            +
            	switch( (*p) ) {
         | 
| 643 | 
            +
            		case 42: goto st3;
         | 
| 644 | 
            +
            		case 47: goto st5;
         | 
| 645 | 
            +
            	}
         | 
| 615 646 | 
             
            	goto st0;
         | 
| 616 647 | 
             
            st3:
         | 
| 617 648 | 
             
            	if ( ++p == pe )
         | 
| 618 649 | 
             
            		goto _test_eof3;
         | 
| 619 650 | 
             
            case 3:
         | 
| 620 | 
            -
            	if ( (*p) ==  | 
| 651 | 
            +
            	if ( (*p) == 42 )
         | 
| 621 652 | 
             
            		goto st4;
         | 
| 622 | 
            -
            	goto  | 
| 653 | 
            +
            	goto st3;
         | 
| 623 654 | 
             
            st4:
         | 
| 624 655 | 
             
            	if ( ++p == pe )
         | 
| 625 656 | 
             
            		goto _test_eof4;
         | 
| 626 657 | 
             
            case 4:
         | 
| 627 | 
            -
            	 | 
| 628 | 
            -
            		goto  | 
| 629 | 
            -
             | 
| 658 | 
            +
            	switch( (*p) ) {
         | 
| 659 | 
            +
            		case 42: goto st4;
         | 
| 660 | 
            +
            		case 47: goto st29;
         | 
| 661 | 
            +
            	}
         | 
| 662 | 
            +
            	goto st3;
         | 
| 630 663 | 
             
            st5:
         | 
| 631 664 | 
             
            	if ( ++p == pe )
         | 
| 632 665 | 
             
            		goto _test_eof5;
         | 
| 633 666 | 
             
            case 5:
         | 
| 634 | 
            -
            	if ( (*p) ==  | 
| 635 | 
            -
            		goto  | 
| 636 | 
            -
            	goto  | 
| 667 | 
            +
            	if ( (*p) == 10 )
         | 
| 668 | 
            +
            		goto st29;
         | 
| 669 | 
            +
            	goto st5;
         | 
| 637 670 | 
             
            st6:
         | 
| 638 671 | 
             
            	if ( ++p == pe )
         | 
| 639 672 | 
             
            		goto _test_eof6;
         | 
| 640 673 | 
             
            case 6:
         | 
| 641 | 
            -
            	 | 
| 642 | 
            -
            		goto st7;
         | 
| 674 | 
            +
            	switch( (*p) ) {
         | 
| 675 | 
            +
            		case 42: goto st7;
         | 
| 676 | 
            +
            		case 47: goto st9;
         | 
| 677 | 
            +
            	}
         | 
| 643 678 | 
             
            	goto st0;
         | 
| 644 679 | 
             
            st7:
         | 
| 645 680 | 
             
            	if ( ++p == pe )
         | 
| 646 681 | 
             
            		goto _test_eof7;
         | 
| 647 682 | 
             
            case 7:
         | 
| 648 | 
            -
            	if ( (*p) ==  | 
| 683 | 
            +
            	if ( (*p) == 42 )
         | 
| 649 684 | 
             
            		goto st8;
         | 
| 650 | 
            -
            	goto  | 
| 685 | 
            +
            	goto st7;
         | 
| 651 686 | 
             
            st8:
         | 
| 652 687 | 
             
            	if ( ++p == pe )
         | 
| 653 688 | 
             
            		goto _test_eof8;
         | 
| 654 689 | 
             
            case 8:
         | 
| 655 | 
            -
            	 | 
| 656 | 
            -
            		goto  | 
| 657 | 
            -
             | 
| 690 | 
            +
            	switch( (*p) ) {
         | 
| 691 | 
            +
            		case 42: goto st8;
         | 
| 692 | 
            +
            		case 47: goto st1;
         | 
| 693 | 
            +
            	}
         | 
| 694 | 
            +
            	goto st7;
         | 
| 658 695 | 
             
            st9:
         | 
| 659 696 | 
             
            	if ( ++p == pe )
         | 
| 660 697 | 
             
            		goto _test_eof9;
         | 
| 661 698 | 
             
            case 9:
         | 
| 662 | 
            -
            	if ( (*p) ==  | 
| 663 | 
            -
            		goto  | 
| 664 | 
            -
            	goto  | 
| 699 | 
            +
            	if ( (*p) == 10 )
         | 
| 700 | 
            +
            		goto st1;
         | 
| 701 | 
            +
            	goto st9;
         | 
| 665 702 | 
             
            st10:
         | 
| 666 703 | 
             
            	if ( ++p == pe )
         | 
| 667 704 | 
             
            		goto _test_eof10;
         | 
| 668 705 | 
             
            case 10:
         | 
| 669 | 
            -
            	if ( (*p) ==  | 
| 670 | 
            -
            		goto  | 
| 706 | 
            +
            	if ( (*p) == 110 )
         | 
| 707 | 
            +
            		goto st11;
         | 
| 671 708 | 
             
            	goto st0;
         | 
| 672 709 | 
             
            st11:
         | 
| 673 710 | 
             
            	if ( ++p == pe )
         | 
| 674 711 | 
             
            		goto _test_eof11;
         | 
| 675 712 | 
             
            case 11:
         | 
| 676 | 
            -
            	if ( (*p) ==  | 
| 713 | 
            +
            	if ( (*p) == 102 )
         | 
| 677 714 | 
             
            		goto st12;
         | 
| 678 715 | 
             
            	goto st0;
         | 
| 679 716 | 
             
            st12:
         | 
| 680 717 | 
             
            	if ( ++p == pe )
         | 
| 681 718 | 
             
            		goto _test_eof12;
         | 
| 682 719 | 
             
            case 12:
         | 
| 683 | 
            -
            	if ( (*p) ==  | 
| 720 | 
            +
            	if ( (*p) == 105 )
         | 
| 684 721 | 
             
            		goto st13;
         | 
| 685 722 | 
             
            	goto st0;
         | 
| 686 723 | 
             
            st13:
         | 
| 687 724 | 
             
            	if ( ++p == pe )
         | 
| 688 725 | 
             
            		goto _test_eof13;
         | 
| 689 726 | 
             
            case 13:
         | 
| 690 | 
            -
            	if ( (*p) ==  | 
| 727 | 
            +
            	if ( (*p) == 110 )
         | 
| 691 728 | 
             
            		goto st14;
         | 
| 692 729 | 
             
            	goto st0;
         | 
| 693 730 | 
             
            st14:
         | 
| 694 731 | 
             
            	if ( ++p == pe )
         | 
| 695 732 | 
             
            		goto _test_eof14;
         | 
| 696 733 | 
             
            case 14:
         | 
| 697 | 
            -
            	if ( (*p) ==  | 
| 698 | 
            -
            		goto  | 
| 734 | 
            +
            	if ( (*p) == 105 )
         | 
| 735 | 
            +
            		goto st15;
         | 
| 699 736 | 
             
            	goto st0;
         | 
| 700 737 | 
             
            st15:
         | 
| 701 738 | 
             
            	if ( ++p == pe )
         | 
| 702 739 | 
             
            		goto _test_eof15;
         | 
| 703 740 | 
             
            case 15:
         | 
| 704 | 
            -
            	if ( (*p) ==  | 
| 741 | 
            +
            	if ( (*p) == 116 )
         | 
| 705 742 | 
             
            		goto st16;
         | 
| 706 743 | 
             
            	goto st0;
         | 
| 707 744 | 
             
            st16:
         | 
| 708 745 | 
             
            	if ( ++p == pe )
         | 
| 709 746 | 
             
            		goto _test_eof16;
         | 
| 710 747 | 
             
            case 16:
         | 
| 711 | 
            -
            	if ( (*p) ==  | 
| 712 | 
            -
            		goto  | 
| 748 | 
            +
            	if ( (*p) == 121 )
         | 
| 749 | 
            +
            		goto tr25;
         | 
| 713 750 | 
             
            	goto st0;
         | 
| 714 751 | 
             
            st17:
         | 
| 715 752 | 
             
            	if ( ++p == pe )
         | 
| 716 753 | 
             
            		goto _test_eof17;
         | 
| 717 754 | 
             
            case 17:
         | 
| 718 | 
            -
            	if ( (*p) ==  | 
| 719 | 
            -
            		goto  | 
| 755 | 
            +
            	if ( (*p) == 97 )
         | 
| 756 | 
            +
            		goto st18;
         | 
| 720 757 | 
             
            	goto st0;
         | 
| 721 758 | 
             
            st18:
         | 
| 722 759 | 
             
            	if ( ++p == pe )
         | 
| 723 760 | 
             
            		goto _test_eof18;
         | 
| 724 761 | 
             
            case 18:
         | 
| 725 | 
            -
            	if ( (*p) ==  | 
| 726 | 
            -
            		goto  | 
| 762 | 
            +
            	if ( (*p) == 78 )
         | 
| 763 | 
            +
            		goto tr27;
         | 
| 727 764 | 
             
            	goto st0;
         | 
| 728 765 | 
             
            st19:
         | 
| 729 766 | 
             
            	if ( ++p == pe )
         | 
| 730 767 | 
             
            		goto _test_eof19;
         | 
| 731 768 | 
             
            case 19:
         | 
| 732 | 
            -
            	if ( (*p) ==  | 
| 769 | 
            +
            	if ( (*p) == 97 )
         | 
| 733 770 | 
             
            		goto st20;
         | 
| 734 771 | 
             
            	goto st0;
         | 
| 735 772 | 
             
            st20:
         | 
| 736 773 | 
             
            	if ( ++p == pe )
         | 
| 737 774 | 
             
            		goto _test_eof20;
         | 
| 738 775 | 
             
            case 20:
         | 
| 776 | 
            +
            	if ( (*p) == 108 )
         | 
| 777 | 
            +
            		goto st21;
         | 
| 778 | 
            +
            	goto st0;
         | 
| 779 | 
            +
            st21:
         | 
| 780 | 
            +
            	if ( ++p == pe )
         | 
| 781 | 
            +
            		goto _test_eof21;
         | 
| 782 | 
            +
            case 21:
         | 
| 783 | 
            +
            	if ( (*p) == 115 )
         | 
| 784 | 
            +
            		goto st22;
         | 
| 785 | 
            +
            	goto st0;
         | 
| 786 | 
            +
            st22:
         | 
| 787 | 
            +
            	if ( ++p == pe )
         | 
| 788 | 
            +
            		goto _test_eof22;
         | 
| 789 | 
            +
            case 22:
         | 
| 739 790 | 
             
            	if ( (*p) == 101 )
         | 
| 740 | 
            -
            		goto  | 
| 791 | 
            +
            		goto tr31;
         | 
| 792 | 
            +
            	goto st0;
         | 
| 793 | 
            +
            st23:
         | 
| 794 | 
            +
            	if ( ++p == pe )
         | 
| 795 | 
            +
            		goto _test_eof23;
         | 
| 796 | 
            +
            case 23:
         | 
| 797 | 
            +
            	if ( (*p) == 117 )
         | 
| 798 | 
            +
            		goto st24;
         | 
| 799 | 
            +
            	goto st0;
         | 
| 800 | 
            +
            st24:
         | 
| 801 | 
            +
            	if ( ++p == pe )
         | 
| 802 | 
            +
            		goto _test_eof24;
         | 
| 803 | 
            +
            case 24:
         | 
| 804 | 
            +
            	if ( (*p) == 108 )
         | 
| 805 | 
            +
            		goto st25;
         | 
| 806 | 
            +
            	goto st0;
         | 
| 807 | 
            +
            st25:
         | 
| 808 | 
            +
            	if ( ++p == pe )
         | 
| 809 | 
            +
            		goto _test_eof25;
         | 
| 810 | 
            +
            case 25:
         | 
| 811 | 
            +
            	if ( (*p) == 108 )
         | 
| 812 | 
            +
            		goto tr34;
         | 
| 813 | 
            +
            	goto st0;
         | 
| 814 | 
            +
            st26:
         | 
| 815 | 
            +
            	if ( ++p == pe )
         | 
| 816 | 
            +
            		goto _test_eof26;
         | 
| 817 | 
            +
            case 26:
         | 
| 818 | 
            +
            	if ( (*p) == 114 )
         | 
| 819 | 
            +
            		goto st27;
         | 
| 820 | 
            +
            	goto st0;
         | 
| 821 | 
            +
            st27:
         | 
| 822 | 
            +
            	if ( ++p == pe )
         | 
| 823 | 
            +
            		goto _test_eof27;
         | 
| 824 | 
            +
            case 27:
         | 
| 825 | 
            +
            	if ( (*p) == 117 )
         | 
| 826 | 
            +
            		goto st28;
         | 
| 827 | 
            +
            	goto st0;
         | 
| 828 | 
            +
            st28:
         | 
| 829 | 
            +
            	if ( ++p == pe )
         | 
| 830 | 
            +
            		goto _test_eof28;
         | 
| 831 | 
            +
            case 28:
         | 
| 832 | 
            +
            	if ( (*p) == 101 )
         | 
| 833 | 
            +
            		goto tr37;
         | 
| 741 834 | 
             
            	goto st0;
         | 
| 742 835 | 
             
            	}
         | 
| 743 | 
            -
            	 | 
| 836 | 
            +
            	_test_eof1: cs = 1; goto _test_eof;
         | 
| 837 | 
            +
            	_test_eof29: cs = 29; goto _test_eof;
         | 
| 744 838 | 
             
            	_test_eof2: cs = 2; goto _test_eof;
         | 
| 745 839 | 
             
            	_test_eof3: cs = 3; goto _test_eof;
         | 
| 746 840 | 
             
            	_test_eof4: cs = 4; goto _test_eof;
         | 
| @@ -760,12 +854,20 @@ case 20: | |
| 760 854 | 
             
            	_test_eof18: cs = 18; goto _test_eof;
         | 
| 761 855 | 
             
            	_test_eof19: cs = 19; goto _test_eof;
         | 
| 762 856 | 
             
            	_test_eof20: cs = 20; goto _test_eof;
         | 
| 857 | 
            +
            	_test_eof21: cs = 21; goto _test_eof;
         | 
| 858 | 
            +
            	_test_eof22: cs = 22; goto _test_eof;
         | 
| 859 | 
            +
            	_test_eof23: cs = 23; goto _test_eof;
         | 
| 860 | 
            +
            	_test_eof24: cs = 24; goto _test_eof;
         | 
| 861 | 
            +
            	_test_eof25: cs = 25; goto _test_eof;
         | 
| 862 | 
            +
            	_test_eof26: cs = 26; goto _test_eof;
         | 
| 863 | 
            +
            	_test_eof27: cs = 27; goto _test_eof;
         | 
| 864 | 
            +
            	_test_eof28: cs = 28; goto _test_eof;
         | 
| 763 865 |  | 
| 764 866 | 
             
            	_test_eof: {}
         | 
| 765 867 | 
             
            	_out: {}
         | 
| 766 868 | 
             
            	}
         | 
| 767 869 |  | 
| 768 | 
            -
            #line  | 
| 870 | 
            +
            #line 292 "parser.rl"
         | 
| 769 871 |  | 
| 770 872 | 
             
                if (cs >= JSON_value_first_final) {
         | 
| 771 873 | 
             
                    return p;
         | 
| @@ -775,15 +877,15 @@ case 20: | |
| 775 877 | 
             
            }
         | 
| 776 878 |  | 
| 777 879 |  | 
| 778 | 
            -
            #line  | 
| 779 | 
            -
             | 
| 780 | 
            -
             | 
| 781 | 
            -
             | 
| 880 | 
            +
            #line 881 "parser.c"
         | 
| 881 | 
            +
            enum {JSON_integer_start = 1};
         | 
| 882 | 
            +
            enum {JSON_integer_first_final = 3};
         | 
| 883 | 
            +
            enum {JSON_integer_error = 0};
         | 
| 782 884 |  | 
| 783 | 
            -
             | 
| 885 | 
            +
            enum {JSON_integer_en_main = 1};
         | 
| 784 886 |  | 
| 785 887 |  | 
| 786 | 
            -
            #line  | 
| 888 | 
            +
            #line 308 "parser.rl"
         | 
| 787 889 |  | 
| 788 890 |  | 
| 789 891 | 
             
            static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
         | 
| @@ -791,15 +893,15 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res | |
| 791 893 | 
             
                int cs = EVIL;
         | 
| 792 894 |  | 
| 793 895 |  | 
| 794 | 
            -
            #line  | 
| 896 | 
            +
            #line 897 "parser.c"
         | 
| 795 897 | 
             
            	{
         | 
| 796 898 | 
             
            	cs = JSON_integer_start;
         | 
| 797 899 | 
             
            	}
         | 
| 798 900 |  | 
| 799 | 
            -
            #line  | 
| 901 | 
            +
            #line 315 "parser.rl"
         | 
| 800 902 | 
             
                json->memo = p;
         | 
| 801 903 |  | 
| 802 | 
            -
            #line  | 
| 904 | 
            +
            #line 905 "parser.c"
         | 
| 803 905 | 
             
            	{
         | 
| 804 906 | 
             
            	if ( p == pe )
         | 
| 805 907 | 
             
            		goto _test_eof;
         | 
| @@ -833,14 +935,14 @@ case 3: | |
| 833 935 | 
             
            		goto st0;
         | 
| 834 936 | 
             
            	goto tr4;
         | 
| 835 937 | 
             
            tr4:
         | 
| 836 | 
            -
            #line  | 
| 938 | 
            +
            #line 305 "parser.rl"
         | 
| 837 939 | 
             
            	{ p--; {p++; cs = 4; goto _out;} }
         | 
| 838 940 | 
             
            	goto st4;
         | 
| 839 941 | 
             
            st4:
         | 
| 840 942 | 
             
            	if ( ++p == pe )
         | 
| 841 943 | 
             
            		goto _test_eof4;
         | 
| 842 944 | 
             
            case 4:
         | 
| 843 | 
            -
            #line  | 
| 945 | 
            +
            #line 946 "parser.c"
         | 
| 844 946 | 
             
            	goto st0;
         | 
| 845 947 | 
             
            st5:
         | 
| 846 948 | 
             
            	if ( ++p == pe )
         | 
| @@ -859,7 +961,7 @@ case 5: | |
| 859 961 | 
             
            	_out: {}
         | 
| 860 962 | 
             
            	}
         | 
| 861 963 |  | 
| 862 | 
            -
            #line  | 
| 964 | 
            +
            #line 317 "parser.rl"
         | 
| 863 965 |  | 
| 864 966 | 
             
                if (cs >= JSON_integer_first_final) {
         | 
| 865 967 | 
             
                    long len = p - json->memo;
         | 
| @@ -874,31 +976,44 @@ case 5: | |
| 874 976 | 
             
            }
         | 
| 875 977 |  | 
| 876 978 |  | 
| 877 | 
            -
            #line  | 
| 878 | 
            -
             | 
| 879 | 
            -
             | 
| 880 | 
            -
             | 
| 979 | 
            +
            #line 980 "parser.c"
         | 
| 980 | 
            +
            enum {JSON_float_start = 1};
         | 
| 981 | 
            +
            enum {JSON_float_first_final = 8};
         | 
| 982 | 
            +
            enum {JSON_float_error = 0};
         | 
| 881 983 |  | 
| 882 | 
            -
             | 
| 984 | 
            +
            enum {JSON_float_en_main = 1};
         | 
| 883 985 |  | 
| 884 986 |  | 
| 885 | 
            -
            #line  | 
| 987 | 
            +
            #line 342 "parser.rl"
         | 
| 886 988 |  | 
| 887 989 |  | 
| 990 | 
            +
            static int is_bigdecimal_class(VALUE obj)
         | 
| 991 | 
            +
            {
         | 
| 992 | 
            +
              if (cBigDecimal == Qundef) {
         | 
| 993 | 
            +
                if (rb_const_defined(rb_cObject, i_BigDecimal)) {
         | 
| 994 | 
            +
                  cBigDecimal = rb_const_get_at(rb_cObject, i_BigDecimal);
         | 
| 995 | 
            +
                }
         | 
| 996 | 
            +
                else {
         | 
| 997 | 
            +
                  return 0;
         | 
| 998 | 
            +
                }
         | 
| 999 | 
            +
              }
         | 
| 1000 | 
            +
              return obj == cBigDecimal;
         | 
| 1001 | 
            +
            }
         | 
| 1002 | 
            +
             | 
| 888 1003 | 
             
            static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
         | 
| 889 1004 | 
             
            {
         | 
| 890 1005 | 
             
                int cs = EVIL;
         | 
| 891 1006 |  | 
| 892 1007 |  | 
| 893 | 
            -
            #line  | 
| 1008 | 
            +
            #line 1009 "parser.c"
         | 
| 894 1009 | 
             
            	{
         | 
| 895 1010 | 
             
            	cs = JSON_float_start;
         | 
| 896 1011 | 
             
            	}
         | 
| 897 1012 |  | 
| 898 | 
            -
            #line  | 
| 1013 | 
            +
            #line 362 "parser.rl"
         | 
| 899 1014 | 
             
                json->memo = p;
         | 
| 900 1015 |  | 
| 901 | 
            -
            #line  | 
| 1016 | 
            +
            #line 1017 "parser.c"
         | 
| 902 1017 | 
             
            	{
         | 
| 903 1018 | 
             
            	if ( p == pe )
         | 
| 904 1019 | 
             
            		goto _test_eof;
         | 
| @@ -956,14 +1071,14 @@ case 8: | |
| 956 1071 | 
             
            		goto st0;
         | 
| 957 1072 | 
             
            	goto tr9;
         | 
| 958 1073 | 
             
            tr9:
         | 
| 959 | 
            -
            #line  | 
| 1074 | 
            +
            #line 336 "parser.rl"
         | 
| 960 1075 | 
             
            	{ p--; {p++; cs = 9; goto _out;} }
         | 
| 961 1076 | 
             
            	goto st9;
         | 
| 962 1077 | 
             
            st9:
         | 
| 963 1078 | 
             
            	if ( ++p == pe )
         | 
| 964 1079 | 
             
            		goto _test_eof9;
         | 
| 965 1080 | 
             
            case 9:
         | 
| 966 | 
            -
            #line  | 
| 1081 | 
            +
            #line 1082 "parser.c"
         | 
| 967 1082 | 
             
            	goto st0;
         | 
| 968 1083 | 
             
            st5:
         | 
| 969 1084 | 
             
            	if ( ++p == pe )
         | 
| @@ -1024,14 +1139,24 @@ case 7: | |
| 1024 1139 | 
             
            	_out: {}
         | 
| 1025 1140 | 
             
            	}
         | 
| 1026 1141 |  | 
| 1027 | 
            -
            #line  | 
| 1142 | 
            +
            #line 364 "parser.rl"
         | 
| 1028 1143 |  | 
| 1029 1144 | 
             
                if (cs >= JSON_float_first_final) {
         | 
| 1030 1145 | 
             
                    long len = p - json->memo;
         | 
| 1031 1146 | 
             
                    fbuffer_clear(json->fbuffer);
         | 
| 1032 1147 | 
             
                    fbuffer_append(json->fbuffer, json->memo, len);
         | 
| 1033 1148 | 
             
                    fbuffer_append_char(json->fbuffer, '\0');
         | 
| 1034 | 
            -
                     | 
| 1149 | 
            +
                    if (NIL_P(json->decimal_class)) {
         | 
| 1150 | 
            +
                      *result = rb_float_new(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
         | 
| 1151 | 
            +
                    } else {
         | 
| 1152 | 
            +
                      VALUE text;
         | 
| 1153 | 
            +
                      text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
         | 
| 1154 | 
            +
                      if (is_bigdecimal_class(json->decimal_class)) {
         | 
| 1155 | 
            +
                        *result = rb_funcall(Qnil, i_BigDecimal, 1, text);
         | 
| 1156 | 
            +
                      } else {
         | 
| 1157 | 
            +
                        *result = rb_funcall(json->decimal_class, i_new, 1, text);
         | 
| 1158 | 
            +
                      }
         | 
| 1159 | 
            +
                    }
         | 
| 1035 1160 | 
             
                    return p + 1;
         | 
| 1036 1161 | 
             
                } else {
         | 
| 1037 1162 | 
             
                    return NULL;
         | 
| @@ -1040,36 +1165,36 @@ case 7: | |
| 1040 1165 |  | 
| 1041 1166 |  | 
| 1042 1167 |  | 
| 1043 | 
            -
            #line  | 
| 1044 | 
            -
             | 
| 1045 | 
            -
             | 
| 1046 | 
            -
             | 
| 1168 | 
            +
            #line 1169 "parser.c"
         | 
| 1169 | 
            +
            enum {JSON_array_start = 1};
         | 
| 1170 | 
            +
            enum {JSON_array_first_final = 17};
         | 
| 1171 | 
            +
            enum {JSON_array_error = 0};
         | 
| 1047 1172 |  | 
| 1048 | 
            -
             | 
| 1173 | 
            +
            enum {JSON_array_en_main = 1};
         | 
| 1049 1174 |  | 
| 1050 1175 |  | 
| 1051 | 
            -
            #line  | 
| 1176 | 
            +
            #line 417 "parser.rl"
         | 
| 1052 1177 |  | 
| 1053 1178 |  | 
| 1054 | 
            -
            static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
         | 
| 1179 | 
            +
            static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
         | 
| 1055 1180 | 
             
            {
         | 
| 1056 1181 | 
             
                int cs = EVIL;
         | 
| 1057 1182 | 
             
                VALUE array_class = json->array_class;
         | 
| 1058 1183 |  | 
| 1059 | 
            -
                if (json->max_nesting &&  | 
| 1060 | 
            -
                    rb_raise(eNestingError, "nesting of %d is too deep",  | 
| 1184 | 
            +
                if (json->max_nesting && current_nesting > json->max_nesting) {
         | 
| 1185 | 
            +
                    rb_raise(eNestingError, "nesting of %d is too deep", current_nesting);
         | 
| 1061 1186 | 
             
                }
         | 
| 1062 1187 | 
             
                *result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class);
         | 
| 1063 1188 |  | 
| 1064 1189 |  | 
| 1065 | 
            -
            #line  | 
| 1190 | 
            +
            #line 1191 "parser.c"
         | 
| 1066 1191 | 
             
            	{
         | 
| 1067 1192 | 
             
            	cs = JSON_array_start;
         | 
| 1068 1193 | 
             
            	}
         | 
| 1069 1194 |  | 
| 1070 | 
            -
            #line  | 
| 1195 | 
            +
            #line 430 "parser.rl"
         | 
| 1071 1196 |  | 
| 1072 | 
            -
            #line  | 
| 1197 | 
            +
            #line 1198 "parser.c"
         | 
| 1073 1198 | 
             
            	{
         | 
| 1074 1199 | 
             
            	if ( p == pe )
         | 
| 1075 1200 | 
             
            		goto _test_eof;
         | 
| @@ -1108,10 +1233,10 @@ case 2: | |
| 1108 1233 | 
             
            		goto st2;
         | 
| 1109 1234 | 
             
            	goto st0;
         | 
| 1110 1235 | 
             
            tr2:
         | 
| 1111 | 
            -
            #line  | 
| 1236 | 
            +
            #line 394 "parser.rl"
         | 
| 1112 1237 | 
             
            	{
         | 
| 1113 1238 | 
             
                    VALUE v = Qnil;
         | 
| 1114 | 
            -
                    char *np = JSON_parse_value(json, p, pe, &v);
         | 
| 1239 | 
            +
                    char *np = JSON_parse_value(json, p, pe, &v, current_nesting);
         | 
| 1115 1240 | 
             
                    if (np == NULL) {
         | 
| 1116 1241 | 
             
                        p--; {p++; cs = 3; goto _out;}
         | 
| 1117 1242 | 
             
                    } else {
         | 
| @@ -1128,7 +1253,7 @@ st3: | |
| 1128 1253 | 
             
            	if ( ++p == pe )
         | 
| 1129 1254 | 
             
            		goto _test_eof3;
         | 
| 1130 1255 | 
             
            case 3:
         | 
| 1131 | 
            -
            #line  | 
| 1256 | 
            +
            #line 1257 "parser.c"
         | 
| 1132 1257 | 
             
            	switch( (*p) ) {
         | 
| 1133 1258 | 
             
            		case 13: goto st3;
         | 
| 1134 1259 | 
             
            		case 32: goto st3;
         | 
| @@ -1228,14 +1353,14 @@ case 12: | |
| 1228 1353 | 
             
            		goto st3;
         | 
| 1229 1354 | 
             
            	goto st12;
         | 
| 1230 1355 | 
             
            tr4:
         | 
| 1231 | 
            -
            #line  | 
| 1356 | 
            +
            #line 409 "parser.rl"
         | 
| 1232 1357 | 
             
            	{ p--; {p++; cs = 17; goto _out;} }
         | 
| 1233 1358 | 
             
            	goto st17;
         | 
| 1234 1359 | 
             
            st17:
         | 
| 1235 1360 | 
             
            	if ( ++p == pe )
         | 
| 1236 1361 | 
             
            		goto _test_eof17;
         | 
| 1237 1362 | 
             
            case 17:
         | 
| 1238 | 
            -
            #line  | 
| 1363 | 
            +
            #line 1364 "parser.c"
         | 
| 1239 1364 | 
             
            	goto st0;
         | 
| 1240 1365 | 
             
            st13:
         | 
| 1241 1366 | 
             
            	if ( ++p == pe )
         | 
| @@ -1291,12 +1416,12 @@ case 16: | |
| 1291 1416 | 
             
            	_out: {}
         | 
| 1292 1417 | 
             
            	}
         | 
| 1293 1418 |  | 
| 1294 | 
            -
            #line  | 
| 1419 | 
            +
            #line 431 "parser.rl"
         | 
| 1295 1420 |  | 
| 1296 1421 | 
             
                if(cs >= JSON_array_first_final) {
         | 
| 1297 1422 | 
             
                    return p + 1;
         | 
| 1298 1423 | 
             
                } else {
         | 
| 1299 | 
            -
                     | 
| 1424 | 
            +
                    rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p);
         | 
| 1300 1425 | 
             
                    return NULL;
         | 
| 1301 1426 | 
             
                }
         | 
| 1302 1427 | 
             
            }
         | 
| @@ -1336,13 +1461,21 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd) | |
| 1336 1461 | 
             
                                break;
         | 
| 1337 1462 | 
             
                            case 'u':
         | 
| 1338 1463 | 
             
                                if (pe > stringEnd - 4) {
         | 
| 1339 | 
            -
             | 
| 1464 | 
            +
                                  rb_enc_raise(
         | 
| 1465 | 
            +
                                    EXC_ENCODING eParserError,
         | 
| 1466 | 
            +
                                    "%u: incomplete unicode character escape sequence at '%s'", __LINE__, p
         | 
| 1467 | 
            +
                                  );
         | 
| 1340 1468 | 
             
                                } else {
         | 
| 1341 1469 | 
             
                                    UTF32 ch = unescape_unicode((unsigned char *) ++pe);
         | 
| 1342 1470 | 
             
                                    pe += 3;
         | 
| 1343 1471 | 
             
                                    if (UNI_SUR_HIGH_START == (ch & 0xFC00)) {
         | 
| 1344 1472 | 
             
                                        pe++;
         | 
| 1345 | 
            -
                                        if (pe > stringEnd - 6)  | 
| 1473 | 
            +
                                        if (pe > stringEnd - 6) {
         | 
| 1474 | 
            +
                                          rb_enc_raise(
         | 
| 1475 | 
            +
                                            EXC_ENCODING eParserError,
         | 
| 1476 | 
            +
                                            "%u: incomplete surrogate pair at '%s'", __LINE__, p
         | 
| 1477 | 
            +
                                            );
         | 
| 1478 | 
            +
                                        }
         | 
| 1346 1479 | 
             
                                        if (pe[0] == '\\' && pe[1] == 'u') {
         | 
| 1347 1480 | 
             
                                            UTF32 sur = unescape_unicode((unsigned char *) pe + 2);
         | 
| 1348 1481 | 
             
                                            ch = (((ch & 0x3F) << 10) | ((((ch >> 6) & 0xF) + 1) << 16)
         | 
| @@ -1372,15 +1505,15 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd) | |
| 1372 1505 | 
             
            }
         | 
| 1373 1506 |  | 
| 1374 1507 |  | 
| 1375 | 
            -
            #line  | 
| 1376 | 
            -
             | 
| 1377 | 
            -
             | 
| 1378 | 
            -
             | 
| 1508 | 
            +
            #line 1509 "parser.c"
         | 
| 1509 | 
            +
            enum {JSON_string_start = 1};
         | 
| 1510 | 
            +
            enum {JSON_string_first_final = 8};
         | 
| 1511 | 
            +
            enum {JSON_string_error = 0};
         | 
| 1379 1512 |  | 
| 1380 | 
            -
             | 
| 1513 | 
            +
            enum {JSON_string_en_main = 1};
         | 
| 1381 1514 |  | 
| 1382 1515 |  | 
| 1383 | 
            -
            #line  | 
| 1516 | 
            +
            #line 538 "parser.rl"
         | 
| 1384 1517 |  | 
| 1385 1518 |  | 
| 1386 1519 | 
             
            static int
         | 
| @@ -1402,15 +1535,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu | |
| 1402 1535 |  | 
| 1403 1536 | 
             
                *result = rb_str_buf_new(0);
         | 
| 1404 1537 |  | 
| 1405 | 
            -
            #line  | 
| 1538 | 
            +
            #line 1539 "parser.c"
         | 
| 1406 1539 | 
             
            	{
         | 
| 1407 1540 | 
             
            	cs = JSON_string_start;
         | 
| 1408 1541 | 
             
            	}
         | 
| 1409 1542 |  | 
| 1410 | 
            -
            #line  | 
| 1543 | 
            +
            #line 559 "parser.rl"
         | 
| 1411 1544 | 
             
                json->memo = p;
         | 
| 1412 1545 |  | 
| 1413 | 
            -
            #line  | 
| 1546 | 
            +
            #line 1547 "parser.c"
         | 
| 1414 1547 | 
             
            	{
         | 
| 1415 1548 | 
             
            	if ( p == pe )
         | 
| 1416 1549 | 
             
            		goto _test_eof;
         | 
| @@ -1431,11 +1564,11 @@ case 2: | |
| 1431 1564 | 
             
            		case 34: goto tr2;
         | 
| 1432 1565 | 
             
            		case 92: goto st3;
         | 
| 1433 1566 | 
             
            	}
         | 
| 1434 | 
            -
            	if ( 0 <= (*p) && (*p) <= 31 )
         | 
| 1567 | 
            +
            	if ( 0 <= (signed char)(*p) && (*p) <= 31 )
         | 
| 1435 1568 | 
             
            		goto st0;
         | 
| 1436 1569 | 
             
            	goto st2;
         | 
| 1437 1570 | 
             
            tr2:
         | 
| 1438 | 
            -
            #line  | 
| 1571 | 
            +
            #line 524 "parser.rl"
         | 
| 1439 1572 | 
             
            	{
         | 
| 1440 1573 | 
             
                    *result = json_string_unescape(*result, json->memo + 1, p);
         | 
| 1441 1574 | 
             
                    if (NIL_P(*result)) {
         | 
| @@ -1446,14 +1579,14 @@ tr2: | |
| 1446 1579 | 
             
                        {p = (( p + 1))-1;}
         | 
| 1447 1580 | 
             
                    }
         | 
| 1448 1581 | 
             
                }
         | 
| 1449 | 
            -
            #line  | 
| 1582 | 
            +
            #line 535 "parser.rl"
         | 
| 1450 1583 | 
             
            	{ p--; {p++; cs = 8; goto _out;} }
         | 
| 1451 1584 | 
             
            	goto st8;
         | 
| 1452 1585 | 
             
            st8:
         | 
| 1453 1586 | 
             
            	if ( ++p == pe )
         | 
| 1454 1587 | 
             
            		goto _test_eof8;
         | 
| 1455 1588 | 
             
            case 8:
         | 
| 1456 | 
            -
            #line  | 
| 1589 | 
            +
            #line 1590 "parser.c"
         | 
| 1457 1590 | 
             
            	goto st0;
         | 
| 1458 1591 | 
             
            st3:
         | 
| 1459 1592 | 
             
            	if ( ++p == pe )
         | 
| @@ -1461,7 +1594,7 @@ st3: | |
| 1461 1594 | 
             
            case 3:
         | 
| 1462 1595 | 
             
            	if ( (*p) == 117 )
         | 
| 1463 1596 | 
             
            		goto st4;
         | 
| 1464 | 
            -
            	if ( 0 <= (*p) && (*p) <= 31 )
         | 
| 1597 | 
            +
            	if ( 0 <= (signed char)(*p) && (*p) <= 31 )
         | 
| 1465 1598 | 
             
            		goto st0;
         | 
| 1466 1599 | 
             
            	goto st2;
         | 
| 1467 1600 | 
             
            st4:
         | 
| @@ -1529,7 +1662,7 @@ case 7: | |
| 1529 1662 | 
             
            	_out: {}
         | 
| 1530 1663 | 
             
            	}
         | 
| 1531 1664 |  | 
| 1532 | 
            -
            #line  | 
| 1665 | 
            +
            #line 561 "parser.rl"
         | 
| 1533 1666 |  | 
| 1534 1667 | 
             
                if (json->create_additions && RTEST(match_string = json->match_string)) {
         | 
| 1535 1668 | 
             
                      VALUE klass;
         | 
| @@ -1544,6 +1677,8 @@ case 7: | |
| 1544 1677 |  | 
| 1545 1678 | 
             
                if (json->symbolize_names && json->parsing_name) {
         | 
| 1546 1679 | 
             
                  *result = rb_str_intern(*result);
         | 
| 1680 | 
            +
                } else if (RB_TYPE_P(*result, T_STRING)) {
         | 
| 1681 | 
            +
                  rb_str_resize(*result, RSTRING_LEN(*result));
         | 
| 1547 1682 | 
             
                }
         | 
| 1548 1683 | 
             
                if (cs >= JSON_string_first_final) {
         | 
| 1549 1684 | 
             
                    return p + 1;
         | 
| @@ -1566,41 +1701,16 @@ case 7: | |
| 1566 1701 |  | 
| 1567 1702 | 
             
            static VALUE convert_encoding(VALUE source)
         | 
| 1568 1703 | 
             
            {
         | 
| 1569 | 
            -
                char *ptr = RSTRING_PTR(source);
         | 
| 1570 | 
            -
                long len = RSTRING_LEN(source);
         | 
| 1571 | 
            -
                if (len < 2) {
         | 
| 1572 | 
            -
                    rb_raise(eParserError, "A JSON text must at least contain two octets!");
         | 
| 1573 | 
            -
                }
         | 
| 1574 1704 | 
             
            #ifdef HAVE_RUBY_ENCODING_H
         | 
| 1575 | 
            -
             | 
| 1576 | 
            -
             | 
| 1577 | 
            -
             | 
| 1578 | 
            -
             | 
| 1579 | 
            -
                            source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_32BE);
         | 
| 1580 | 
            -
                        } else if (len >= 4 && ptr[0] == 0 && ptr[2] == 0) {
         | 
| 1581 | 
            -
                            source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_16BE);
         | 
| 1582 | 
            -
                        } else if (len >= 4 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) {
         | 
| 1583 | 
            -
                            source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_32LE);
         | 
| 1584 | 
            -
                        } else if (len >= 4 && ptr[1] == 0 && ptr[3] == 0) {
         | 
| 1585 | 
            -
                            source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_16LE);
         | 
| 1586 | 
            -
                        } else {
         | 
| 1587 | 
            -
                            source = rb_str_dup(source);
         | 
| 1588 | 
            -
                            FORCE_UTF8(source);
         | 
| 1589 | 
            -
                        }
         | 
| 1590 | 
            -
                    } else {
         | 
| 1591 | 
            -
                        source = rb_funcall(source, i_encode, 1, CEncoding_UTF_8);
         | 
| 1592 | 
            -
                    }
         | 
| 1593 | 
            -
                }
         | 
| 1594 | 
            -
            #else
         | 
| 1595 | 
            -
                if (len >= 4 &&  ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0) {
         | 
| 1596 | 
            -
                  source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-32be"), source);
         | 
| 1597 | 
            -
                } else if (len >= 4 && ptr[0] == 0 && ptr[2] == 0) {
         | 
| 1598 | 
            -
                  source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-16be"), source);
         | 
| 1599 | 
            -
                } else if (len >= 4 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) {
         | 
| 1600 | 
            -
                  source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-32le"), source);
         | 
| 1601 | 
            -
                } else if (len >= 4 && ptr[1] == 0 && ptr[3] == 0) {
         | 
| 1602 | 
            -
                  source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-16le"), source);
         | 
| 1705 | 
            +
              rb_encoding *enc = rb_enc_get(source);
         | 
| 1706 | 
            +
              if (enc == rb_ascii8bit_encoding()) {
         | 
| 1707 | 
            +
                if (OBJ_FROZEN(source)) {
         | 
| 1708 | 
            +
                  source = rb_str_dup(source);
         | 
| 1603 1709 | 
             
                }
         | 
| 1710 | 
            +
                FORCE_UTF8(source);
         | 
| 1711 | 
            +
              } else {
         | 
| 1712 | 
            +
                source = rb_str_conv_enc(source, rb_enc_get(source), rb_utf8_encoding());
         | 
| 1713 | 
            +
              }
         | 
| 1604 1714 | 
             
            #endif
         | 
| 1605 1715 | 
             
                return source;
         | 
| 1606 1716 | 
             
            }
         | 
| @@ -1623,8 +1733,9 @@ static VALUE convert_encoding(VALUE source) | |
| 1623 1733 | 
             
             *   defiance of RFC 4627 to be parsed by the Parser. This option defaults to
         | 
| 1624 1734 | 
             
             *   false.
         | 
| 1625 1735 | 
             
             * * *symbolize_names*: If set to true, returns symbols for the names
         | 
| 1626 | 
            -
             *   (keys) in a JSON object. Otherwise strings are returned, which is | 
| 1627 | 
            -
             *   the default.
         | 
| 1736 | 
            +
             *   (keys) in a JSON object. Otherwise strings are returned, which is
         | 
| 1737 | 
            +
             *   also the default. It's not possible to use this option in
         | 
| 1738 | 
            +
             *   conjunction with the *create_additions* option.
         | 
| 1628 1739 | 
             
             * * *create_additions*: If set to false, the Parser doesn't create
         | 
| 1629 1740 | 
             
             *   additions even if a matching class and create_id was found. This option
         | 
| 1630 1741 | 
             
             *   defaults to false.
         | 
| @@ -1639,12 +1750,18 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self) | |
| 1639 1750 | 
             
                if (json->Vsource) {
         | 
| 1640 1751 | 
             
                    rb_raise(rb_eTypeError, "already initialized instance");
         | 
| 1641 1752 | 
             
                }
         | 
| 1753 | 
            +
            #ifdef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH
         | 
| 1754 | 
            +
                rb_scan_args(argc, argv, "1:", &source, &opts);
         | 
| 1755 | 
            +
            #else
         | 
| 1642 1756 | 
             
                rb_scan_args(argc, argv, "11", &source, &opts);
         | 
| 1757 | 
            +
            #endif
         | 
| 1643 1758 | 
             
                if (!NIL_P(opts)) {
         | 
| 1759 | 
            +
            #ifndef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH
         | 
| 1644 1760 | 
             
                    opts = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
         | 
| 1645 1761 | 
             
                    if (NIL_P(opts)) {
         | 
| 1646 1762 | 
             
                        rb_raise(rb_eArgError, "opts needs to be like a hash");
         | 
| 1647 1763 | 
             
                    } else {
         | 
| 1764 | 
            +
            #endif
         | 
| 1648 1765 | 
             
                        VALUE tmp = ID2SYM(i_max_nesting);
         | 
| 1649 1766 | 
             
                        if (option_given_p(opts, tmp)) {
         | 
| 1650 1767 | 
             
                            VALUE max_nesting = rb_hash_aref(opts, tmp);
         | 
| @@ -1669,19 +1786,17 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self) | |
| 1669 1786 | 
             
                        } else {
         | 
| 1670 1787 | 
             
                            json->symbolize_names = 0;
         | 
| 1671 1788 | 
             
                        }
         | 
| 1672 | 
            -
                        tmp = ID2SYM(i_quirks_mode);
         | 
| 1673 | 
            -
                        if (option_given_p(opts, tmp)) {
         | 
| 1674 | 
            -
                            VALUE quirks_mode = rb_hash_aref(opts, tmp);
         | 
| 1675 | 
            -
                            json->quirks_mode = RTEST(quirks_mode) ? 1 : 0;
         | 
| 1676 | 
            -
                        } else {
         | 
| 1677 | 
            -
                            json->quirks_mode = 0;
         | 
| 1678 | 
            -
                        }
         | 
| 1679 1789 | 
             
                        tmp = ID2SYM(i_create_additions);
         | 
| 1680 1790 | 
             
                        if (option_given_p(opts, tmp)) {
         | 
| 1681 1791 | 
             
                            json->create_additions = RTEST(rb_hash_aref(opts, tmp));
         | 
| 1682 1792 | 
             
                        } else {
         | 
| 1683 1793 | 
             
                            json->create_additions = 0;
         | 
| 1684 1794 | 
             
                        }
         | 
| 1795 | 
            +
                        if (json->symbolize_names && json->create_additions) {
         | 
| 1796 | 
            +
                          rb_raise(rb_eArgError,
         | 
| 1797 | 
            +
                            "options :symbolize_names and :create_additions cannot be "
         | 
| 1798 | 
            +
                            " used in conjunction");
         | 
| 1799 | 
            +
                        }
         | 
| 1685 1800 | 
             
                        tmp = ID2SYM(i_create_id);
         | 
| 1686 1801 | 
             
                        if (option_given_p(opts, tmp)) {
         | 
| 1687 1802 | 
             
                            json->create_id = rb_hash_aref(opts, tmp);
         | 
| @@ -1700,6 +1815,12 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self) | |
| 1700 1815 | 
             
                        } else {
         | 
| 1701 1816 | 
             
                            json->array_class = Qnil;
         | 
| 1702 1817 | 
             
                        }
         | 
| 1818 | 
            +
                        tmp = ID2SYM(i_decimal_class);
         | 
| 1819 | 
            +
                        if (option_given_p(opts, tmp)) {
         | 
| 1820 | 
            +
                            json->decimal_class = rb_hash_aref(opts, tmp);
         | 
| 1821 | 
            +
                        } else {
         | 
| 1822 | 
            +
                            json->decimal_class = Qnil;
         | 
| 1823 | 
            +
                        }
         | 
| 1703 1824 | 
             
                        tmp = ID2SYM(i_match_string);
         | 
| 1704 1825 | 
             
                        if (option_given_p(opts, tmp)) {
         | 
| 1705 1826 | 
             
                            VALUE match_string = rb_hash_aref(opts, tmp);
         | 
| @@ -1707,20 +1828,19 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self) | |
| 1707 1828 | 
             
                        } else {
         | 
| 1708 1829 | 
             
                            json->match_string = Qnil;
         | 
| 1709 1830 | 
             
                        }
         | 
| 1831 | 
            +
            #ifndef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH
         | 
| 1710 1832 | 
             
                    }
         | 
| 1833 | 
            +
            #endif
         | 
| 1711 1834 | 
             
                } else {
         | 
| 1712 1835 | 
             
                    json->max_nesting = 100;
         | 
| 1713 1836 | 
             
                    json->allow_nan = 0;
         | 
| 1714 | 
            -
                    json->create_additions =  | 
| 1837 | 
            +
                    json->create_additions = 0;
         | 
| 1715 1838 | 
             
                    json->create_id = rb_funcall(mJSON, i_create_id, 0);
         | 
| 1716 1839 | 
             
                    json->object_class = Qnil;
         | 
| 1717 1840 | 
             
                    json->array_class = Qnil;
         | 
| 1841 | 
            +
                    json->decimal_class = Qnil;
         | 
| 1718 1842 | 
             
                }
         | 
| 1719 | 
            -
                source =  | 
| 1720 | 
            -
                if (!json->quirks_mode) {
         | 
| 1721 | 
            -
                  source = convert_encoding(StringValue(source));
         | 
| 1722 | 
            -
                }
         | 
| 1723 | 
            -
                json->current_nesting = 0;
         | 
| 1843 | 
            +
                source = convert_encoding(StringValue(source));
         | 
| 1724 1844 | 
             
                StringValue(source);
         | 
| 1725 1845 | 
             
                json->len = RSTRING_LEN(source);
         | 
| 1726 1846 | 
             
                json->source = RSTRING_PTR(source);;
         | 
| @@ -1729,209 +1849,41 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self) | |
| 1729 1849 | 
             
            }
         | 
| 1730 1850 |  | 
| 1731 1851 |  | 
| 1732 | 
            -
            #line  | 
| 1733 | 
            -
             | 
| 1734 | 
            -
             | 
| 1735 | 
            -
             | 
| 1852 | 
            +
            #line 1853 "parser.c"
         | 
| 1853 | 
            +
            enum {JSON_start = 1};
         | 
| 1854 | 
            +
            enum {JSON_first_final = 10};
         | 
| 1855 | 
            +
            enum {JSON_error = 0};
         | 
| 1736 1856 |  | 
| 1737 | 
            -
             | 
| 1857 | 
            +
            enum {JSON_en_main = 1};
         | 
| 1738 1858 |  | 
| 1739 1859 |  | 
| 1740 | 
            -
            #line  | 
| 1860 | 
            +
            #line 761 "parser.rl"
         | 
| 1741 1861 |  | 
| 1742 1862 |  | 
| 1743 | 
            -
             | 
| 1863 | 
            +
            /*
         | 
| 1864 | 
            +
             * call-seq: parse()
         | 
| 1865 | 
            +
             *
         | 
| 1866 | 
            +
             *  Parses the current JSON text _source_ and returns the complete data
         | 
| 1867 | 
            +
             *  structure as a result.
         | 
| 1868 | 
            +
             */
         | 
| 1869 | 
            +
            static VALUE cParser_parse(VALUE self)
         | 
| 1744 1870 | 
             
            {
         | 
| 1745 | 
            -
             | 
| 1746 | 
            -
             | 
| 1747 | 
            -
             | 
| 1748 | 
            -
             | 
| 1871 | 
            +
              char *p, *pe;
         | 
| 1872 | 
            +
              int cs = EVIL;
         | 
| 1873 | 
            +
              VALUE result = Qnil;
         | 
| 1874 | 
            +
              GET_PARSER;
         | 
| 1749 1875 |  | 
| 1750 1876 |  | 
| 1751 | 
            -
            #line  | 
| 1877 | 
            +
            #line 1878 "parser.c"
         | 
| 1752 1878 | 
             
            	{
         | 
| 1753 1879 | 
             
            	cs = JSON_start;
         | 
| 1754 1880 | 
             
            	}
         | 
| 1755 1881 |  | 
| 1756 | 
            -
            #line  | 
| 1757 | 
            -
             | 
| 1758 | 
            -
             | 
| 1882 | 
            +
            #line 777 "parser.rl"
         | 
| 1883 | 
            +
              p = json->source;
         | 
| 1884 | 
            +
              pe = p + json->len;
         | 
| 1759 1885 |  | 
| 1760 | 
            -
            #line  | 
| 1761 | 
            -
            	{
         | 
| 1762 | 
            -
            	if ( p == pe )
         | 
| 1763 | 
            -
            		goto _test_eof;
         | 
| 1764 | 
            -
            	switch ( cs )
         | 
| 1765 | 
            -
            	{
         | 
| 1766 | 
            -
            st1:
         | 
| 1767 | 
            -
            	if ( ++p == pe )
         | 
| 1768 | 
            -
            		goto _test_eof1;
         | 
| 1769 | 
            -
            case 1:
         | 
| 1770 | 
            -
            	switch( (*p) ) {
         | 
| 1771 | 
            -
            		case 13: goto st1;
         | 
| 1772 | 
            -
            		case 32: goto st1;
         | 
| 1773 | 
            -
            		case 47: goto st2;
         | 
| 1774 | 
            -
            		case 91: goto tr3;
         | 
| 1775 | 
            -
            		case 123: goto tr4;
         | 
| 1776 | 
            -
            	}
         | 
| 1777 | 
            -
            	if ( 9 <= (*p) && (*p) <= 10 )
         | 
| 1778 | 
            -
            		goto st1;
         | 
| 1779 | 
            -
            	goto st0;
         | 
| 1780 | 
            -
            st0:
         | 
| 1781 | 
            -
            cs = 0;
         | 
| 1782 | 
            -
            	goto _out;
         | 
| 1783 | 
            -
            st2:
         | 
| 1784 | 
            -
            	if ( ++p == pe )
         | 
| 1785 | 
            -
            		goto _test_eof2;
         | 
| 1786 | 
            -
            case 2:
         | 
| 1787 | 
            -
            	switch( (*p) ) {
         | 
| 1788 | 
            -
            		case 42: goto st3;
         | 
| 1789 | 
            -
            		case 47: goto st5;
         | 
| 1790 | 
            -
            	}
         | 
| 1791 | 
            -
            	goto st0;
         | 
| 1792 | 
            -
            st3:
         | 
| 1793 | 
            -
            	if ( ++p == pe )
         | 
| 1794 | 
            -
            		goto _test_eof3;
         | 
| 1795 | 
            -
            case 3:
         | 
| 1796 | 
            -
            	if ( (*p) == 42 )
         | 
| 1797 | 
            -
            		goto st4;
         | 
| 1798 | 
            -
            	goto st3;
         | 
| 1799 | 
            -
            st4:
         | 
| 1800 | 
            -
            	if ( ++p == pe )
         | 
| 1801 | 
            -
            		goto _test_eof4;
         | 
| 1802 | 
            -
            case 4:
         | 
| 1803 | 
            -
            	switch( (*p) ) {
         | 
| 1804 | 
            -
            		case 42: goto st4;
         | 
| 1805 | 
            -
            		case 47: goto st1;
         | 
| 1806 | 
            -
            	}
         | 
| 1807 | 
            -
            	goto st3;
         | 
| 1808 | 
            -
            st5:
         | 
| 1809 | 
            -
            	if ( ++p == pe )
         | 
| 1810 | 
            -
            		goto _test_eof5;
         | 
| 1811 | 
            -
            case 5:
         | 
| 1812 | 
            -
            	if ( (*p) == 10 )
         | 
| 1813 | 
            -
            		goto st1;
         | 
| 1814 | 
            -
            	goto st5;
         | 
| 1815 | 
            -
            tr3:
         | 
| 1816 | 
            -
            #line 729 "parser.rl"
         | 
| 1817 | 
            -
            	{
         | 
| 1818 | 
            -
                    char *np;
         | 
| 1819 | 
            -
                    json->current_nesting = 1;
         | 
| 1820 | 
            -
                    np = JSON_parse_array(json, p, pe, &result);
         | 
| 1821 | 
            -
                    if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
         | 
| 1822 | 
            -
                }
         | 
| 1823 | 
            -
            	goto st10;
         | 
| 1824 | 
            -
            tr4:
         | 
| 1825 | 
            -
            #line 722 "parser.rl"
         | 
| 1826 | 
            -
            	{
         | 
| 1827 | 
            -
                    char *np;
         | 
| 1828 | 
            -
                    json->current_nesting = 1;
         | 
| 1829 | 
            -
                    np = JSON_parse_object(json, p, pe, &result);
         | 
| 1830 | 
            -
                    if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
         | 
| 1831 | 
            -
                }
         | 
| 1832 | 
            -
            	goto st10;
         | 
| 1833 | 
            -
            st10:
         | 
| 1834 | 
            -
            	if ( ++p == pe )
         | 
| 1835 | 
            -
            		goto _test_eof10;
         | 
| 1836 | 
            -
            case 10:
         | 
| 1837 | 
            -
            #line 1838 "parser.c"
         | 
| 1838 | 
            -
            	switch( (*p) ) {
         | 
| 1839 | 
            -
            		case 13: goto st10;
         | 
| 1840 | 
            -
            		case 32: goto st10;
         | 
| 1841 | 
            -
            		case 47: goto st6;
         | 
| 1842 | 
            -
            	}
         | 
| 1843 | 
            -
            	if ( 9 <= (*p) && (*p) <= 10 )
         | 
| 1844 | 
            -
            		goto st10;
         | 
| 1845 | 
            -
            	goto st0;
         | 
| 1846 | 
            -
            st6:
         | 
| 1847 | 
            -
            	if ( ++p == pe )
         | 
| 1848 | 
            -
            		goto _test_eof6;
         | 
| 1849 | 
            -
            case 6:
         | 
| 1850 | 
            -
            	switch( (*p) ) {
         | 
| 1851 | 
            -
            		case 42: goto st7;
         | 
| 1852 | 
            -
            		case 47: goto st9;
         | 
| 1853 | 
            -
            	}
         | 
| 1854 | 
            -
            	goto st0;
         | 
| 1855 | 
            -
            st7:
         | 
| 1856 | 
            -
            	if ( ++p == pe )
         | 
| 1857 | 
            -
            		goto _test_eof7;
         | 
| 1858 | 
            -
            case 7:
         | 
| 1859 | 
            -
            	if ( (*p) == 42 )
         | 
| 1860 | 
            -
            		goto st8;
         | 
| 1861 | 
            -
            	goto st7;
         | 
| 1862 | 
            -
            st8:
         | 
| 1863 | 
            -
            	if ( ++p == pe )
         | 
| 1864 | 
            -
            		goto _test_eof8;
         | 
| 1865 | 
            -
            case 8:
         | 
| 1866 | 
            -
            	switch( (*p) ) {
         | 
| 1867 | 
            -
            		case 42: goto st8;
         | 
| 1868 | 
            -
            		case 47: goto st10;
         | 
| 1869 | 
            -
            	}
         | 
| 1870 | 
            -
            	goto st7;
         | 
| 1871 | 
            -
            st9:
         | 
| 1872 | 
            -
            	if ( ++p == pe )
         | 
| 1873 | 
            -
            		goto _test_eof9;
         | 
| 1874 | 
            -
            case 9:
         | 
| 1875 | 
            -
            	if ( (*p) == 10 )
         | 
| 1876 | 
            -
            		goto st10;
         | 
| 1877 | 
            -
            	goto st9;
         | 
| 1878 | 
            -
            	}
         | 
| 1879 | 
            -
            	_test_eof1: cs = 1; goto _test_eof;
         | 
| 1880 | 
            -
            	_test_eof2: cs = 2; goto _test_eof;
         | 
| 1881 | 
            -
            	_test_eof3: cs = 3; goto _test_eof;
         | 
| 1882 | 
            -
            	_test_eof4: cs = 4; goto _test_eof;
         | 
| 1883 | 
            -
            	_test_eof5: cs = 5; goto _test_eof;
         | 
| 1884 | 
            -
            	_test_eof10: cs = 10; goto _test_eof;
         | 
| 1885 | 
            -
            	_test_eof6: cs = 6; goto _test_eof;
         | 
| 1886 | 
            -
            	_test_eof7: cs = 7; goto _test_eof;
         | 
| 1887 | 
            -
            	_test_eof8: cs = 8; goto _test_eof;
         | 
| 1888 | 
            -
            	_test_eof9: cs = 9; goto _test_eof;
         | 
| 1889 | 
            -
             | 
| 1890 | 
            -
            	_test_eof: {}
         | 
| 1891 | 
            -
            	_out: {}
         | 
| 1892 | 
            -
            	}
         | 
| 1893 | 
            -
             | 
| 1894 | 
            -
            #line 753 "parser.rl"
         | 
| 1895 | 
            -
             | 
| 1896 | 
            -
                if (cs >= JSON_first_final && p == pe) {
         | 
| 1897 | 
            -
                    return result;
         | 
| 1898 | 
            -
                } else {
         | 
| 1899 | 
            -
                    rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
         | 
| 1900 | 
            -
                    return Qnil;
         | 
| 1901 | 
            -
                }
         | 
| 1902 | 
            -
            }
         | 
| 1903 | 
            -
             | 
| 1904 | 
            -
             | 
| 1905 | 
            -
             | 
| 1906 | 
            -
            #line 1907 "parser.c"
         | 
| 1907 | 
            -
            static const int JSON_quirks_mode_start = 1;
         | 
| 1908 | 
            -
            static const int JSON_quirks_mode_first_final = 10;
         | 
| 1909 | 
            -
            static const int JSON_quirks_mode_error = 0;
         | 
| 1910 | 
            -
             | 
| 1911 | 
            -
            static const int JSON_quirks_mode_en_main = 1;
         | 
| 1912 | 
            -
             | 
| 1913 | 
            -
             | 
| 1914 | 
            -
            #line 778 "parser.rl"
         | 
| 1915 | 
            -
             | 
| 1916 | 
            -
             | 
| 1917 | 
            -
            static VALUE cParser_parse_quirks_mode(VALUE self)
         | 
| 1918 | 
            -
            {
         | 
| 1919 | 
            -
                char *p, *pe;
         | 
| 1920 | 
            -
                int cs = EVIL;
         | 
| 1921 | 
            -
                VALUE result = Qnil;
         | 
| 1922 | 
            -
                GET_PARSER;
         | 
| 1923 | 
            -
             | 
| 1924 | 
            -
             | 
| 1925 | 
            -
            #line 1926 "parser.c"
         | 
| 1926 | 
            -
            	{
         | 
| 1927 | 
            -
            	cs = JSON_quirks_mode_start;
         | 
| 1928 | 
            -
            	}
         | 
| 1929 | 
            -
             | 
| 1930 | 
            -
            #line 788 "parser.rl"
         | 
| 1931 | 
            -
                p = json->source;
         | 
| 1932 | 
            -
                pe = p + json->len;
         | 
| 1933 | 
            -
             | 
| 1934 | 
            -
            #line 1935 "parser.c"
         | 
| 1886 | 
            +
            #line 1887 "parser.c"
         | 
| 1935 1887 | 
             
            	{
         | 
| 1936 1888 | 
             
            	if ( p == pe )
         | 
| 1937 1889 | 
             
            		goto _test_eof;
         | 
| @@ -1965,9 +1917,9 @@ st0: | |
| 1965 1917 | 
             
            cs = 0;
         | 
| 1966 1918 | 
             
            	goto _out;
         | 
| 1967 1919 | 
             
            tr2:
         | 
| 1968 | 
            -
            #line  | 
| 1920 | 
            +
            #line 753 "parser.rl"
         | 
| 1969 1921 | 
             
            	{
         | 
| 1970 | 
            -
                    char *np = JSON_parse_value(json, p, pe, &result);
         | 
| 1922 | 
            +
                    char *np = JSON_parse_value(json, p, pe, &result, 0);
         | 
| 1971 1923 | 
             
                    if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
         | 
| 1972 1924 | 
             
                }
         | 
| 1973 1925 | 
             
            	goto st10;
         | 
| @@ -1975,7 +1927,7 @@ st10: | |
| 1975 1927 | 
             
            	if ( ++p == pe )
         | 
| 1976 1928 | 
             
            		goto _test_eof10;
         | 
| 1977 1929 | 
             
            case 10:
         | 
| 1978 | 
            -
            #line  | 
| 1930 | 
            +
            #line 1931 "parser.c"
         | 
| 1979 1931 | 
             
            	switch( (*p) ) {
         | 
| 1980 1932 | 
             
            		case 13: goto st10;
         | 
| 1981 1933 | 
             
            		case 32: goto st10;
         | 
| @@ -2064,42 +2016,16 @@ case 9: | |
| 2064 2016 | 
             
            	_out: {}
         | 
| 2065 2017 | 
             
            	}
         | 
| 2066 2018 |  | 
| 2067 | 
            -
            #line  | 
| 2068 | 
            -
             | 
| 2069 | 
            -
                if (cs >= JSON_quirks_mode_first_final && p == pe) {
         | 
| 2070 | 
            -
                    return result;
         | 
| 2071 | 
            -
                } else {
         | 
| 2072 | 
            -
                    rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
         | 
| 2073 | 
            -
                    return Qnil;
         | 
| 2074 | 
            -
                }
         | 
| 2075 | 
            -
            }
         | 
| 2019 | 
            +
            #line 780 "parser.rl"
         | 
| 2076 2020 |  | 
| 2077 | 
            -
             | 
| 2078 | 
            -
              | 
| 2079 | 
            -
             *
         | 
| 2080 | 
            -
             *  Parses the current JSON text _source_ and returns the complete data
         | 
| 2081 | 
            -
             *  structure as a result.
         | 
| 2082 | 
            -
             */
         | 
| 2083 | 
            -
            static VALUE cParser_parse(VALUE self)
         | 
| 2084 | 
            -
            {
         | 
| 2085 | 
            -
              GET_PARSER;
         | 
| 2086 | 
            -
             | 
| 2087 | 
            -
              if (json->quirks_mode) {
         | 
| 2088 | 
            -
                return cParser_parse_quirks_mode(self);
         | 
| 2021 | 
            +
              if (cs >= JSON_first_final && p == pe) {
         | 
| 2022 | 
            +
                return result;
         | 
| 2089 2023 | 
             
              } else {
         | 
| 2090 | 
            -
                 | 
| 2024 | 
            +
                rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p);
         | 
| 2025 | 
            +
                return Qnil;
         | 
| 2091 2026 | 
             
              }
         | 
| 2092 2027 | 
             
            }
         | 
| 2093 2028 |  | 
| 2094 | 
            -
             | 
| 2095 | 
            -
            static JSON_Parser *JSON_allocate(void)
         | 
| 2096 | 
            -
            {
         | 
| 2097 | 
            -
                JSON_Parser *json = ALLOC(JSON_Parser);
         | 
| 2098 | 
            -
                MEMZERO(json, JSON_Parser, 1);
         | 
| 2099 | 
            -
                json->fbuffer = fbuffer_alloc(0);
         | 
| 2100 | 
            -
                return json;
         | 
| 2101 | 
            -
            }
         | 
| 2102 | 
            -
             | 
| 2103 2029 | 
             
            static void JSON_mark(void *ptr)
         | 
| 2104 2030 | 
             
            {
         | 
| 2105 2031 | 
             
                JSON_Parser *json = ptr;
         | 
| @@ -2107,6 +2033,7 @@ static void JSON_mark(void *ptr) | |
| 2107 2033 | 
             
                rb_gc_mark_maybe(json->create_id);
         | 
| 2108 2034 | 
             
                rb_gc_mark_maybe(json->object_class);
         | 
| 2109 2035 | 
             
                rb_gc_mark_maybe(json->array_class);
         | 
| 2036 | 
            +
                rb_gc_mark_maybe(json->decimal_class);
         | 
| 2110 2037 | 
             
                rb_gc_mark_maybe(json->match_string);
         | 
| 2111 2038 | 
             
            }
         | 
| 2112 2039 |  | 
| @@ -2136,8 +2063,10 @@ static const rb_data_type_t JSON_Parser_type = { | |
| 2136 2063 |  | 
| 2137 2064 | 
             
            static VALUE cJSON_parser_s_allocate(VALUE klass)
         | 
| 2138 2065 | 
             
            {
         | 
| 2139 | 
            -
                JSON_Parser *json | 
| 2140 | 
            -
                 | 
| 2066 | 
            +
                JSON_Parser *json;
         | 
| 2067 | 
            +
                VALUE obj = TypedData_Make_Struct(klass, JSON_Parser, &JSON_Parser_type, json);
         | 
| 2068 | 
            +
                json->fbuffer = fbuffer_alloc(0);
         | 
| 2069 | 
            +
                return obj;
         | 
| 2141 2070 | 
             
            }
         | 
| 2142 2071 |  | 
| 2143 2072 | 
             
            /*
         | 
| @@ -2152,35 +2081,30 @@ static VALUE cParser_source(VALUE self) | |
| 2152 2081 | 
             
                return rb_str_dup(json->Vsource);
         | 
| 2153 2082 | 
             
            }
         | 
| 2154 2083 |  | 
| 2155 | 
            -
             | 
| 2156 | 
            -
             * call-seq: quirks_mode?()
         | 
| 2157 | 
            -
             *
         | 
| 2158 | 
            -
             * Returns a true, if this parser is in quirks_mode, false otherwise.
         | 
| 2159 | 
            -
             */
         | 
| 2160 | 
            -
            static VALUE cParser_quirks_mode_p(VALUE self)
         | 
| 2161 | 
            -
            {
         | 
| 2162 | 
            -
                GET_PARSER;
         | 
| 2163 | 
            -
                return json->quirks_mode ? Qtrue : Qfalse;
         | 
| 2164 | 
            -
            }
         | 
| 2165 | 
            -
             | 
| 2166 | 
            -
             | 
| 2167 | 
            -
            void Init_parser()
         | 
| 2084 | 
            +
            void Init_parser(void)
         | 
| 2168 2085 | 
             
            {
         | 
| 2086 | 
            +
            #undef rb_intern
         | 
| 2169 2087 | 
             
                rb_require("json/common");
         | 
| 2170 2088 | 
             
                mJSON = rb_define_module("JSON");
         | 
| 2171 2089 | 
             
                mExt = rb_define_module_under(mJSON, "Ext");
         | 
| 2172 2090 | 
             
                cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
         | 
| 2173 2091 | 
             
                eParserError = rb_path2class("JSON::ParserError");
         | 
| 2174 2092 | 
             
                eNestingError = rb_path2class("JSON::NestingError");
         | 
| 2093 | 
            +
                rb_gc_register_mark_object(eParserError);
         | 
| 2094 | 
            +
                rb_gc_register_mark_object(eNestingError);
         | 
| 2175 2095 | 
             
                rb_define_alloc_func(cParser, cJSON_parser_s_allocate);
         | 
| 2176 2096 | 
             
                rb_define_method(cParser, "initialize", cParser_initialize, -1);
         | 
| 2177 2097 | 
             
                rb_define_method(cParser, "parse", cParser_parse, 0);
         | 
| 2178 2098 | 
             
                rb_define_method(cParser, "source", cParser_source, 0);
         | 
| 2179 | 
            -
                rb_define_method(cParser, "quirks_mode?", cParser_quirks_mode_p, 0);
         | 
| 2180 2099 |  | 
| 2181 2100 | 
             
                CNaN = rb_const_get(mJSON, rb_intern("NaN"));
         | 
| 2101 | 
            +
                rb_gc_register_mark_object(CNaN);
         | 
| 2102 | 
            +
             | 
| 2182 2103 | 
             
                CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
         | 
| 2104 | 
            +
                rb_gc_register_mark_object(CInfinity);
         | 
| 2105 | 
            +
             | 
| 2183 2106 | 
             
                CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
         | 
| 2107 | 
            +
                rb_gc_register_mark_object(CMinusInfinity);
         | 
| 2184 2108 |  | 
| 2185 2109 | 
             
                i_json_creatable_p = rb_intern("json_creatable?");
         | 
| 2186 2110 | 
             
                i_json_create = rb_intern("json_create");
         | 
| @@ -2190,9 +2114,9 @@ void Init_parser() | |
| 2190 2114 | 
             
                i_max_nesting = rb_intern("max_nesting");
         | 
| 2191 2115 | 
             
                i_allow_nan = rb_intern("allow_nan");
         | 
| 2192 2116 | 
             
                i_symbolize_names = rb_intern("symbolize_names");
         | 
| 2193 | 
            -
                i_quirks_mode = rb_intern("quirks_mode");
         | 
| 2194 2117 | 
             
                i_object_class = rb_intern("object_class");
         | 
| 2195 2118 | 
             
                i_array_class = rb_intern("array_class");
         | 
| 2119 | 
            +
                i_decimal_class = rb_intern("decimal_class");
         | 
| 2196 2120 | 
             
                i_match = rb_intern("match");
         | 
| 2197 2121 | 
             
                i_match_string = rb_intern("match_string");
         | 
| 2198 2122 | 
             
                i_key_p = rb_intern("key?");
         | 
| @@ -2200,18 +2124,8 @@ void Init_parser() | |
| 2200 2124 | 
             
                i_aset = rb_intern("[]=");
         | 
| 2201 2125 | 
             
                i_aref = rb_intern("[]");
         | 
| 2202 2126 | 
             
                i_leftshift = rb_intern("<<");
         | 
| 2203 | 
            -
             | 
| 2204 | 
            -
                 | 
| 2205 | 
            -
                CEncoding_UTF_16BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16be"));
         | 
| 2206 | 
            -
                CEncoding_UTF_16LE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16le"));
         | 
| 2207 | 
            -
                CEncoding_UTF_32BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-32be"));
         | 
| 2208 | 
            -
                CEncoding_UTF_32LE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-32le"));
         | 
| 2209 | 
            -
                CEncoding_ASCII_8BIT = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("ascii-8bit"));
         | 
| 2210 | 
            -
                i_encoding = rb_intern("encoding");
         | 
| 2211 | 
            -
                i_encode = rb_intern("encode");
         | 
| 2212 | 
            -
            #else
         | 
| 2213 | 
            -
                i_iconv = rb_intern("iconv");
         | 
| 2214 | 
            -
            #endif
         | 
| 2127 | 
            +
                i_new = rb_intern("new");
         | 
| 2128 | 
            +
                i_BigDecimal = rb_intern("BigDecimal");
         | 
| 2215 2129 | 
             
            }
         | 
| 2216 2130 |  | 
| 2217 2131 | 
             
            /*
         |