fjson 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/CHANGES +0 -3
  2. data/Rakefile +43 -41
  3. data/ext/extensions/array_ext/array_ext.c +13 -81
  4. data/ext/extensions/array_ext/array_ext.h +4 -8
  5. data/ext/extensions/array_ext/extconf.mkmf.rb +3 -0
  6. data/ext/extensions/enumerable/enumerable.c +70 -0
  7. data/ext/extensions/enumerable/enumerable.h +9 -0
  8. data/ext/extensions/hash_ext/extconf.mkmf.rb +3 -0
  9. data/ext/extensions/hash_ext/hash_ext.c +13 -81
  10. data/ext/extensions/hash_ext/hash_ext.h +3 -8
  11. data/ext/json_ext/json_ext.c +12 -13
  12. data/ext/json_ext/json_ext.h +2 -0
  13. data/ext/state_ext/state_ext.c +16 -85
  14. data/ext/state_ext/state_ext.h +3 -7
  15. data/ext/state_ext/state_lib.c +107 -0
  16. data/ext/state_ext/state_lib.h +15 -0
  17. data/hash_benchmark.rb +0 -2
  18. data/hash_benchmark_action_support.rb +4 -0
  19. data/hash_benchmark_fjson.rb +3 -0
  20. data/hash_benchmark_json.rb +4 -0
  21. data/lib/json/editor.rb +1 -1
  22. data/mkmf_tasks.rb +99 -0
  23. data/rake_helper.rb +1 -1
  24. data/spec/array_spec.rb +12 -2
  25. data/spec/false_class_spec.rb +1 -1
  26. data/spec/float_spec.rb +1 -1
  27. data/spec/hash_spec.rb +13 -0
  28. data/spec/integer_spec.rb +1 -1
  29. data/spec/mkmf_tasks_spec.rb +110 -0
  30. data/spec/nil_class_spec.rb +1 -1
  31. data/spec/object_spec.rb +1 -1
  32. data/spec/spec_helper.rb +10 -0
  33. data/spec/spec_suite.rb +3 -8
  34. data/spec/state_spec.rb +10 -11
  35. data/spec/string_spec.rb +1 -1
  36. data/spec/string_when_not_supporting_unicode_and_kcode_is_not_utf8_json_spec.rb +1 -1
  37. data/spec/string_when_supporting_unicode_and_kcode_is_not_utf8_json_spec.rb +1 -1
  38. data/spec/string_with_latin1_character_set_json_spec.rb +15 -15
  39. data/spec/string_with_utf8_values_when_supporting_unicode_json_spec.rb +12 -12
  40. data/spec/true_class_spec.rb +1 -1
  41. metadata +58 -53
  42. data/mkmf_rake_builder.rb +0 -170
  43. data/spec/mkmf_rake_builder_spec.rb +0 -217
  44. data/spec/rake_helper_spec.rb +0 -9
data/CHANGES CHANGED
@@ -1,6 +1,3 @@
1
- 2007-02-02 (0.0.9)
2
- * Updated for latest version of rubygems 0.9.1. Removed dependency to rspec in the gem.
3
-
4
1
  2006-11-04 (0.0.8)
5
2
  * Fixed build issues. Better spec coverage on build.
6
3
 
data/Rakefile CHANGED
@@ -1,46 +1,52 @@
1
1
  dir = File.dirname(__FILE__)
2
2
  require File.expand_path("#{dir}/rake_helper")
3
- rake_builder = MkmfRakeBuilder.new
4
- rake_builder.project_dir = File.dirname(__FILE__)
5
- rake_builder.rake_application = Rake.application
6
- rake_builder.rake_tasks = Rake::Task
7
- rake_builder.rake_file_tasks = Rake::FileTask
8
- rake_builder.dir_class = Dir
9
- rake_builder.file_class = File
10
- file_extension = (RUBY_PLATFORM =~ /darwin/) ? "bundle" : "so"
11
- rake_builder.file_extension = file_extension
12
- fjson_extensions = rake_builder.extensions_to_build = [
13
- [:json_ext, "json_ext"],
14
- [:state_ext, "state_ext"],
15
- [:object_ext, "extensions/object_ext"],
16
- [:integer_ext, "extensions/integer_ext"],
17
- [:float_ext, "extensions/float_ext"],
18
- [:string_ext, "extensions/string_ext"],
19
- [:true_class_ext, "extensions/true_class_ext"],
20
- [:false_class_ext, "extensions/false_class_ext"],
21
- [:nil_class_ext, "extensions/nil_class_ext"],
22
- [:array_ext, "extensions/array_ext"],
23
- [:hash_ext, "extensions/hash_ext"]
24
- ]
25
-
26
- rake_builder.build_default_task
27
- rake_builder.build_compile_task
28
- rake_builder.build_spec_task
29
- rake_builder.build_lib_task
30
- rake_builder.build_extension_compile_tasks
31
- rake_builder.build_install_task
32
- rake_builder.build_cleanup_task
33
-
34
3
  def win32?
