summary refs log tree commit
diff options
context:
space:
mode:
authorFlorian Frank <flori@ping.de>2011-06-09 13:41:29 +0200
committerFlorian Frank <flori@ping.de>2011-06-09 13:41:29 +0200
commit89c3cfd1908035f9cc9bacb5edeac31a2b8ab58d (patch)
tree9d5cd7644f1d2d9058cdef5d7ad789bf9bf72ac4
parent606df33e56195840b7d3edbd468f956afd92d853 (diff)
parent0609fff28f7643232b4c8f2b3fd291045ccabffa (diff)
downloadruby-json-89c3cfd1908035f9cc9bacb5edeac31a2b8ab58d.tar.gz
Merge branch 'master' of gate.dyna.ping.de:/git/json
-rw-r--r--README.rdoc (renamed from README)0
-rw-r--r--ext/json/ext/parser/parser.c60
-rw-r--r--ext/json/ext/parser/parser.rl12
-rw-r--r--java/src/json/ext/Generator.java6
-rw-r--r--java/src/json/ext/Parser.java54
-rw-r--r--java/src/json/ext/Parser.rl8
-rw-r--r--lib/json/pure/generator.rb2
-rwxr-xr-xtests/test_json.rb37
-rwxr-xr-xtests/test_json_generate.rb1
9 files changed, 103 insertions, 77 deletions
diff --git a/README b/README.rdoc
index 22249ba..22249ba 100644
--- a/README
+++ b/README.rdoc
diff --git a/ext/json/ext/parser/parser.c b/ext/json/ext/parser/parser.c
index e2e46a1..e834dd6 100644
--- a/ext/json/ext/parser/parser.c
+++ b/ext/json/ext/parser/parser.c
@@ -79,7 +79,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;
 
 
 #line 108 "parser.rl"
@@ -235,7 +235,7 @@ tr11:
             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);
             }
             {p = (( np))-1;}
         }
@@ -1034,7 +1034,7 @@ static const int JSON_array_error = 0;
 static const int JSON_array_en_main = 1;
 
 
-#line 362 "parser.rl"
+#line 366 "parser.rl"
 
 
 static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -1053,7 +1053,7 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
         cs = JSON_array_start;
         }
 
-#line 375 "parser.rl"
+#line 379 "parser.rl"
     
 #line 1059 "parser.c"
         {
@@ -1101,7 +1101,11 @@ tr2:
         if (np == NULL) {
             p--; {p++; cs = 3; goto _out;}
         } 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);
+                                                }
             {p = (( np))-1;}
         }
     }
@@ -1110,7 +1114,7 @@ st3:
         if ( ++p == pe )
                 goto _test_eof3;
 case 3:
-#line 1114 "parser.c"
+#line 1118 "parser.c"
         switch( (*p) ) {
                 case 13: goto st3;
                 case 32: goto st3;
@@ -1210,14 +1214,14 @@ case 12:
                 goto st3;
         goto st12;
 tr4:
-#line 354 "parser.rl"
+#line 358 "parser.rl"
         { p--; {p++; cs = 17; goto _out;} }
         goto st17;
 st17:
         if ( ++p == pe )
                 goto _test_eof17;
 case 17:
-#line 1221 "parser.c"
+#line 1225 "parser.c"
         goto st0;
 st13:
         if ( ++p == pe )
@@ -1273,7 +1277,7 @@ case 16:
         _out: {}
         }
 
-#line 376 "parser.rl"
+#line 380 "parser.rl"
 
     if(cs >= JSON_array_first_final) {
         return p + 1;
@@ -1354,7 +1358,7 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
 }
 
 
-#line 1358 "parser.c"
+#line 1362 "parser.c"
 static const int JSON_string_start = 1;
 static const int JSON_string_first_final = 8;
 static const int JSON_string_error = 0;
@@ -1362,7 +1366,7 @@ static const int JSON_string_error = 0;
 static const int JSON_string_en_main = 1;
 
 
-#line 475 "parser.rl"
+#line 479 "parser.rl"
 
 
 static int
@@ -1384,15 +1388,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
 
     *result = rb_str_buf_new(0);
     
-#line 1388 "parser.c"
+#line 1392 "parser.c"
         {
         cs = JSON_string_start;
         }
 
-#line 496 "parser.rl"
+#line 500 "parser.rl"
     json->memo = p;
     
