summary refs log tree commit
path: root/ext/json/ext/parser/parser.rl
diff options
context:
space:
mode:
Diffstat (limited to 'ext/json/ext/parser/parser.rl')
-rw-r--r--ext/json/ext/parser/parser.rl12
1 files changed, 9 insertions, 3 deletions
diff --git a/ext/json/ext/parser/parser.rl b/ext/json/ext/parser/parser.rl
index 0a39f19..66c8363 100644
--- a/ext/json/ext/parser/parser.rl
+++ b/ext/json/ext/parser/parser.rl
@@ -77,7 +77,7 @@ static VALUE CNaN, CInfinity, CMinusInfinity;
 
 static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
           i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, i_object_class,
-          i_array_class, i_key_p, i_deep_const_get, i_match, i_match_string;
+          i_array_class, i_key_p, i_deep_const_get, i_match, i_match_string, i_aset, i_leftshift;
 
 %%{
     machine JSON_common;
@@ -122,7 +122,7 @@ static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
             if (NIL_P(json->object_class)) {
               rb_hash_aset(*result, last_name, v);
             } else {
-              rb_funcall(*result, rb_intern("[]="), 2, last_name, v);
+              rb_funcall(*result, i_aset, 2, last_name, v);
             }
             fexec np;
         }
@@ -346,7 +346,11 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
         if (np == NULL) {
             fhold; fbreak;
         } else {
-            rb_ary_push(*result, v);
+            if (NIL_P(json->array_class)) {
+                                                        rb_ary_push(*result, v);
+                                                } else {
+              rb_funcall(*result, i_leftshift, 1, v);
+                                                }
             fexec np;
         }
     }
@@ -813,6 +817,8 @@ void Init_parser()
     i_match_string = rb_intern("match_string");
     i_key_p = rb_intern("key?");
     i_deep_const_get = rb_intern("deep_const_get");
+                i_aset = rb_intern("[]=");
+                i_leftshift = rb_intern("<<");
 #ifdef HAVE_RUBY_ENCODING_H
     CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
     CEncoding_UTF_16BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16be"));