35
4
  ENV["target_platform"] == "win32"
36
5
  end
37
6
 
38
- if win32?
39
- #Rake::Task[].invoke
7
+ desc "Compiles the library"
8
+ task(:default) {mkmf_tasks.default}
9
+
10
+ desc "Compiles the library"
11
+ task(:compile) {mkmf_tasks.compile}
12
+
13
+ desc "Compiles, installs, and runs the specs"
14
+ task(:spec) {mkmf_tasks.spec}
15
+
16
+ desc "Creates the lib directory"
17
+ task(:lib) {mkmf_tasks.lib}
18
+
19
+ desc "Installs the compiled files"
20
+ task(:install) {mkmf_tasks.install}
21
+
22
+ desc "Cleans up the build files"
23
+ task(:cleanup) {mkmf_tasks.cleanup}
24
+
25
+ def mkmf_tasks
26
+ tasks = MkmfTasks.new(self)
27
+ tasks.extconf_file_name = "extconf.mkmf.rb"
28
+ tasks.project_dir = File.dirname(__FILE__)
29
+ tasks.file_extension = (RUBY_PLATFORM =~ /darwin/) ? "bundle" : "so"
30
+ tasks.extconf_arguments = ""
31
+ # tasks.extconf_arguments = "-I /usr/local/lib/ruby-mingw32/lib/ruby/1.8/i386-mingw32" if win32?
32
+ tasks.extension_paths = [
33
+ "json_ext",
34
+ "state_ext",
35
+ "extensions/object_ext",
36
+ "extensions/integer_ext",
37
+ "extensions/float_ext",
38
+ "extensions/string_ext",
39
+ "extensions/true_class_ext",
40
+ "extensions/false_class_ext",
41
+ "extensions/nil_class_ext",
42
+ "extensions/array_ext",
43
+ "extensions/hash_ext"
44
+ ]
45
+ tasks
40
46
  end
41
47
 
42
48
  PKG_NAME = "fjson"
43
- PKG_VERSION = "0.1.0"
49
+ PKG_VERSION = "0.1.1"
44
50
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
45
51
  PKG_FILES = FileList[
46
52
  '[A-Z]*',
@@ -49,6 +55,7 @@ PKG_FILES = FileList[
49
55
  'ext/**/*.{h,c,rb}',
50
56
  'spec/**/*.rb'
51
57
  ]
58
+ PKG_FILES.include('lib/**/*.so') if win32?
52
59
 
53
60
  spec = Gem::Specification.new do |s|
54
61
  s.name = PKG_NAME
@@ -60,6 +67,7 @@ spec = Gem::Specification.new do |s|
60
67
  EOF
61
68
  s.test_files = Dir.glob('spec/*_spec.rb')
62
69
  s.description = s.summary
70
+ s.platform = (win32?) ? Gem::Platform::WIN32 : Gem::Platform::RUBY
63
71
 
64
72
  s.files = PKG_FILES.to_a
65
73
  s.require_path = 'lib'
@@ -75,13 +83,7 @@ spec = Gem::Specification.new do |s|
75
83
  s.homepage = "http://fjson.rubyforge.org"
76
84
  s.rubyforge_project = "fjson"
77
85
 
78
- s.extensions = ["Rakefile"]
79
-
80
- #s.add_dependency "mkrf", ">=0.1.2"
81
-
82
- if win32?
83
-
84
- end
86
+ s.extensions = ["Rakefile"] unless win32?
85
87
  end
86
88
 
87
89
  Rake::GemPackageTask.new(spec) do |pkg|
@@ -1,74 +1,17 @@
1
1
  #include "array_ext.h"
2
+ #include "enumerable.c"
2
3
 
3
- static VALUE cArray;
4
4
  static VALUE mJSON;
5
- static VALUE cState;
6
5
  static VALUE cCircularDatastructure;
7
6
 
8
7
  void Init_array_ext() {
9
8
  mJSON = rb_const_get(rb_cObject, rb_intern("JSON"));
10
- cState = rb_const_get(mJSON, rb_intern("State"));
11
- cArray = rb_const_get(rb_cObject, rb_intern("Array"));
9
+ rb_cJsonState = rb_const_get(mJSON, rb_intern("State"));
12
10
  cCircularDatastructure = rb_const_get(mJSON, rb_intern("CircularDatastructure"));
13
- rb_define_method(cArray, "to_json", (VALUE(*)(ANYARGS)) &to_json, -1);
11
+ rb_define_method(rb_cArray, "to_json", (VALUE(*)(ANYARGS)) &to_json, -1);
14
12
  }
15
13
 
16
- /**
17
- * Returns a JSON string containing a JSON array, that is unparsed from
18
- * this Array instance.
19
- * _state_ is a JSON::State object, that can also be used to configure the
20
- * produced JSON string output further.
21
- * _depth_ is used to find out nesting depth, to indent accordingly.
22
- */
23
- static VALUE to_json(argc, argv, self)
24
- int argc;
25
- VALUE *argv;
26
- VALUE self;
27
- {
28
- VALUE state, depth;
29
- rb_scan_args(argc, argv, "02", &state, &depth);
30
- if(depth == Qnil) depth = rb_int2inum(0);
31
-
32
- state = rb_funcall(cState, rb_intern("from_state"), 1, state);
33
- return json_check_circular_and_transform(self, state, depth);
34
- }
35
-
36
- /** Private **/
37
-
38
- static VALUE json_check_circular_and_transform(self, state, depth)
39
- VALUE self, state, depth;
40
- {
41
- VALUE call_args = rb_ary_new3(3, self, state, depth);
42
- return rb_ensure(json_check_circular_and_transform_call, call_args, json_check_circular_and_transform_ensure, call_args);
43
- }
44
-
45
- static VALUE json_check_circular_and_transform_call(args)
46
- VALUE args;
47
- {
48
- VALUE self = rb_ary_entry(args, 0);
49
- VALUE state = rb_ary_entry(args, 1);
50
- VALUE depth = rb_ary_entry(args, 2);
51
- if(state != Qnil) {
52
- if(rb_funcall(state, rb_intern("seen?"), 1, self) == Qtrue) {
53
- rb_raise(
54
- cCircularDatastructure,
55
- "circular data structures not supported!"
56
- );
57
- }
58
- rb_funcall(state, rb_intern("remember"), 1, self);
59
- }
60
- return json_transform(self, state, depth);
61
- }
62
-
63
- static VALUE json_check_circular_and_transform_ensure(args)
64
- VALUE args;
65
- {
66
- VALUE self = rb_ary_entry(args, 0);
67
- VALUE state = rb_ary_entry(args, 1);
68
- if(state != Qnil) {
69
- rb_funcall(state, rb_intern("forget"), 1, self);
70
- }
71
- }
14
+ /** private **/
72
15
 
73
16
  static VALUE json_transform(self, state, depth)
74
17
  VALUE self, state, depth;
@@ -76,21 +19,21 @@ static VALUE json_transform(self, state, depth)
76
19
  VALUE delim = rb_str_new2(",");
77
20
  VALUE array_nl = Qnil;
78
21
  if(state != Qnil) array_nl = rb_funcall(state, rb_intern("array_nl"), 0);
79
- if(array_nl != Qnil) rb_str_append(delim, array_nl);
22
+ new_line(delim, array_nl);
80
23
 
81
24
  VALUE json = rb_str_new2("[");
82
- if(array_nl != Qnil) rb_str_append(json, array_nl);
25
+ new_line(json, array_nl);
83
26
 
84
- process_internal_json(self, json, state, depth, delim);
27
+ process_internal_json(self, json, state, depth, delim, array_nl);
85
28
 
86
- if(array_nl != Qnil) rb_str_append(json, array_nl);
87
- json_shift(self, json, state, depth);
29
+ new_line(json, array_nl);
30
+ if(rb_json_should_shift(state, array_nl) == Qtrue) json_shift(json, state, depth);
88
31
  rb_str_cat2(json, "]");
89
32
  return json;
90
33
  }
91
34
 
92
- static VALUE process_internal_json(self, json, state, depth, delim)
93
- VALUE self, json, state, depth, delim;
35
+ static VALUE process_internal_json(self, json, state, depth, delim, array_nl)
36
+ VALUE self, json, state, depth, delim, array_nl;
94
37
  {
95
38
  VALUE next_depth = LONG2NUM(NUM2LONG(depth) + 1);
96
39
 
@@ -101,18 +44,7 @@ static VALUE process_internal_json(self, json, state, depth, delim)
101
44
  rb_str_concat(json, delim);
102
45
  }
103
46
  current_value = rb_ary_entry(self, i);
104
- json_shift(self, json, state, depth);
105
- rb_str_append(json, rb_funcall(current_value, rb_intern("to_json"), 2, state, next_depth));
47
+ if(rb_json_should_shift(state, array_nl) == Qtrue) json_shift(json, state, depth);
48
+ rb_str_append(json, rb_to_json(current_value, state, depth));
106
49
  }
107
50
  }
108
-
109
- static VALUE json_shift(self, json, state, depth)
110
- VALUE self, json, state, depth;
111
- {
112
- if(state == Qnil) return Qnil;
113
- VALUE array_nl = rb_funcall(state, rb_intern("array_nl"), 0);
114
- if(RSTRING(array_nl)->len == 0) return Qnil;
115
-
116
- rb_json_state_indent(state, json, NUM2LONG(depth) + 1);
117
- return Qnil;
118
- }
@@ -1,12 +1,8 @@
1
1
  #include "ruby.h"
2
2
  #include <string.h>
3
- #include "../../state_ext/state_ext.h"
4
- #include "../../state_ext/state_ext.c"
3
+ #include "state_lib.h"
4
+ #include "enumerable.h"
5
5
 
6
- static VALUE to_json(int, VALUE*, VALUE);
7
- static VALUE json_check_circular_and_transform_call(VALUE);
8
- static VALUE json_check_circular_and_transform_ensure(VALUE);
9
- static VALUE json_check_circular_and_transform(VALUE, VALUE, VALUE);
10
6
  static VALUE json_transform(VALUE, VALUE, VALUE);
11
- static VALUE json_shift(VALUE, VALUE, VALUE, VALUE);
12
- static VALUE process_internal_json(VALUE, VALUE, VALUE, VALUE, VALUE);
7
+ static VALUE process_internal_json(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE);
8
+ static VALUE to_json(int, VALUE*, VALUE);
@@ -1,3 +1,6 @@
1
1
  require 'mkmf'
2
2
 
3
+ dir = File.dirname(__FILE__)
4
+ find_header("state_lib.h", "#{dir}/../../state_ext")
5
+ find_header("enumerable.h", "#{dir}/../enumerable")
3
6
  create_makefile("array_ext")
