yaji 0.3.0-x86-mingw32 → 0.3.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,11 @@
1
+ === 0.3.2 / 2012-05-25
2
+
3
+ * Don't pass stack variables to enumerator (fixes segfaults)
4
+
5
+ === 0.3.1 / 2012-05-25
6
+
7
+ * Protect on_object callback from GC
8
+
1
9
  === 0.3.0 / 2012-04-18
2
10
 
3
11
  * Allow to specify filter at parser initialization
@@ -156,7 +156,7 @@ static int yaji_end_array(void *ctx)
156
156
  return STATUS_CONTINUE;
157
157
  }
158
158
 
159
- static VALUE rb_yaji_each_iter(VALUE chunk, VALUE* params_p);
159
+ static VALUE rb_yaji_each_iter(VALUE chunk, VALUE parser);
160
160
 
161
161
  static VALUE rb_yaji_parser_parse_chunk(VALUE chunk, VALUE self)
162
162
  {
@@ -178,12 +178,10 @@ static VALUE rb_yaji_parser_parse_chunk(VALUE chunk, VALUE self)
178
178
  }
179
179
  for (i=0; i<RARRAY_LEN(p->events); i++) {
180
180
  if (NIL_P(p->input)) {
181
- VALUE params[4];
182
- params[0] = p->on_object_cb;
183
- params[1] = p->object_stack;
184
- params[2] = p->filter;
185
- params[3] = p->with_path ? Qtrue : Qfalse;
186
- rb_yaji_each_iter(RARRAY_PTR(p->events)[i], params);
181
+ p->effective_proc = p->on_object_cb;
182
+ p->effective_filter = p->filter;
183
+ p->effective_with_path = p->with_path ? Qtrue : Qfalse;
184
+ rb_yaji_each_iter(RARRAY_PTR(p->events)[i], self);
187
185
  } else {
188
186
  rb_funcall(p->parser_cb, id_call, 1, RARRAY_PTR(p->events)[i]);
189
187
  }
@@ -335,59 +333,55 @@ static int rb_yaji_str_start_with(VALUE str, VALUE filter)
335
333
  return 0;
336
334
  }
337
335
 
