oj-introspect 0.5.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a72b92485dbfef2a4b2fe110e3209d277c1cb98a356648d5c37d65015906b1b
4
- data.tar.gz: 9d8047afdd2b9434fd257f05eb3bafef180c57a3b7c8e5a873bdf954dfd2dfab
3
+ metadata.gz: a8344e4ea03bb224e5911727d82641178d51384929ec66d40518b44b9d06cf1a
4
+ data.tar.gz: 6cd47873367c3d0305b40022ca35e46f22060df2fa3d5997927161150cf6996c
5
5
  SHA512:
6
- metadata.gz: 42c8c6afb2256ae41a156892379fa8535f3944f457105db6d6f6b1581008dccc2ba76e413eef725428ea70d384b69ae3d6a8657d745a3eedda7997d1da13910a
7
- data.tar.gz: 12446b7a5f18442a2dd7695823b08ebe331a71d707583342f8b9d7034a0acef529df8368cf490b2928da6ae4d31f673783075b3a24d3f302b6dbe8aab34a8db9
6
+ metadata.gz: c6c63c1724ed3b9295eef1b7858f78ff926042a3bef6d558648822a7a144dd2426ad2e884f8173f576a23c484c2e50c2170c90d905aefe4efa0a4c56b6eccc58
7
+ data.tar.gz: 50992a4c4cc58fe8589afc32669ea6bbb34a699078112e853299b707389f4883ee9e82f1fc0370ee87f61fb9847edb111e2d0540205378b88f9fc05ec008672f
data/.gitignore CHANGED
@@ -13,3 +13,4 @@
13
13
  *.bundle
14
14
  Makefile
15
15
  *.o
16
+ *.so
data/Gemfile CHANGED
@@ -5,6 +5,6 @@ gemspec
5
5
 
6
6
  gem "benchmark-ips"
7
7
  gem "pry"
8
- gem "rake", "~> 12.0"
8
+ gem "rake", "~> 13.0"
9
9
  gem "rspec", "~> 3.0"
10
10
  gem "rake-compiler"
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- oj-introspect (0.5.0)
5
- oj (>= 3.13.22)
4
+ oj-introspect (0.7.0)
5
+ oj (>= 3.13.23)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -11,11 +11,11 @@ GEM
11
11
  coderay (1.1.3)
12
12
  diff-lcs (1.5.0)
13
13
  method_source (1.0.0)
14
- oj (3.13.22)
14
+ oj (3.13.23)
15
15
  pry (0.14.1)
16
16
  coderay (~> 1.1)
17
17
  method_source (~> 1.0)
18
- rake (12.3.3)
18
+ rake (13.0.6)
19
19
  rake-compiler (1.2.0)
20
20
  rake
21
21
  rspec (3.12.0)
@@ -39,7 +39,7 @@ DEPENDENCIES
39
39
  benchmark-ips
40
40
  oj-introspect!
41
41
  pry
42
- rake (~> 12.0)
42
+ rake (~> 13.0)
43
43
  rake-compiler
44
44
  rspec (~> 3.0)
45
45
 
@@ -26,8 +26,14 @@ typedef struct _introspect_S {
26
26
  void (*delegated_open_object_key_func)(struct _ojParser *p);
27
27
  void (*delegated_open_array_key_func)(struct _ojParser *p);
28
28
  void (*delegated_close_object_func)(struct _ojParser *p);
29
+ void (*delegated_close_object_key_func)(struct _ojParser *p);
30
+ void (*delegated_close_array_key_func)(struct _ojParser *p);
29
31
  } * IntrospectDelegate;
30
32
 