@@ -0,0 +1,70 @@
1
+ #include "enumerable.h"
2
+
3
+ static VALUE cCircularDatastructure;
4
+
5
+ /**
6
+ * Returns a JSON string for this object.
7
+ * _state_ is a JSON::State object, that can also be used to configure the
8
+ * produced JSON string output further.
9
+ * _depth_ is used to find out nesting depth, to indent accordingly.
10
+ */
11
+ static VALUE to_json(argc, argv, self)
12
+ int argc;
13
+ VALUE *argv;
14
+ VALUE self;
15
+ {
16
+ VALUE state, depth;
17
+ rb_scan_args(argc, argv, "02", &state, &depth);
18
+ if(depth == Qnil) depth = INT2NUM(0);
19
+
20
+ state = rb_json_from_state(rb_cJsonState, state);
21
+ return json_check_circular_and_transform(self, state, depth);
22
+ }
23
+
24
+ static VALUE json_check_circular_and_transform(self, state, depth)
25
+ VALUE self, state, depth;
26
+ {
27
+ VALUE call_args = rb_ary_new3(3, self, state, depth);
28
+ return rb_ensure(json_check_circular_and_transform_call, call_args, json_check_circular_and_transform_ensure, call_args);
29
+ }
30
+
31
+ static VALUE json_check_circular_and_transform_call(args)
32
+ VALUE args;
33
+ {
34
+ VALUE self = rb_ary_entry(args, 0);
35
+ VALUE state = rb_ary_entry(args, 1);
36
+ VALUE depth = rb_ary_entry(args, 2);
37
+ if(state != Qnil) {
38
+ if(rb_json_state_seen(state, self) == Qtrue) {
39
+ rb_raise(
40
+ cCircularDatastructure,
41
+ "circular data structures not supported!"
42
+ );
43
+ }
44
+ rb_json_state_remember(state, self);
45
+ }
46
+ return json_transform(self, state, depth);
47
+ }
48
+
49
+ static VALUE json_check_circular_and_transform_ensure(args)
50
+ VALUE args;
51
+ {
52
+ VALUE self = rb_ary_entry(args, 0);
53
+ VALUE state = rb_ary_entry(args, 1);
54
+ if(state != Qnil) {
55
+ rb_json_state_forget(state, self);
56
+ }
57
+ }
58
+
59
+ static VALUE new_line(result, object_nl)
60
+ VALUE result, object_nl;
61
+ {
62
+ if(object_nl != Qnil) rb_str_append(result, object_nl);
63
+ }
64
+
65
+ static VALUE json_shift(json, state, depth)
66
+ VALUE json, state, depth;
67
+ {
68
+ rb_json_state_indent(state, json, NUM2LONG(depth) + 1);
69
+ return Qnil;
70
+ }
@@ -0,0 +1,9 @@
1
+ #include "ruby.h"
2
+ #include <string.h>
3
+
4
+ static VALUE to_json(int, VALUE*, VALUE);
5
+ static VALUE json_check_circular_and_transform(VALUE, VALUE, VALUE);
6
+ static VALUE json_check_circular_and_transform_call(VALUE);
7
+ static VALUE json_check_circular_and_transform_ensure(VALUE);
8
+ static VALUE new_line(VALUE, VALUE);
9
+ static VALUE json_shift(VALUE, VALUE, VALUE);
@@ -1,3 +1,6 @@
1
1
  require 'mkmf'
2
2
 
3
+ dir = File.dirname(__FILE__)
4
+ find_header("state_lib.h", "#{dir}/../../state_ext")
5
+ find_header("enumerable.h", "#{dir}/../enumerable")
3
6
  create_makefile("hash_ext")
@@ -1,96 +1,39 @@
1
1
  #include "hash_ext.h"
2
+ #include "enumerable.c"
2
3
 
3
- static VALUE cHash;
4
4
  static VALUE mJSON;
5
- static VALUE cState;
6
5
  static VALUE cCircularDatastructure;
7
6
 
8
7
  void Init_hash_ext() {
9
8
  mJSON = rb_const_get(rb_cObject, rb_intern("JSON"));
10
- cState = rb_const_get(mJSON, rb_intern("State"));
11
- cHash = rb_const_get(rb_cObject, rb_intern("Hash"));
9
+ rb_cJsonState = rb_const_get(mJSON, rb_intern("State"));
12
10
  cCircularDatastructure = rb_const_get(mJSON, rb_intern("CircularDatastructure"));
13
- rb_define_method(cHash, "to_json", (VALUE(*)(ANYARGS)) &to_json, -1);
14
- }
15
-
16
- /**
17
- * Returns a JSON string containing a JSON hash, that is unparsed from
18
- * this Hash instance.
19
- * _state_ is a JSON::State object, that can also be used to configure the
20
- * produced JSON string output further.
21
- * _depth_ is used to find out nesting depth, to indent accordingly.
22
- */
23
- static VALUE to_json(argc, argv, self)
24
- int argc;
25
- VALUE *argv;
26
- VALUE self;
27
- {
28
- VALUE state, depth;
29
- rb_scan_args(argc, argv, "02", &state, &depth);
30
- if(depth == Qnil) depth = INT2NUM(0);
31
-
32
- state = rb_funcall(cState, rb_intern("from_state"), 1, state);
33
- return json_check_circular_and_transform(self, state, depth);
11
+ rb_define_method(rb_cHash, "to_json", (VALUE(*)(ANYARGS)) &to_json, -1);
34
12
  }
35
13
 
36
14
  /** private **/
37
15
 