338
- static VALUE rb_yaji_each_iter(VALUE chunk, VALUE* params_p)
336
+ static VALUE rb_yaji_each_iter(VALUE chunk, VALUE parser)
339
337
  {
340
- VALUE* params = (VALUE*)params_p;
338
+ yaji_parser* p = (yaji_parser*) DATA_PTR(parser);
341
339
  VALUE path = rb_ary_shift(chunk);
342
340
  VALUE event = rb_ary_shift(chunk);
343
341
  VALUE value = rb_ary_shift(chunk);
344
- VALUE proc = params[0];
345
- VALUE stack = params[1];
346
- VALUE filter = params[2];
347
- VALUE with_path = params[3];
348
342
  VALUE last_entry, object, container, key, hash;
349
343
 
350
- if (NIL_P(filter) || rb_yaji_str_start_with(path, filter)) {
344
+ if (NIL_P(p->effective_filter) || rb_yaji_str_start_with(path, p->effective_filter)) {
351
345
  if (event == sym_hash_key) {
352
- rb_ary_push(stack, value);
346
+ rb_ary_push(p->object_stack, value);
353
347
  } else if (event == sym_start_hash || event == sym_start_array) {
354
348
  container = (event == sym_start_hash) ? rb_hash_new() : rb_ary_new();
355
- last_entry = rb_ary_entry(stack, -1);
349
+ last_entry = rb_ary_entry(p->object_stack, -1);
356
350
  switch(TYPE(last_entry)) {
357
351
  case T_STRING:
358
- key = rb_ary_pop(stack);
359
- hash = rb_ary_entry(stack, -1);
352
+ key = rb_ary_pop(p->object_stack);
353
+ hash = rb_ary_entry(p->object_stack, -1);
360
354
  rb_hash_aset(hash, key, container);
361
355
  break;
362
356
  case T_ARRAY:
363
357
  rb_ary_push(last_entry, container);
364
358
  }
365
- rb_ary_push(stack, container);
359
+ rb_ary_push(p->object_stack, container);
366
360
  } else if (event == sym_end_hash || event == sym_end_array) {
367
- object = rb_ary_pop(stack);
368
- if (RARRAY_LEN(stack) == 0) {
369
- if (with_path == Qnil || with_path == Qfalse) {
370
- rb_funcall(proc, id_call, 1, object);
361
+ object = rb_ary_pop(p->object_stack);
362
+ if (RARRAY_LEN(p->object_stack) == 0) {
363
+ if (RTEST(p->effective_with_path)) {
364
+ rb_funcall(p->effective_proc, id_call, 1, rb_ary_new3(2, path, object));
371
365
  } else {
372
- rb_funcall(proc, id_call, 1, rb_ary_new3(2, path, object));
366
+ rb_funcall(p->effective_proc, id_call, 1, object);
373
367
  }
374
368
  }
375
369
  } else {
376
- last_entry = rb_ary_entry(stack, -1);
370
+ last_entry = rb_ary_entry(p->object_stack, -1);
377
371
  switch(TYPE(last_entry)) {
378
372
  case T_STRING:
379
- key = rb_ary_pop(stack);
380
- hash = rb_ary_entry(stack, -1);
373
+ key = rb_ary_pop(p->object_stack);
374
+ hash = rb_ary_entry(p->object_stack, -1);
381
375
  rb_hash_aset(hash, key, value);
382
376
  break;
383
377
  case T_ARRAY:
384
378
  rb_ary_push(last_entry, value);
385
379
  break;
386
380
  case T_NIL:
387
- if (with_path == Qnil || with_path == Qfalse) {
388
- rb_funcall(proc, id_call, 1, value);
381
+ if (RTEST(p->effective_with_path)) {
382
+ rb_funcall(p->effective_proc, id_call, 1, rb_ary_new3(2, path, value));
389
383
  } else {
390
- rb_funcall(proc, id_call, 1, rb_ary_new3(2, path, value));
384
+ rb_funcall(p->effective_proc, id_call, 1, value);
391
385
  }
392
386
  break;
393
387
  }
@@ -398,7 +392,7 @@ static VALUE rb_yaji_each_iter(VALUE chunk, VALUE* params_p)
398
392
 
399
393
  static VALUE rb_yaji_parser_each(int argc, VALUE* argv, VALUE self)
400
394
  {
401
- VALUE filter, proc, options, params[4];
395
+ VALUE filter, proc, options;
402
396
  yaji_parser* p = (yaji_parser*) DATA_PTR(self);
403
397
 
404
398
  if (NIL_P(p->input)) {
@@ -406,23 +400,23 @@ static VALUE rb_yaji_parser_each(int argc, VALUE* argv, VALUE self)
406
400
  }
407
401
  RETURN_ENUMERATOR(self, argc, argv);
408
402
  rb_scan_args(argc, argv, "02&", &filter, &options, &proc);
409
- params[0] = proc; // callback
410
- params[1] = rb_ary_new(); // stack
403
+ p->effective_proc = proc;
404
+ p->object_stack = rb_ary_new();
411
405
  if (NIL_P(filter)) {
412
- params[2] = p->filter;
406
+ p->effective_filter = p->filter;
413
407
  } else {
414
- params[2] = filter;
408
+ p->effective_filter = filter;
415
409
  }
416
- params[3] = p->with_path ? Qtrue : Qfalse;
410
+ p->effective_with_path = p->with_path ? Qtrue : Qfalse;
417
411
  if (options != Qnil) {
418
412
  VALUE arg;
419
413
  Check_Type(options, T_HASH);
420
414
  arg = rb_hash_aref(options, sym_with_path);
421
415
  if (!NIL_P(arg)) {
422
- params[3] = arg;
416
+ p->effective_with_path = arg;
423
417
  }
424
418
  }
425
- rb_block_call(self, id_parse, 0, NULL, rb_yaji_each_iter, (VALUE)params);
419
+ rb_block_call(self, id_parse, 0, NULL, rb_yaji_each_iter, self);
426
420
  return Qnil;
427
421
  }
428
422
 
@@ -457,7 +451,12 @@ static void rb_yaji_parser_mark(void *parser)
457
451
  rb_gc_mark(p->path);
458
452
  rb_gc_mark(p->path_str);
459
453
  rb_gc_mark(p->parser_cb);
454
+ rb_gc_mark(p->on_object_cb);
460
455
  rb_gc_mark(p->chunk);
456
+ rb_gc_mark(p->object_stack);
457
+ rb_gc_mark(p->effective_filter);
458
+ rb_gc_mark(p->effective_with_path);
459
+ rb_gc_mark(p->effective_proc);
461
460
  }
462
461
  }
463
462
 
@@ -85,6 +85,9 @@ typedef struct {
85
85
  VALUE filter;
86
86
  VALUE on_object_cb;
87
87
  VALUE object_stack;
88
+ VALUE effective_proc;
89
+ VALUE effective_filter;
90
+ VALUE effective_with_path;
88
91
  yajl_handle handle;
89
92
  yajl_parser_config config;
90
93
  } yaji_parser;
@@ -18,5 +18,5 @@
18
18
  #
19
19
 
20
20
  module YAJI
21
- VERSION = "0.3.0"
21
+ VERSION = "0.3.2"
22
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaji
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.2
5
5
  prerelease:
6
6
  platform: x86-mingw32
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-19 00:00:00.000000000 Z
12
+ date: 2012-06-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -152,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
152
  version: '0'
153
153
  segments:
154
154
  - 0
155
- hash: -2453557434810599764
155
+ hash: 967307934979714977
156
156
  required_rubygems_version: !ruby/object:Gem::Requirement
157
157
  none: false
158
158
  requirements:
@@ -161,10 +161,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
161
  version: '0'
162
162
  segments:
163
163
  - 0
164
- hash: -2453557434810599764
164
+ hash: 967307934979714977
165
165
  requirements: []
166
166
  rubyforge_project: yaji
167
- rubygems_version: 1.8.21
167
+ rubygems_version: 1.8.24
168
168
  signing_key:
169
169
  specification_version: 3
170
170
  summary: Yet another JSON iterator