-#line 1396 "parser.c"
+#line 1400 "parser.c"
         {
         if ( p == pe )
                 goto _test_eof;
@@ -1417,7 +1421,7 @@ case 2:
                 goto st0;
         goto st2;
 tr2:
-#line 461 "parser.rl"
+#line 465 "parser.rl"
         {
         *result = json_string_unescape(*result, json->memo + 1, p);
         if (NIL_P(*result)) {
@@ -1428,14 +1432,14 @@ tr2:
             {p = (( p + 1))-1;}
         }
     }
-#line 472 "parser.rl"
+#line 476 "parser.rl"
         { p--; {p++; cs = 8; goto _out;} }
         goto st8;
 st8:
         if ( ++p == pe )
                 goto _test_eof8;
 case 8:
-#line 1439 "parser.c"
+#line 1443 "parser.c"
         goto st0;
 st3:
         if ( ++p == pe )
@@ -1511,7 +1515,7 @@ case 7:
         _out: {}
         }
 
-#line 498 "parser.rl"
+#line 502 "parser.rl"
 
     if (json->create_additions && RTEST(match_string = json->match_string)) {
           VALUE klass;
@@ -1536,7 +1540,7 @@ case 7:
 
 
 
-#line 1540 "parser.c"
+#line 1544 "parser.c"
 static const int JSON_start = 1;
 static const int JSON_first_final = 10;
 static const int JSON_error = 0;
@@ -1544,7 +1548,7 @@ static const int JSON_error = 0;
 static const int JSON_en_main = 1;
 
 
-#line 546 "parser.rl"
+#line 550 "parser.rl"
 
 
 /*
@@ -1733,16 +1737,16 @@ static VALUE cParser_parse(VALUE self)
     GET_PARSER;
 
     
-#line 1737 "parser.c"
+#line 1741 "parser.c"
         {
         cs = JSON_start;
         }
 
-#line 734 "parser.rl"
+#line 738 "parser.rl"
     p = json->source;
     pe = p + json->len;
     
-#line 1746 "parser.c"
+#line 1750 "parser.c"
         {
         if ( p == pe )
                 goto _test_eof;
@@ -1798,7 +1802,7 @@ case 5:
                 goto st1;
         goto st5;
 tr3:
-#line 535 "parser.rl"
+#line 539 "parser.rl"
         {
         char *np;
         json->current_nesting = 1;
@@ -1807,7 +1811,7 @@ tr3:
     }
         goto st10;
 tr4:
-#line 528 "parser.rl"
+#line 532 "parser.rl"
         {
         char *np;
         json->current_nesting = 1;
@@ -1819,7 +1823,7 @@ st10:
         if ( ++p == pe )
                 goto _test_eof10;
 case 10:
-#line 1823 "parser.c"
+#line 1827 "parser.c"
         switch( (*p) ) {
                 case 13: goto st10;
                 case 32: goto st10;
@@ -1876,7 +1880,7 @@ case 9:
         _out: {}
         }
 
-#line 737 "parser.rl"
+#line 741 "parser.rl"
 
     if (cs >= JSON_first_final && p == pe) {
         return result;
@@ -1956,6 +1960,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"));
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"));
diff --git a/java/src/json/ext/Generator.java b/java/src/json/ext/Generator.java
index 230d68f..92fd90e 100644
--- a/java/src/json/ext/Generator.java
+++ b/java/src/json/ext/Generator.java
@@ -354,11 +354,7 @@ public final class Generator {
                 state.decreaseDepth();
                 if (objectNl.length() != 0) {
                     buffer.append(objectNl);
-                    if (indent.length != 0) {
-                        for (int i = 0; i < state.getDepth(); i++) {
-                            buffer.append(indent);
-                        }
-                    }
+                    buffer.append(Utils.repeat(state.getIndent(), state.getDepth()));
                 }
                 buffer.append((byte)'}');
             }
diff --git a/java/src/json/ext/Parser.java b/java/src/json/ext/Parser.java
index ec9d258..482d5cc 100644
--- a/java/src/json/ext/Parser.java
+++ b/java/src/json/ext/Parser.java
@@ -1528,7 +1528,7 @@ static final int JSON_array_error = 0;
 static final int JSON_array_en_main = 1;
 
 
-// line 620 "Parser.rl"
+// line 624 "Parser.rl"
 
 
         ParserResult parseArray(int p, int pe) {
@@ -1551,7 +1551,7 @@ static final int JSON_array_en_main = 1;
         cs = JSON_array_start;
         }
 
-// line 637 "Parser.rl"
+// line 641 "Parser.rl"
             
 // line 1557 "Parser.java"
         {
@@ -1641,19 +1641,23 @@ case 1:
                     p--;
                     { p += 1; _goto_targ = 5; if (true)  continue _goto;}
                 } else {
-                    result.append(res.result);
+                    if (!parser.arrayClass.getName().equals("Array")) {
+                        result.callMethod(context, "<<", res.result);
+                    } else {
+                        result.append(res.result);
+                    }
                     {p = (( res.p))-1;}
                 }
             }
         break;
         case 1:
-// line 604 "Parser.rl"
+// line 608 "Parser.rl"
         {
                 p--;
                 { p += 1; _goto_targ = 5; if (true)  continue _goto;}
             }
         break;
-// line 1657 "Parser.java"
+// line 1661 "Parser.java"
                         }
                 }
         }
@@ -1673,7 +1677,7 @@ case 5:
         break; }
         }
 
-// line 638 "Parser.rl"
+// line 642 "Parser.rl"
 
             if (cs >= JSON_array_first_final) {
                 return new ParserResult(result, p + 1);
@@ -1683,7 +1687,7 @@ case 5:
         }
 
         
-// line 1687 "Parser.java"
+// line 1691 "Parser.java"
 private static byte[] init__JSON_object_actions_0()
 {
         return new byte [] {
@@ -1806,7 +1810,7 @@ static final int JSON_object_error = 0;
 static final int JSON_object_en_main = 1;
 
 
-// line 698 "Parser.rl"
+// line 702 "Parser.rl"
 
 
         ParserResult parseObject(int p, int pe) {
@@ -1825,14 +1829,14 @@ static final int JSON_object_en_main = 1;
                     IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
 
             
-// line 1829 "Parser.java"
+// line 1833 "Parser.java"
         {
         cs = JSON_object_start;
         }
 
-// line 716 "Parser.rl"
+// line 720 "Parser.rl"
             
-// line 1836 "Parser.java"
+// line 1840 "Parser.java"
         {
         int _klen;
         int _trans = 0;
@@ -1913,7 +1917,7 @@ case 1:
                         switch ( _JSON_object_actions[_acts++] )
                         {
         case 0:
-// line 652 "Parser.rl"
+// line 656 "Parser.rl"
         {
                 ParserResult res = parseValue(p, pe);
                 if (res == null) {
@@ -1930,7 +1934,7 @@ case 1:
             }
         break;
         case 1:
-// line 667 "Parser.rl"
+// line 671 "Parser.rl"
         {
                 ParserResult res = parseString(p, pe);
                 if (res == null) {
@@ -1950,13 +1954,13 @@ case 1:
             }
         break;
         case 2:
-// line 685 "Parser.rl"
+// line 689 "Parser.rl"
         {
                 p--;
                 { p += 1; _goto_targ = 5; if (true)  continue _goto;}
             }
         break;
-// line 1960 "Parser.java"
+// line 1964 "Parser.java"
                         }
                 }
         }
@@ -1976,7 +1980,7 @@ case 5:
         break; }
         }
 
-// line 717 "Parser.rl"
+// line 721 "Parser.rl"
 
             if (cs < JSON_object_first_final) {
                 return null;
@@ -2002,7 +2006,7 @@ case 5:
         }
 
         
-// line 2006 "Parser.java"
+// line 2010 "Parser.java"
 private static byte[] init__JSON_actions_0()
 {
         return new byte [] {
@@ -2106,7 +2110,7 @@ static final int JSON_error = 0;
 static final int JSON_en_main = 1;
 
 
-// line 775 "Parser.rl"
+// line 779 "Parser.rl"
 
 
         public IRubyObject parse() {
@@ -2115,16 +2119,16 @@ static final int JSON_en_main = 1;
             IRubyObject result = null;
 
             
-// line 2119 "Parser.java"
+// line 2123 "Parser.java"
         {
         cs = JSON_start;
         }
 
-// line 783 "Parser.rl"
+// line 787 "Parser.rl"
             p = byteList.begin();
             pe = p + byteList.length();
             
-// line 2128 "Parser.java"
+// line 2132 "Parser.java"
         {
         int _klen;
         int _trans = 0;
@@ -2205,7 +2209,7 @@ case 1:
                         switch ( _JSON_actions[_acts++] )
                         {
         case 0:
-// line 747 "Parser.rl"
+// line 751 "Parser.rl"
         {
                 currentNesting = 1;
                 ParserResult res = parseObject(p, pe);
@@ -2219,7 +2223,7 @@ case 1:
             }
         break;
         case 1:
-// line 759 "Parser.rl"
+// line 763 "Parser.rl"
         {
                 currentNesting = 1;
                 ParserResult res = parseArray(p, pe);
@@ -2232,7 +2236,7 @@ case 1:
                 }
             }
         break;
-// line 2236 "Parser.java"
+// line 2240 "Parser.java"
                         }
                 }
         }
@@ -2252,7 +2256,7 @@ case 5:
         break; }
         }
 
-// line 786 "Parser.rl"
+// line 790 "Parser.rl"
 
             if (cs >= JSON_first_final && p == pe) {
                 return result;
diff --git a/java/src/json/ext/Parser.rl b/java/src/json/ext/Parser.rl
index 5c6f227..b8734e1 100644
--- a/java/src/json/ext/Parser.rl
+++ b/java/src/json/ext/Parser.rl
@@ -596,7 +596,11 @@ public class Parser extends RubyObject {
                     fhold;
                     fbreak;
                 } else {
-                    result.append(res.result);
+                    if (!parser.arrayClass.getName().equals("Array")) {
+                        result.callMethod(context, "<<", res.result);
+                    } else {
+                        result.append(res.result);
+                    }
                     fexec res.p;
                 }
             }
@@ -655,7 +659,7 @@ public class Parser extends RubyObject {
                     fhold;
                     fbreak;
                 } else {
-                    if (parser.objectClass.getName().equals("Hash")) {
+                    if (!parser.objectClass.getName().equals("Hash")) {
                         result.callMethod(context, "[]=", new IRubyObject[] { lastName, res.result });
                     } else {
                         result.op_aset(context, lastName, res.result);
diff --git a/lib/json/pure/generator.rb b/lib/json/pure/generator.rb
index 44cca60..9bdfe02 100644
--- a/lib/json/pure/generator.rb
+++ b/lib/json/pure/generator.rb
@@ -99,7 +99,7 @@ module JSON
   module Pure
     module Generator
       # This class is used to create State instances, that are use to hold data
-      # while generating a JSON text from a a Ruby data structure.
+      # while generating a JSON text from a Ruby data structure.
       class State
         # Creates a State object from _opts_, which ought to be Hash to create
         # a new State instance configured by _opts_, something else to create
diff --git a/tests/test_json.rb b/tests/test_json.rb
index 06ee581..4fc6a28 100755
--- a/tests/test_json.rb
+++ b/tests/test_json.rb
@@ -154,7 +154,16 @@ class TC_JSON < Test::Unit::TestCase
       , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ]  }))
   end
 
-  class SubArray < Array; end
+  class SubArray < Array
+    def <<(v)
+      @shifted = true
+      super
+    end
+
+    def shifted?
+      @shifted
+    end
+  end
 
   class SubArray2 < Array
     def to_json(*a)
@@ -171,9 +180,10 @@ class TC_JSON < Test::Unit::TestCase
   end
 
   def test_parse_array_custom_class
-    res = parse('[]', :array_class => SubArray)
-    assert_equal([], res)
+    res = parse('[1,2]', :array_class => SubArray)
+    assert_equal([1,2], res)
     assert_equal(SubArray, res.class)
+    assert res.shifted?
   end
 
   def test_parse_object
@@ -184,6 +194,14 @@ class TC_JSON < Test::Unit::TestCase
   end
 
   class SubHash < Hash
+    def []=(k, v)
+      @item_set = true
+      super
+    end
+
+    def item_set?
+      @item_set
+    end
   end
 
   class SubHash2 < Hash
@@ -197,21 +215,12 @@ class TC_JSON < Test::Unit::TestCase
       o.delete JSON.create_id
       self[o]
     end
-
-    def []=(k, v)
-      @item_set = true
-      super
-    end
-
-    def item_set?
-      @item_set
-    end
   end
 
   def test_parse_object_custom_class
-    res = parse('{"foo":"bar"}', :object_class => SubHash2)
+    res = parse('{"foo":"bar"}', :object_class => SubHash)
     assert_equal({"foo" => "bar"}, res)
-    assert_equal(SubHash2, res.class)
+    assert_equal(SubHash, res.class)
     assert res.item_set?
   end
 
diff --git a/tests/test_json_generate.rb b/tests/test_json_generate.rb
index e6219df..9b0cff4 100755
--- a/tests/test_json_generate.rb
+++ b/tests/test_json_generate.rb
@@ -54,6 +54,7 @@ EOT
 
   def test_generate_pretty
     json = pretty_generate(@hash)
+    # hashes aren't (insertion) ordered on every ruby implementation assert_equal(@json3, json)
     assert_equal(JSON.parse(@json3), JSON.parse(json))
     parsed_json = parse(json)
     assert_equal(@hash, parsed_json)