33
+ static VALUE introspection_key;
34
+ static VALUE start_byte_key;
35
+ static VALUE end_byte_key;
36
+
31
37
  static void dfree(ojParser p) {
32
38
  IntrospectDelegate d = (IntrospectDelegate)p->ctx;
33
39
 
@@ -51,16 +57,18 @@ static void start(ojParser p) {
51
57
  }
52
58
 
53
59
  static void copy_ruby_str(char **target, VALUE source) {
54
- size_t len = RSTRING_LEN(source);
60
+ const char *ruby_str = StringValueCStr(source);
61
+ size_t len = strlen(ruby_str);
62
+
55
63
  *target = ALLOC_N(char, len + 1);
56
- memcpy(*target, RSTRING_PTR(source), len);
57
- (*target)[len] = '\0'; // Parantheses are important as it means => (*target + sizeof(char) * len)
64
+ strncpy(*target, ruby_str, len + 1);
58
65
  }
59
66
 
60
67
  static VALUE option(ojParser p, const char *key, VALUE value) {
61
68
  IntrospectDelegate d = (IntrospectDelegate)p->ctx;
62
69
 
63
70
  if(strcmp(key, "filter=") == 0) {
71
+ Check_Type(value, T_STRING);
64
72
  copy_ruby_str(&d->filter, value); // We need to copy the value as GC can free it later.
65
73
 
66
74
  return Qtrue;
@@ -144,12 +152,10 @@ static void set_introspection_values(ojParser p) {
144
152
 
145
153
  if(!d->introspect) return;
146
154
 
147
- switch_introspection(d);
148
-
149
155
  volatile VALUE obj = rb_hash_new();
150
- rb_hash_aset(obj, ID2SYM(rb_intern("start_byte")), INT2FIX(pop(p)));
151
- rb_hash_aset(obj, ID2SYM(rb_intern("end_byte")), INT2FIX(p->cur));
152
- rb_hash_aset(*(d->usual.vtail - 1), ID2SYM(rb_intern("__oj_introspection")), obj);
156
+ rb_hash_aset(obj, start_byte_key, INT2FIX(pop(p)));
157
+ rb_hash_aset(obj, end_byte_key, INT2FIX(p->cur));
158
+ rb_hash_aset(*(d->usual.vtail - 1), introspection_key, obj);
153
159
  }
154
160
 
155
161
  static void close_object_introspected(ojParser p) {
@@ -159,10 +165,28 @@ static void close_object_introspected(ojParser p) {
159
165
  set_introspection_values(p);
160
166
  }
161
167
 
168
+ // We switch introspection off only for object and array keys.
169
+ static void close_object_key_introspected(ojParser p) {
170
+ IntrospectDelegate d = (IntrospectDelegate)p->ctx;
171
+ d->delegated_close_object_func(p);
172
+
173
+ if(d->introspect) {
174
+ set_introspection_values(p);
175
+ switch_introspection(d);
176
+ }
177
+ }
178
+
179
+ static void close_array_key_introspected(ojParser p) {
180
+ IntrospectDelegate d = (IntrospectDelegate)p->ctx;
181
+ d->delegated_close_array_key_func(p);
182
+
183
+ if(d->introspect) switch_introspection(d);
184
+ }
185
+
162
186
  static void init_introspect_parser(ojParser p, VALUE ropts) {
163
187
  IntrospectDelegate d = ALLOC(struct _introspect_S);
164
188
 
165
- oj_init_usual(p, (Usual)d);
189
+ oj_init_usual(p, &d->usual);
166
190
 
167
191
  // now function mangling...
168
192
  d->delegated_free_func = p->free;
@@ -174,12 +198,7 @@ static void init_introspect_parser(ojParser p, VALUE ropts) {
174
198
  d->delegated_option_func = p->option;
175
199
  p->option = option;
176
200
 
177
- // We are cheating with the mark, free, and options functions. Since struct
178
- // _usual is the first member of struct _introspect the cast to Usual in the
179
- // usual.c mark() function should still work just fine.
180
-
181
- // PCO - do you need the location of sub-objects and arrays or just top
182
- // level objects?
201
+ // Wrap original functions to collect byte offsets
183
202
  Funcs f = &p->funcs[TOP_FUN];
184
203
  d->delegated_open_object_func = f->open_object;
185
204
  d->delegated_close_object_func = f->close_object;
@@ -193,9 +212,12 @@ static void init_introspect_parser(ojParser p, VALUE ropts) {
193
212
  f = &p->funcs[OBJECT_FUN];
194
213
  d->delegated_open_array_key_func = f->open_array;
195
214
  d->delegated_open_object_key_func = f->open_object;
215
+ d->delegated_close_array_key_func = f->close_array;
216
+ d->delegated_close_object_key_func = f->close_object;
196
217
  f->open_array = open_array_key_introspected;
197
218
  f->open_object = open_object_key_introspected;
198
- f->close_object = close_object_introspected;
219
+ f->close_array = close_array_key_introspected;
220
+ f->close_object = close_object_key_introspected;
199
221
 
200
222
  // Init stack
201
223
  d->byte_offsets.current = 0;
@@ -208,18 +230,6 @@ static void init_introspect_parser(ojParser p, VALUE ropts) {
208
230
  oj_parser_set_option(p, ropts);
209
231
  }
210
232
 
211
- VALUE oj_get_parser_introspect() {
212
- VALUE oj_parser = oj_parser_new();
213
- struct _ojParser *p;
214
- Data_Get_Struct(oj_parser, struct _ojParser, p);
215
-
216
- init_introspect_parser(p, Qnil);
217
-
218
- rb_gc_register_address(&oj_parser);
219
-
220
- return oj_parser;
221
- }
222
-
223
233
  static VALUE rb_new_introspect_parser(int argc, VALUE *argv, VALUE self) {
224
234
  rb_check_arity(argc, 0, 1);
225
235
 
@@ -240,10 +250,6 @@ static VALUE rb_new_introspect_parser(int argc, VALUE *argv, VALUE self) {
240
250
 
241
251
  init_introspect_parser(p, options);
242
252
 
243
- // This locks the object in memory and is never recovered. Best to let the
244
- // mark function handle it.
245
- // rb_gc_register_address(&oj_parser);
246
-
247
253
  return oj_parser;
248
254
  }
249
255
 
@@ -267,6 +273,14 @@ void Init_introspect_ext() {
267
273
  VALUE parser_module = rb_const_get(oj_module, rb_intern("Parser"));
268
274
  VALUE introspection_class = rb_define_class_under(oj_module, "Introspect", rb_cObject);
269
275
 
276
+ introspection_key = ID2SYM(rb_intern("__oj_introspection"));
277
+ rb_gc_register_address(&introspection_key);
278
+ start_byte_key = ID2SYM(rb_intern("start_byte"));
279
+ rb_gc_register_address(&start_byte_key);
280
+ end_byte_key = ID2SYM(rb_intern("end_byte"));
281
+ rb_gc_register_address(&end_byte_key);
282
+
283
+ rb_const_set(introspection_class, rb_intern("KEY"), introspection_key);
270
284
  rb_define_singleton_method(parser_module, "introspect", rb_get_default_introspect_parser, 0);
271
285
  rb_define_singleton_method(introspection_class, "new", rb_new_introspect_parser, -1);
272
286
  }
@@ -1,5 +1,5 @@
1
1
  module Oj
2
2
  class Introspect
3
- VERSION = "0.5.0"
3
+ VERSION = "0.7.0"
4
4
  end
5
5
  end
@@ -24,5 +24,5 @@ Gem::Specification.new do |spec|
24
24
  spec.require_paths = ["lib"]
25
25
  spec.extensions = ["ext/oj-introspect/extconf.rb"]
26
26
 
27
- spec.add_dependency "oj", ">=3.13.22"
27
+ spec.add_dependency "oj", ">=3.13.23"
28
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oj-introspect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mehmet Emin INAC
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-11-04 00:00:00.000000000 Z
11
+ date: 2022-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.13.22
19
+ version: 3.13.23
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.13.22
26
+ version: 3.13.23
27
27
  description: Embeds start and end byte offsets of JSON objects into generated Ruby
28
28
  hashes.
29
29
  email: