json 1.8.1 → 1.8.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of json might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +9 -5
- data/CHANGES +9 -0
- data/Gemfile +0 -1
- data/VERSION +1 -1
- data/ext/json/ext/fbuffer/fbuffer.h +10 -1
- data/ext/json/ext/generator/extconf.rb +0 -10
- data/ext/json/ext/generator/generator.c +47 -18
- data/ext/json/ext/generator/generator.h +15 -5
- data/ext/json/ext/parser/extconf.rb +0 -10
- data/ext/json/ext/parser/parser.c +25 -6
- data/ext/json/ext/parser/parser.h +11 -4
- data/ext/json/ext/parser/parser.rl +25 -6
- data/ext/json/extconf.rb +3 -0
- data/java/src/json/ext/Parser.java +86 -85
- data/java/src/json/ext/Parser.rl +6 -5
- data/json-java.gemspec +1 -1
- data/json.gemspec +0 -0
- data/json_pure.gemspec +6 -6
- data/lib/json/add/complex.rb +7 -1
- data/lib/json/add/rational.rb +5 -0
- data/lib/json/add/time.rb +1 -1
- data/lib/json/common.rb +5 -5
- data/lib/json/version.rb +1 -1
- data/tests/test_json.rb +8 -0
- data/tests/test_json_generate.rb +23 -8
- metadata +31 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d6a620d6f2b89f467f16f1f15c65d86d49aa62e
|
4
|
+
data.tar.gz: 8a23ea3e83b70f13baec317e33528ed3d77d1010
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8676b7dc962e28ec1bad91f1aa6bc8d9585e368c594c8a95fe9e86057bbfb643b918f4b878c9fcd3bf1be5fdb5b6a11d5ced2d3a343cfec9aa45606796273bfd
|
7
|
+
data.tar.gz: e3b6bc925f26a298d13a08740f7ffe9f18b87c8c18aaadc14681e22f830d89eb55fcc055373e0c6f45ebfdeff4cd93b67f4cdc37535d761716bce9f2493bfcd3
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# Passes arguments to bundle install (http://gembundler.com/man/bundle-install.1.html)
|
2
|
-
bundler_args: --binstubs
|
2
|
+
#bundler_args: --binstubs
|
3
|
+
language: ruby
|
3
4
|
|
4
5
|
# Specify which ruby versions you wish to run your tests on, each version will be used
|
5
6
|
rvm:
|
@@ -7,14 +8,17 @@ rvm:
|
|
7
8
|
- 1.9.2
|
8
9
|
- 1.9.3
|
9
10
|
- 2.0.0
|
11
|
+
- 2.1
|
12
|
+
- 2.2
|
10
13
|
- ree
|
11
|
-
- rbx-
|
12
|
-
- rbx-19mode
|
14
|
+
- rbx-2
|
13
15
|
- jruby-18mode
|
14
16
|
- jruby-19mode
|
15
17
|
- ruby-head
|
16
18
|
matrix:
|
17
19
|
allow_failures:
|
18
|
-
- rvm: rbx-
|
19
|
-
- rvm:
|
20
|
+
- rvm: rbx-2
|
21
|
+
- rvm: ruby-head
|
20
22
|
script: "bundle exec rake"
|
23
|
+
|
24
|
+
sudo: false
|
data/CHANGES
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
2015-01-08 (1.8.2)
|
2
|
+
* Some performance improvements by Vipul A M <vipulnsward@gmail.com>.
|
3
|
+
* Fix by Jason R. Clark <jclark@newrelic.com> to avoid mutation of
|
4
|
+
JSON.dump_default_options.
|
5
|
+
* More tests by Michael Mac-Vicar <mmacvicar@gmail.com> and fixing
|
6
|
+
space_before accessor in generator.
|
7
|
+
* Performance on Jruby improvemed by Ben Browning <bbrownin@redhat.com>.
|
8
|
+
* Some fixes to be compatible with the new Ruby 2.2 by Zachary Scott <e@zzak.io>
|
9
|
+
and SHIBATA Hiroshi <hsbt@ruby-lang.org>.
|
1
10
|
2013-05-13 (1.8.1)
|
2
11
|
* Remove Rubinius exception since transcoding should be working now.
|
3
12
|
2013-05-13 (1.8.0)
|
data/Gemfile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.8.
|
1
|
+
1.8.2
|
@@ -25,6 +25,15 @@
|
|
25
25
|
#define RSTRING_LEN(string) RSTRING(string)->len
|
26
26
|
#endif
|
27
27
|
|
28
|
+
#ifdef PRIsVALUE
|
29
|
+
# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj)
|
30
|
+
# define RB_OBJ_STRING(obj) (obj)
|
31
|
+
#else
|
32
|
+
# define PRIsVALUE "s"
|
33
|
+
# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj)
|
34
|
+
# define RB_OBJ_STRING(obj) StringValueCStr(obj)
|
35
|
+
#endif
|
36
|
+
|
28
37
|
#ifdef HAVE_RUBY_ENCODING_H
|
29
38
|
#include "ruby/encoding.h"
|
30
39
|
#define FORCE_UTF8(obj) rb_enc_associate((obj), rb_utf8_encoding())
|
@@ -172,7 +181,7 @@ static FBuffer *fbuffer_dup(FBuffer *fb)
|
|
172
181
|
|
173
182
|
static VALUE fbuffer_to_s(FBuffer *fb)
|
174
183
|
{
|
175
|
-
VALUE result = rb_str_new(
|
184
|
+
VALUE result = rb_str_new(FBUFFER_PTR(fb), FBUFFER_LEN(fb));
|
176
185
|
fbuffer_free(fb);
|
177
186
|
FORCE_UTF8(result);
|
178
187
|
return result;
|
@@ -1,14 +1,4 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3')
|
4
|
-
$CFLAGS << ' -O3'
|
5
|
-
end
|
6
|
-
if CONFIG['CC'] =~ /gcc/
|
7
|
-
$CFLAGS << ' -Wall'
|
8
|
-
unless $DEBUG && !$CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb')
|
9
|
-
$CFLAGS << ' -O0 -ggdb'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
3
|
$defs << "-DJSON_GENERATOR"
|
14
4
|
create_makefile 'json/ext/generator'
|
@@ -486,8 +486,9 @@ static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self)
|
|
486
486
|
return cState_partial_generate(state, string);
|
487
487
|
}
|
488
488
|
|
489
|
-
static void State_free(
|
489
|
+
static void State_free(void *ptr)
|
490
490
|
{
|
491
|
+
JSON_Generator_State *state = ptr;
|
491
492
|
if (state->indent) ruby_xfree(state->indent);
|
492
493
|
if (state->space) ruby_xfree(state->space);
|
493
494
|
if (state->space_before) ruby_xfree(state->space_before);
|
@@ -499,7 +500,33 @@ static void State_free(JSON_Generator_State *state)
|
|
499
500
|
ruby_xfree(state);
|
500
501
|
}
|
501
502
|
|
502
|
-
static
|
503
|
+
static size_t State_memsize(const void *ptr)
|
504
|
+
{
|
505
|
+
const JSON_Generator_State *state = ptr;
|
506
|
+
size_t size = sizeof(*state);
|
507
|
+
if (state->indent) size += state->indent_len + 1;
|
508
|
+
if (state->space) size += state->space_len + 1;
|
509
|
+
if (state->space_before) size += state->space_before_len + 1;
|
510
|
+
if (state->object_nl) size += state->object_nl_len + 1;
|
511
|
+
if (state->array_nl) size += state->array_nl_len + 1;
|
512
|
+
if (state->array_delim) size += FBUFFER_CAPA(state->array_delim);
|
513
|
+
if (state->object_delim) size += FBUFFER_CAPA(state->object_delim);
|
514
|
+
if (state->object_delim2) size += FBUFFER_CAPA(state->object_delim2);
|
515
|
+
return size;
|
516
|
+
}
|
517
|
+
|
518
|
+
#ifdef NEW_TYPEDDATA_WRAPPER
|
519
|
+
static const rb_data_type_t JSON_Generator_State_type = {
|
520
|
+
"JSON/Generator/State",
|
521
|
+
{NULL, State_free, State_memsize,},
|
522
|
+
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
523
|
+
0, 0,
|
524
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
525
|
+
#endif
|
526
|
+
};
|
527
|
+
#endif
|
528
|
+
|
529
|
+
static JSON_Generator_State *State_allocate(void)
|
503
530
|
{
|
504
531
|
JSON_Generator_State *state = ALLOC(JSON_Generator_State);
|
505
532
|
MEMZERO(state, JSON_Generator_State, 1);
|
@@ -509,7 +536,7 @@ static JSON_Generator_State *State_allocate()
|
|
509
536
|
static VALUE cState_s_allocate(VALUE klass)
|
510
537
|
{
|
511
538
|
JSON_Generator_State *state = State_allocate();
|
512
|
-
return
|
539
|
+
return TypedData_Wrap_Struct(klass, &JSON_Generator_State_type, state);
|
513
540
|
}
|
514
541
|
|
515
542
|
/*
|
@@ -646,7 +673,7 @@ static VALUE cState_to_h(VALUE self)
|
|
646
673
|
/*
|
647
674
|
* call-seq: [](name)
|
648
675
|
*
|
649
|
-
*
|
676
|
+
* Returns the value returned by method +name+.
|
650
677
|
*/
|
651
678
|
static VALUE cState_aref(VALUE self, VALUE name)
|
652
679
|
{
|
@@ -661,7 +688,7 @@ static VALUE cState_aref(VALUE self, VALUE name)
|
|
661
688
|
/*
|
662
689
|
* call-seq: []=(name, value)
|
663
690
|
*
|
664
|
-
*
|
691
|
+
* Sets the attribute name to value.
|
665
692
|
*/
|
666
693
|
static VALUE cState_aset(VALUE self, VALUE name, VALUE value)
|
667
694
|
{
|
@@ -812,10 +839,10 @@ static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_St
|
|
812
839
|
if (!allow_nan) {
|
813
840
|
if (isinf(value)) {
|
814
841
|
fbuffer_free(buffer);
|
815
|
-
rb_raise(eGeneratorError, "%u: %
|
842
|
+
rb_raise(eGeneratorError, "%u: %"PRIsVALUE" not allowed in JSON", __LINE__, RB_OBJ_STRING(tmp));
|
816
843
|
} else if (isnan(value)) {
|
817
844
|
fbuffer_free(buffer);
|
818
|
-
rb_raise(eGeneratorError, "%u: %
|
845
|
+
rb_raise(eGeneratorError, "%u: %"PRIsVALUE" not allowed in JSON", __LINE__, RB_OBJ_STRING(tmp));
|
819
846
|
}
|
820
847
|
}
|
821
848
|
fbuffer_append_str(buffer, tmp);
|
@@ -871,6 +898,7 @@ static FBuffer *cState_prepare_buffer(VALUE self)
|
|
871
898
|
} else {
|
872
899
|
state->object_delim2 = fbuffer_alloc(16);
|
873
900
|
}
|
901
|
+
if (state->space_before) fbuffer_append(state->object_delim2, state->space_before, state->space_before_len);
|
874
902
|
fbuffer_append_char(state->object_delim2, ':');
|
875
903
|
if (state->space) fbuffer_append(state->object_delim2, state->space, state->space_len);
|
876
904
|
|
@@ -958,15 +986,16 @@ static VALUE cState_initialize(int argc, VALUE *argv, VALUE self)
|
|
958
986
|
/*
|
959
987
|
* call-seq: initialize_copy(orig)
|
960
988
|
*
|
961
|
-
* Initializes this object from orig if it
|
989
|
+
* Initializes this object from orig if it can be duplicated/cloned and returns
|
962
990
|
* it.
|
963
991
|
*/
|
964
992
|
static VALUE cState_init_copy(VALUE obj, VALUE orig)
|
965
993
|
{
|
966
994
|
JSON_Generator_State *objState, *origState;
|
967
995
|
|
968
|
-
|
969
|
-
|
996
|
+
if (obj == orig) return obj;
|
997
|
+
GET_STATE_TO(obj, objState);
|
998
|
+
GET_STATE_TO(orig, origState);
|
970
999
|
if (!objState) rb_raise(rb_eArgError, "unallocated JSON::State");
|
971
1000
|
|
972
1001
|
MEMCPY(objState, origState, JSON_Generator_State, 1);
|
@@ -1005,7 +1034,7 @@ static VALUE cState_from_state_s(VALUE self, VALUE opts)
|
|
1005
1034
|
/*
|
1006
1035
|
* call-seq: indent()
|
1007
1036
|
*
|
1008
|
-
*
|
1037
|
+
* Returns the string that is used to indent levels in the JSON text.
|
1009
1038
|
*/
|
1010
1039
|
static VALUE cState_indent(VALUE self)
|
1011
1040
|
{
|
@@ -1016,7 +1045,7 @@ static VALUE cState_indent(VALUE self)
|
|
1016
1045
|
/*
|
1017
1046
|
* call-seq: indent=(indent)
|
1018
1047
|
*
|
1019
|
-
*
|
1048
|
+
* Sets the string that is used to indent levels in the JSON text.
|
1020
1049
|
*/
|
1021
1050
|
static VALUE cState_indent_set(VALUE self, VALUE indent)
|
1022
1051
|
{
|
@@ -1041,7 +1070,7 @@ static VALUE cState_indent_set(VALUE self, VALUE indent)
|
|
1041
1070
|
/*
|
1042
1071
|
* call-seq: space()
|
1043
1072
|
*
|
1044
|
-
*
|
1073
|
+
* Returns the string that is used to insert a space between the tokens in a JSON
|
1045
1074
|
* string.
|
1046
1075
|
*/
|
1047
1076
|
static VALUE cState_space(VALUE self)
|
@@ -1053,7 +1082,7 @@ static VALUE cState_space(VALUE self)
|
|
1053
1082
|
/*
|
1054
1083
|
* call-seq: space=(space)
|
1055
1084
|
*
|
1056
|
-
*
|
1085
|
+
* Sets _space_ to the string that is used to insert a space between the tokens in a JSON
|
1057
1086
|
* string.
|
1058
1087
|
*/
|
1059
1088
|
static VALUE cState_space_set(VALUE self, VALUE space)
|
@@ -1079,7 +1108,7 @@ static VALUE cState_space_set(VALUE self, VALUE space)
|
|
1079
1108
|
/*
|
1080
1109
|
* call-seq: space_before()
|
1081
1110
|
*
|
1082
|
-
*
|
1111
|
+
* Returns the string that is used to insert a space before the ':' in JSON objects.
|
1083
1112
|
*/
|
1084
1113
|
static VALUE cState_space_before(VALUE self)
|
1085
1114
|
{
|
@@ -1090,7 +1119,7 @@ static VALUE cState_space_before(VALUE self)
|
|
1090
1119
|
/*
|
1091
1120
|
* call-seq: space_before=(space_before)
|
1092
1121
|
*
|
1093
|
-
*
|
1122
|
+
* Sets the string that is used to insert a space before the ':' in JSON objects.
|
1094
1123
|
*/
|
1095
1124
|
static VALUE cState_space_before_set(VALUE self, VALUE space_before)
|
1096
1125
|
{
|
@@ -1297,7 +1326,7 @@ static VALUE cState_depth_set(VALUE self, VALUE depth)
|
|
1297
1326
|
/*
|
1298
1327
|
* call-seq: buffer_initial_length
|
1299
1328
|
*
|
1300
|
-
* This integer returns the current
|
1329
|
+
* This integer returns the current initial length of the buffer.
|
1301
1330
|
*/
|
1302
1331
|
static VALUE cState_buffer_initial_length(VALUE self)
|
1303
1332
|
{
|
@@ -1326,7 +1355,7 @@ static VALUE cState_buffer_initial_length_set(VALUE self, VALUE buffer_initial_l
|
|
1326
1355
|
/*
|
1327
1356
|
*
|
1328
1357
|
*/
|
1329
|
-
void Init_generator()
|
1358
|
+
void Init_generator(void)
|
1330
1359
|
{
|
1331
1360
|
rb_require("json/common");
|
1332
1361
|
|
@@ -23,7 +23,7 @@
|
|
23
23
|
|
24
24
|
#define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key))
|
25
25
|
|
26
|
-
/* unicode
|
26
|
+
/* unicode definitions */
|
27
27
|
|
28
28
|
#define UNI_STRICT_CONVERSION 1
|
29
29
|
|
@@ -78,9 +78,12 @@ typedef struct JSON_Generator_StateStruct {
|
|
78
78
|
long buffer_initial_length;
|
79
79
|
} JSON_Generator_State;
|
80
80
|
|
81
|
+
#define GET_STATE_TO(self, state) \
|
82
|
+
TypedData_Get_Struct(self, JSON_Generator_State, &JSON_Generator_State_type, state)
|
83
|
+
|
81
84
|
#define GET_STATE(self) \
|
82
85
|
JSON_Generator_State *state; \
|
83
|
-
|
86
|
+
GET_STATE_TO(self, state)
|
84
87
|
|
85
88
|
#define GENERATE_JSON(type) \
|
86
89
|
FBuffer *buffer; \
|
@@ -89,7 +92,7 @@ typedef struct JSON_Generator_StateStruct {
|
|
89
92
|
\
|
90
93
|
rb_scan_args(argc, argv, "01", &Vstate); \
|
91
94
|
Vstate = cState_from_state_s(cState, Vstate); \
|
92
|
-
|
95
|
+
TypedData_Get_Struct(Vstate, JSON_Generator_State, &JSON_Generator_State_type, state); \
|
93
96
|
buffer = cState_prepare_buffer(Vstate); \
|
94
97
|
generate_json_##type(buffer, Vstate, state, self); \
|
95
98
|
return fbuffer_to_s(buffer)
|
@@ -108,8 +111,8 @@ static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self);
|
|
108
111
|
static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self);
|
109
112
|
static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self);
|
110
113
|
static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self);
|
111
|
-
static void State_free(
|
112
|
-
static JSON_Generator_State *State_allocate();
|
114
|
+
static void State_free(void *state);
|
115
|
+
static JSON_Generator_State *State_allocate(void);
|
113
116
|
static VALUE cState_s_allocate(VALUE klass);
|
114
117
|
static VALUE cState_configure(VALUE self, VALUE opts);
|
115
118
|
static VALUE cState_to_h(VALUE self);
|
@@ -144,5 +147,12 @@ static VALUE cState_ascii_only_p(VALUE self);
|
|
144
147
|
static VALUE cState_depth(VALUE self);
|
145
148
|
static VALUE cState_depth_set(VALUE self, VALUE depth);
|
146
149
|
static FBuffer *cState_prepare_buffer(VALUE self);
|
150
|
+
#ifdef TypedData_Wrap_Struct
|
151
|
+
static const rb_data_type_t JSON_Generator_State_type;
|
152
|
+
#define NEW_TYPEDDATA_WRAPPER 1
|
153
|
+
#else
|
154
|
+
#define TypedData_Wrap_Struct(klass, ignore, json) Data_Wrap_Struct(klass, NULL, State_free, json)
|
155
|
+
#define TypedData_Get_Struct(self, JSON_Generator_State, ignore, json) Data_Get_Struct(self, JSON_Generator_State, json)
|
156
|
+
#endif
|
147
157
|
|
148
158
|
#endif
|
@@ -1,13 +1,3 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3')
|
4
|
-
$CFLAGS << ' -O3'
|
5
|
-
end
|
6
|
-
if CONFIG['CC'] =~ /gcc/
|
7
|
-
$CFLAGS << ' -Wall'
|
8
|
-
if $DEBUG && !$CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb')
|
9
|
-
$CFLAGS << ' -O0 -ggdb'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
3
|
create_makefile 'json/ext/parser'
|
@@ -1626,8 +1626,8 @@ static VALUE convert_encoding(VALUE source)
|
|
1626
1626
|
* (keys) in a JSON object. Otherwise strings are returned, which is also
|
1627
1627
|
* the default.
|
1628
1628
|
* * *create_additions*: If set to false, the Parser doesn't create
|
1629
|
-
* additions even if a
|
1630
|
-
* defaults to
|
1629
|
+
* additions even if a matching class and create_id was found. This option
|
1630
|
+
* defaults to false.
|
1631
1631
|
* * *object_class*: Defaults to Hash
|
1632
1632
|
* * *array_class*: Defaults to Array
|
1633
1633
|
*/
|
@@ -2092,7 +2092,7 @@ static VALUE cParser_parse(VALUE self)
|
|
2092
2092
|
}
|
2093
2093
|
|
2094
2094
|
|
2095
|
-
static JSON_Parser *JSON_allocate()
|
2095
|
+
static JSON_Parser *JSON_allocate(void)
|
2096
2096
|
{
|
2097
2097
|
JSON_Parser *json = ALLOC(JSON_Parser);
|
2098
2098
|
MEMZERO(json, JSON_Parser, 1);
|
@@ -2100,8 +2100,9 @@ static JSON_Parser *JSON_allocate()
|
|
2100
2100
|
return json;
|
2101
2101
|
}
|
2102
2102
|
|
2103
|
-
static void JSON_mark(
|
2103
|
+
static void JSON_mark(void *ptr)
|
2104
2104
|
{
|
2105
|
+
JSON_Parser *json = ptr;
|
2105
2106
|
rb_gc_mark_maybe(json->Vsource);
|
2106
2107
|
rb_gc_mark_maybe(json->create_id);
|
2107
2108
|
rb_gc_mark_maybe(json->object_class);
|
@@ -2109,16 +2110,34 @@ static void JSON_mark(JSON_Parser *json)
|
|
2109
2110
|
rb_gc_mark_maybe(json->match_string);
|
2110
2111
|
}
|
2111
2112
|
|
2112
|
-
static void JSON_free(
|
2113
|
+
static void JSON_free(void *ptr)
|
2113
2114
|
{
|
2115
|
+
JSON_Parser *json = ptr;
|
2114
2116
|
fbuffer_free(json->fbuffer);
|
2115
2117
|
ruby_xfree(json);
|
2116
2118
|
}
|
2117
2119
|
|
2120
|
+
static size_t JSON_memsize(const void *ptr)
|
2121
|
+
{
|
2122
|
+
const JSON_Parser *json = ptr;
|
2123
|
+
return sizeof(*json) + FBUFFER_CAPA(json->fbuffer);
|
2124
|
+
}
|
2125
|
+
|
2126
|
+
#ifdef NEW_TYPEDDATA_WRAPPER
|
2127
|
+
static const rb_data_type_t JSON_Parser_type = {
|
2128
|
+
"JSON/Parser",
|
2129
|
+
{JSON_mark, JSON_free, JSON_memsize,},
|
2130
|
+
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
2131
|
+
0, 0,
|
2132
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
2133
|
+
#endif
|
2134
|
+
};
|
2135
|
+
#endif
|
2136
|
+
|
2118
2137
|
static VALUE cJSON_parser_s_allocate(VALUE klass)
|
2119
2138
|
{
|
2120
2139
|
JSON_Parser *json = JSON_allocate();
|
2121
|
-
return
|
2140
|
+
return TypedData_Wrap_Struct(klass, &JSON_Parser_type, json);
|
2122
2141
|
}
|
2123
2142
|
|
2124
2143
|
/*
|
@@ -51,7 +51,7 @@ typedef struct JSON_ParserStruct {
|
|
51
51
|
if (!json->Vsource) rb_raise(rb_eTypeError, "uninitialized instance")
|
52
52
|
#define GET_PARSER_INIT \
|
53
53
|
JSON_Parser *json; \
|
54
|
-
|
54
|
+
TypedData_Get_Struct(self, JSON_Parser, &JSON_Parser_type, json)
|
55
55
|
|
56
56
|
#define MinusInfinity "-Infinity"
|
57
57
|
#define EVIL 0x666
|
@@ -68,10 +68,17 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
68
68
|
static VALUE convert_encoding(VALUE source);
|
69
69
|
static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self);
|
70
70
|
static VALUE cParser_parse(VALUE self);
|
71
|
-
static JSON_Parser *JSON_allocate();
|
72
|
-
static void JSON_mark(
|
73
|
-
static void JSON_free(
|
71
|
+
static JSON_Parser *JSON_allocate(void);
|
72
|
+
static void JSON_mark(void *json);
|
73
|
+
static void JSON_free(void *json);
|
74
74
|
static VALUE cJSON_parser_s_allocate(VALUE klass);
|
75
75
|
static VALUE cParser_source(VALUE self);
|
76
|
+
#ifdef TypedData_Wrap_Struct
|
77
|
+
static const rb_data_type_t JSON_Parser_type;
|
78
|
+
#define NEW_TYPEDDATA_WRAPPER 1
|
79
|
+
#else
|
80
|
+
#define TypedData_Wrap_Struct(klass, ignore, json) Data_Wrap_Struct(klass, JSON_mark, JSON_free, json)
|
81
|
+
#define TypedData_Get_Struct(self, JSON_Parser, ignore, json) Data_Get_Struct(self, JSON_Parser, json)
|
82
|
+
#endif
|
76
83
|
|
77
84
|
#endif
|