38
- static VALUE json_check_circular_and_transform(self, state, depth)
39
- VALUE self, state, depth;
40
- {
41
- VALUE call_args = rb_ary_new3(3, self, state, depth);
42
- return rb_ensure(json_check_circular_and_transform_call, call_args, json_check_circular_and_transform_ensure, call_args);
43
- }
44
-
45
- static VALUE json_check_circular_and_transform_ensure(args)
46
- VALUE args;
47
- {
48
- VALUE self = rb_ary_entry(args, 0);
49
- VALUE state = rb_ary_entry(args, 1);
50
- if(state != Qnil) {
51
- rb_funcall(state, rb_intern("forget"), 1, self);
52
- }
53
- }
54
-
55
- static VALUE json_check_circular_and_transform_call(args)
56
- VALUE args;
57
- {
58
- VALUE self = rb_ary_entry(args, 0);
59
- VALUE state = rb_ary_entry(args, 1);
60
- VALUE depth = rb_ary_entry(args, 2);
61
- if(state != Qnil) {
62
- if(rb_funcall(state, rb_intern("seen?"), 1, self) == Qtrue) {
63
- rb_raise(
64
- cCircularDatastructure,
65
- "circular data structures not supported!"
66
- );
67
- }
68
- rb_funcall(state, rb_intern("remember"), 1, self);
69
- }
70
- return json_transform(self, state, depth);
71
- }
72
-
73
16
  static VALUE json_transform(self, state, depth)
74
17
  VALUE self, state, depth;
75
18
  {
76
19
  VALUE delim = rb_str_new2(",");
77
20
  VALUE object_nl = Qnil;
78
21
  if(state != Qnil) object_nl = rb_funcall(state, rb_intern("object_nl"), 0);
79
- if(object_nl != Qnil) rb_str_append(delim, object_nl);
22
+ new_line(delim, object_nl);
80
23
 
81
24
  VALUE result = rb_str_new2("{");
82
- if(object_nl != Qnil) rb_str_append(result, object_nl);
25
+ new_line(result, object_nl);
83
26
 
84
- process_internal_json(self, result, state, depth, delim);
27
+ process_internal_json(self, result, state, depth, delim, object_nl);
85
28
 
86
- if(object_nl != Qnil) rb_str_append(result, object_nl);
87
- json_shift(self, result, state, depth);
29
+ new_line(result, object_nl);
30
+ if(rb_json_should_shift(state, object_nl) == Qtrue) json_shift(result, state, depth);
88
31
  rb_str_append(result, rb_str_new2("}"));
89
32
  return result;
90
33
  }
91
34
 
92
- static VALUE process_internal_json(self, json, state, depth, delim)
93
- VALUE self, json, state, depth, delim;
35
+ static VALUE process_internal_json(self, json, state, depth, delim, object_nl)
36
+ VALUE self, json, state, depth, delim, object_nl;
94
37
  {
95
38
  // TODO: Use st_foreach for even better performance
96
39
  VALUE key_value_pairs = rb_funcall(self, rb_intern("to_a"), 0);
@@ -107,22 +50,11 @@ static VALUE process_internal_json(self, json, state, depth, delim)
107
50
  VALUE key = rb_ary_entry(key_value, 0);
108
51
  VALUE value = rb_ary_entry(key_value, 1);
109
52
 
110
- json_shift(self, json, state, depth);
53
+ if(rb_json_should_shift(state, object_nl) == Qtrue) json_shift(json, state, depth);
111
54
  VALUE key_string = rb_funcall(key, rb_intern("to_s"), 0);
112
- rb_str_append(json, rb_funcall(key_string, rb_intern("to_json"), 2, state, new_depth));
55
+ rb_str_append(json, rb_to_json(key_string, state, new_depth));
113
56
  rb_str_cat2(json, ":");
114
57
  rb_str_append(json, space);
115
- rb_str_append(json, rb_funcall(value, rb_intern("to_json"), 2, state, new_depth));
58
+ rb_str_append(json, rb_to_json(value, state, new_depth));
116
59
  }
117
60
  }
118
-
119
- static VALUE json_shift(self, json, state, depth)
120
- VALUE self, json, state, depth;
121
- {
122
- if(state == Qnil) return Qnil;
123
- VALUE object_nl = rb_funcall(state, rb_intern("object_nl"), 0);
124
- if(RSTRING(object_nl)->len == 0) return Qnil;
125
-
126
- rb_json_state_indent(state, json, NUM2LONG(depth) + 1);
127
- return Qnil;
128
- }