oj 3.7.5 → 3.7.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/ext/oj/buf.h +4 -4
  3. data/ext/oj/cache8.c +3 -3
  4. data/ext/oj/cache8.h +4 -4
  5. data/ext/oj/circarray.c +1 -1
  6. data/ext/oj/circarray.h +4 -4
  7. data/ext/oj/code.h +6 -6
  8. data/ext/oj/compat.c +5 -5
  9. data/ext/oj/custom.c +15 -13
  10. data/ext/oj/dump.c +15 -5
  11. data/ext/oj/dump.h +3 -3
  12. data/ext/oj/dump_compat.c +15 -11
  13. data/ext/oj/dump_leaf.c +1 -1
  14. data/ext/oj/dump_object.c +4 -2
  15. data/ext/oj/encode.h +3 -3
  16. data/ext/oj/err.c +1 -1
  17. data/ext/oj/err.h +5 -5
  18. data/ext/oj/fast.c +14 -14
  19. data/ext/oj/hash.c +7 -7
  20. data/ext/oj/hash.h +4 -4
  21. data/ext/oj/hash_test.c +2 -2
  22. data/ext/oj/mimic_json.c +9 -9
  23. data/ext/oj/object.c +3 -3
  24. data/ext/oj/odd.c +12 -8
  25. data/ext/oj/odd.h +5 -5
  26. data/ext/oj/oj.c +14 -12
  27. data/ext/oj/oj.h +23 -23
  28. data/ext/oj/parse.c +3 -3
  29. data/ext/oj/parse.h +26 -26
  30. data/ext/oj/rails.c +27 -23
  31. data/ext/oj/rails.h +3 -3
  32. data/ext/oj/reader.h +5 -5
  33. data/ext/oj/resolve.h +3 -3
  34. data/ext/oj/rxclass.c +5 -5
  35. data/ext/oj/rxclass.h +7 -7
  36. data/ext/oj/saj.c +2 -2
  37. data/ext/oj/scp.c +3 -3
  38. data/ext/oj/sparse.c +4 -4
  39. data/ext/oj/stream_writer.c +1 -1
  40. data/ext/oj/strict.c +6 -6
  41. data/ext/oj/string_writer.c +1 -1
  42. data/ext/oj/trace.h +8 -8
  43. data/ext/oj/val_stack.c +8 -2
  44. data/ext/oj/val_stack.h +9 -9
  45. data/ext/oj/wab.c +11 -7
  46. data/lib/oj/version.rb +1 -1
  47. data/test/bug.rb +51 -0
  48. data/test/bug2.rb +10 -0
  49. data/test/bug3.rb +46 -0
  50. data/test/bug_fast.rb +32 -0
  51. data/test/bug_load.rb +24 -0
  52. data/test/crash.rb +111 -0
  53. data/test/example.rb +11 -0
  54. data/test/foo.rb +4 -29
  55. data/test/io.rb +48 -0
  56. data/test/isolated/test_mimic_rails_datetime.rb +27 -0
  57. data/test/mem.rb +12 -27
  58. data/test/mod.rb +16 -0
  59. data/test/omit.rb +20 -0
  60. data/test/rails.rb +50 -0
  61. data/test/rails_datetime_test.rb +24 -0
  62. data/test/russian.rb +18 -0
  63. data/test/struct.rb +29 -0
  64. data/test/test_serializer.rb +59 -0
  65. data/test/write_timebars.rb +31 -0
  66. data/test/x_test.rb +185 -0
  67. metadata +102 -68
  68. data/test/big.rb +0 -15
@@ -227,7 +227,7 @@ oj_dump_leaf_to_json(Leaf leaf, Options copts, Out out) {
227
227
  void
228
228
  oj_write_leaf_to_file(Leaf leaf, const char *path, Options copts) {
229
229
  char buf[4096];
230
- struct _Out out;
230
+ struct _out out;
231
231
  size_t size;
232
232
  FILE *f;
233
233
 
@@ -423,7 +423,7 @@ dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
423
423
  if (odd->raw) {
424
424
  v = rb_funcall(obj, *odd->attrs, 0);
425
425
  if (Qundef == v || T_STRING != rb_type(v)) {
426
- rb_raise(rb_eEncodingError, "Invalid type for raw JSON.\n");
426
+ rb_raise(rb_eEncodingError, "Invalid type for raw JSON.");
427
427
  } else {
428
428
  const char *s = rb_string_value_ptr((VALUE*)&v);
429
429
  int len = (int)RSTRING_LEN(v);
@@ -462,7 +462,9 @@ dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
462
462
  ID i;
463
463
 
464
464
  if (sizeof(nbuf) <= nlen) {
465
- n2 = strdup(name);
465
+ if (NULL == (n2 = strdup(name))) {
466
+ rb_raise(rb_eNoMemError, "for attribute name.");
467
+ }
466
468
  } else {
467
469
  strcpy(n2, name);
468
470
  }
@@ -28,8 +28,8 @@
28
28
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
  */
30
30
 
31
- #ifndef __OJ_ENCODE_H__
32
- #define __OJ_ENCODE_H__
31
+ #ifndef OJ_ENCODE_H
32
+ #define OJ_ENCODE_H
33
33
 
34
34
  #include "ruby.h"
35
35
  #include "ruby/encoding.h"
@@ -40,4 +40,4 @@ oj_encode(VALUE rstr) {
40
40
  return rstr;
41
41
  }
42
42
 
43
- #endif /* __OJ_ENCODE_H__ */
43
+ #endif /* OJ_ENCODE_H */
@@ -40,7 +40,7 @@ _oj_err_set_with_location(Err err, VALUE eclas, const char *msg, const char *jso
40
40
 
41
41
  void
42
42
  _oj_raise_error(const char *msg, const char *json, const char *current, const char* file, int line) {
43
- struct _Err err;
43
+ struct _err err;
44
44
  int n = 1;
45
45
  int col = 1;
46
46
 
@@ -28,8 +28,8 @@
28
28
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
  */
30
30
 
31
- #ifndef __OJ_ERR_H__
32
- #define __OJ_ERR_H__
31
+ #ifndef OJ_ERR_H
32
+ #define OJ_ERR_H
33
33
 
34
34
  #include "ruby.h"
35
35
  // Needed to silence 2.4.0 warnings.
@@ -37,9 +37,9 @@
37
37
  # define NORETURN(x) x
38
38
  #endif
39
39
 
40
- #define set_error(err, eclas, msg, json, current) _oj_err_set_with_location(err, eclas, msg, json, current, __FILE__, __LINE__)
40
+ #define set_error(err, eclas, msg, json, current) _oj_err_set_with_location(err, eclas, msg, json, current, FILE, LINE)
41
41
 
42
- typedef struct _Err {
42
+ typedef struct _err {
43
43
  VALUE clas;
44
44
  char msg[128];
45
45
  } *Err;
@@ -67,4 +67,4 @@ err_has(Err e) {
67
67
  return (Qnil != e->clas);
68
68
  }
69
69
 
70
- #endif /* __OJ_ERR_H__ */
70
+ #endif /* OJ_ERR_H */
@@ -43,16 +43,16 @@
43
43
  // maximum to allocate on the stack, arbitrary limit
44
44
  #define SMALL_XML 65536
45
45
  #define MAX_STACK 100
46
- //#define BATCH_SIZE (4096 / sizeof(struct _Leaf) - 1)
46
+ //#define BATCH_SIZE (4096 / sizeof(struct _leaf) - 1)
47
47
  #define BATCH_SIZE 100
48
48
 
49
- typedef struct _Batch {
50
- struct _Batch *next;
49
+ typedef struct _batch {
50
+ struct _batch *next;
51
51
  int next_avail;
52
- struct _Leaf leaves[BATCH_SIZE];
52
+ struct _leaf leaves[BATCH_SIZE];
53
53
  } *Batch;
54
54
 
55
- typedef struct _Doc {
55
+ typedef struct _doc {
56
56
  Leaf data;
57
57
  Leaf *where; // points to current location
58
58
  Leaf where_path[MAX_STACK]; // points to head of path
@@ -60,10 +60,10 @@ typedef struct _Doc {
60
60
  unsigned long size; // number of leaves/branches in the doc
61
61
  VALUE self;
62
62
  Batch batches;
63
- struct _Batch batch0;
63
+ struct _batch batch0;
64
64
  } *Doc;
65
65
 
66
- typedef struct _ParseInfo {
66
+ typedef struct _parseInfo {
67
67
  char *str; /* buffer being read from */
68
68
  char *s; /* current position in buffer */
69
69
  Doc doc;
@@ -204,10 +204,10 @@ leaf_new(Doc doc, int type) {
204
204
  Leaf leaf;
205
205
 
206
206
  if (0 == doc->batches || BATCH_SIZE == doc->batches->next_avail) {
207
- Batch b = ALLOC(struct _Batch);
207
+ Batch b = ALLOC(struct _batch);
208
208
 
209
209
  // Initializes all leaves with a NO_VAL value_type
210
- memset(b, 0, sizeof(struct _Batch));
210
+ memset(b, 0, sizeof(struct _batch));
211
211
  b->next = doc->batches;
212
212
  doc->batches = b;
213
213
  b->next_avail = 0;
@@ -734,7 +734,7 @@ read_quoted_value(ParseInfo pi) {
734
734
  // doc support functions
735
735
  inline static void
736
736
  doc_init(Doc doc) {
737
- memset(doc, 0, sizeof(struct _Doc));
737
+ memset(doc, 0, sizeof(struct _doc));
738
738
  doc->where = doc->where_path;
739
739
  doc->self = Qundef;
740
740
  doc->batches = &doc->batch0;
@@ -813,16 +813,16 @@ mark_doc(void *ptr) {
813
813
 
814
814
  static VALUE
815
815
  parse_json(VALUE clas, char *json, bool given, bool allocated) {
816
- struct _ParseInfo pi;
816
+ struct _parseInfo pi;
817
817
  volatile VALUE result = Qnil;
818
818
  Doc doc;
819
819
  int ex = 0;
820
820
  volatile VALUE self;
821
821
 
822
822
  if (given) {
823
- doc = ALLOCA_N(struct _Doc, 1);
823
+ doc = ALLOCA_N(struct _doc, 1);
824
824
  } else {
825
- doc = ALLOC(struct _Doc);
825
+ doc = ALLOC(struct _doc);
826
826
  }
827
827
  /* skip UTF-8 BOM if present */
828
828
  if (0xEF == (uint8_t)*json && 0xBB == (uint8_t)json[1] && 0xBF == (uint8_t)json[2]) {
@@ -1624,7 +1624,7 @@ doc_dump(int argc, VALUE *argv, VALUE self) {
1624
1624
 
1625
1625
  if (0 == filename) {
1626
1626
  char buf[4096];
1627
- struct _Out out;
1627
+ struct _out out;
1628
1628
 
1629
1629
  out.buf = buf;
1630
1630
  out.end = buf + sizeof(buf) - 10;
@@ -34,19 +34,19 @@
34
34
  #define HASH_MASK 0x000003FF
35
35
  #define HASH_SLOT_CNT 1024
36
36
 
37
- typedef struct _KeyVal {
38
- struct _KeyVal *next;
37
+ typedef struct _keyVal {
38
+ struct _keyVal *next;
39
39
  const char *key;
40
40
  size_t len;
41
41
  VALUE val;
42
42
  } *KeyVal;
43
43
 
44
- struct _Hash {
45
- struct _KeyVal slots[HASH_SLOT_CNT];
44
+ struct _hash {
45
+ struct _keyVal slots[HASH_SLOT_CNT];
46
46
  };
47
47
 
48
- struct _Hash class_hash;
49
- struct _Hash intern_hash;
48
+ struct _hash class_hash;
49
+ struct _hash intern_hash;
50
50
 
51
51
  // almost the Murmur hash algorithm
52
52
  #define M 0x5bd1e995
@@ -114,7 +114,7 @@ hash_get(Hash hash, const char *key, size_t len, VALUE **slotp, VALUE def_value)
114
114
  }
115
115
  if (0 != slotp) {
116
116
  if (0 != bucket->key) {
117
- KeyVal b = ALLOC(struct _KeyVal);
117
+ KeyVal b = ALLOC(struct _keyVal);
118
118
 
119
119
  b->next = 0;
120
120
  bucket->next = b;
@@ -28,12 +28,12 @@
28
28
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
  */
30
30
 
31
- #ifndef __OJ_HASH_H__
32
- #define __OJ_HASH_H__
31
+ #ifndef OJ_HASH_H
32
+ #define OJ_HASH_H
33
33
 
34
34
  #include "ruby.h"
35
35
 
36
- typedef struct _Hash *Hash;
36
+ typedef struct _hash *Hash;
37
37
 
38
38
  extern void oj_hash_init();
39
39
 
@@ -43,4 +43,4 @@ extern ID oj_attr_hash_get(const char *key, size_t len, ID **slotp);
43
43
  extern void oj_hash_print();
44
44
  extern char* oj_strndup(const char *s, size_t len);
45
45
 
46
- #endif /* __OJ_HASH_H__ */
46
+ #endif /* OJ_HASH_H */
@@ -39,12 +39,12 @@
39
39
  #define __STDC_FORMAT_MACROS
40
40
  #include <inttypes.h>
41
41
 
42
- typedef struct _StrLen {
42
+ typedef struct _strLen {
43
43
  const char *str;
44
44
  size_t len;
45
45
  } *StrLen;
46
46
 
47
- static struct _StrLen data[] = {
47
+ static struct _strLen data[] = {
48
48
  { "Gem::Version", 12 },
49
49
  { "TracePoint", 10 },
50
50
  { "Complex::compatible", 19 },
@@ -196,8 +196,8 @@ mimic_limit_arg(VALUE a) {
196
196
  static VALUE
197
197
  mimic_dump(int argc, VALUE *argv, VALUE self) {
198
198
  char buf[4096];
199
- struct _Out out;
200
- struct _Options copts = oj_default_options;
199
+ struct _out out;
200
+ struct _options copts = oj_default_options;
201
201
  VALUE rstr;
202
202
 
203
203
  copts.str_rx.head = NULL;
@@ -354,7 +354,7 @@ mimic_dump_load(int argc, VALUE *argv, VALUE self) {
354
354
  static VALUE
355
355
  mimic_generate_core(int argc, VALUE *argv, Options copts) {
356
356
  char buf[4096];
357
- struct _Out out;
357
+ struct _out out;
358
358
  VALUE rstr;
359
359
 
360
360
  out.buf = buf;
@@ -414,7 +414,7 @@ mimic_generate_core(int argc, VALUE *argv, Options copts) {
414
414
  */
415
415
  VALUE
416
416
  oj_mimic_generate(int argc, VALUE *argv, VALUE self) {
417
- struct _Options copts = oj_default_options;
417
+ struct _options copts = oj_default_options;
418
418
 
419
419
  copts.str_rx.head = NULL;
420
420
  copts.str_rx.tail = NULL;
@@ -432,7 +432,7 @@ oj_mimic_generate(int argc, VALUE *argv, VALUE self) {
432
432
  */
433
433
  VALUE
434
434
  oj_mimic_pretty_generate(int argc, VALUE *argv, VALUE self) {
435
- struct _Options copts = oj_default_options;
435
+ struct _options copts = oj_default_options;
436
436
  VALUE rargs[2];
437
437
  volatile VALUE h;
438
438
 
@@ -481,7 +481,7 @@ oj_mimic_pretty_generate(int argc, VALUE *argv, VALUE self) {
481
481
 
482
482
  static VALUE
483
483
  mimic_parse_core(int argc, VALUE *argv, VALUE self, bool bang) {
484
- struct _ParseInfo pi;
484
+ struct _parseInfo pi;
485
485
  VALUE ropts;
486
486
  VALUE args[1];
487
487
 
@@ -660,7 +660,7 @@ mimic_create_id(VALUE self) {
660
660
  return rb_str_new_cstr(oj_json_class);
661
661
  }
662
662
 
663
- static struct _Options mimic_object_to_json_options = {
663
+ static struct _options mimic_object_to_json_options = {
664
664
  0, // indent
665
665
  No, // circular
666
666
  No, // auto_define
@@ -717,9 +717,9 @@ static struct _Options mimic_object_to_json_options = {
717
717
  static VALUE
718
718
  mimic_object_to_json(int argc, VALUE *argv, VALUE self) {
719
719
  char buf[4096];
720
- struct _Out out;
720
+ struct _out out;
721
721
  VALUE rstr;
722
- struct _Options copts = oj_default_options;
722
+ struct _options copts = oj_default_options;
723
723
 
724
724
  copts.str_rx.head = NULL;
725
725
  copts.str_rx.tail = NULL;
@@ -677,7 +677,7 @@ start_hash(ParseInfo pi) {
677
677
  }
678
678
 
679
679
  static void
680
- end_hash(struct _ParseInfo *pi) {
680
+ end_hash(ParseInfo pi) {
681
681
  Val parent = stack_peek(&pi->stack);
682
682
 
683
683
  if (Qnil == parent->val) {
@@ -765,7 +765,7 @@ oj_set_object_callbacks(ParseInfo pi) {
765
765
 
766
766
  VALUE
767
767
  oj_object_parse(int argc, VALUE *argv, VALUE self) {
768
- struct _ParseInfo pi;
768
+ struct _parseInfo pi;
769
769
 
770
770
  parse_info_init(&pi);
771
771
  pi.options = oj_default_options;
@@ -782,7 +782,7 @@ oj_object_parse(int argc, VALUE *argv, VALUE self) {
782
782
 
783
783
  VALUE
784
784
  oj_object_parse_cstr(int argc, VALUE *argv, char *json, size_t len) {
785
- struct _ParseInfo pi;
785
+ struct _parseInfo pi;
786
786
 
787
787
  parse_info_init(&pi);
788
788
  pi.options = oj_default_options;
@@ -7,8 +7,8 @@
7
7
 
8
8
  #include "odd.h"
9
9
 
10
- static struct _Odd _odds[4]; // bump up if new initial Odd classes are added
11
- static struct _Odd *odds = _odds;
10
+ static struct _odd _odds[4]; // bump up if new initial Odd classes are added
11
+ static struct _odd *odds = _odds;
12
12
  static long odd_cnt = 0;
13
13
  static ID sec_id;
14
14
  static ID sec_fraction_id;
@@ -152,7 +152,7 @@ oj_get_oddc(const char *classname, size_t len) {
152
152
 
153
153
  OddArgs
154
154
  oj_odd_alloc_args(Odd odd) {
155
- OddArgs oa = ALLOC_N(struct _OddArgs, 1);
155
+ OddArgs oa = ALLOC_N(struct _oddArgs, 1);
156
156
  VALUE *a;
157
157
  int i;
158
158
 
@@ -191,15 +191,17 @@ oj_reg_odd(VALUE clas, VALUE create_object, VALUE create_method, int mcnt, VALUE
191
191
  AttrGetFunc *fp;
192
192
 
193
193
  if (_odds == odds) {
194
- odds = ALLOC_N(struct _Odd, odd_cnt + 1);
194
+ odds = ALLOC_N(struct _odd, odd_cnt + 1);
195
195
 
196
- memcpy(odds, _odds, sizeof(struct _Odd) * odd_cnt);
196
+ memcpy(odds, _odds, sizeof(struct _odd) * odd_cnt);
197
197
  } else {
198
- REALLOC_N(odds, struct _Odd, odd_cnt + 1);
198
+ REALLOC_N(odds, struct _odd, odd_cnt + 1);
199
199
  }
200
200
  odd = odds + odd_cnt;
201
201
  odd->clas = clas;
202
- odd->classname = strdup(rb_class2name(clas));
202
+ if (NULL == (odd->classname = strdup(rb_class2name(clas)))) {
203
+ rb_raise(rb_eNoMemError, "for attribute name.");
204
+ }
203
205
  odd->clen = strlen(odd->classname);
204
206
  odd->create_obj = create_object;
205
207
  odd->create_op = SYM2ID(create_method);
@@ -210,7 +212,9 @@ oj_reg_odd(VALUE clas, VALUE create_object, VALUE create_method, int mcnt, VALUE
210
212
  *fp = 0;
211
213
  switch (rb_type(*members)) {
212
214
  case T_STRING:
213
- *np = strdup(rb_string_value_ptr(members));
215
+ if (NULL == (*np = strdup(rb_string_value_ptr(members)))) {
216
+ rb_raise(rb_eNoMemError, "for attribute name.");
217
+ }
214
218
  break;
215
219
  case T_SYMBOL:
216
220
  *np = rb_id2name(SYM2ID(*members));
@@ -3,8 +3,8 @@
3
3
  * All rights reserved.
4
4
  */
5
5
 
6
- #ifndef __OJ_ODD_H__
7
- #define __OJ_ODD_H__
6
+ #ifndef OJ_ODD_H
7
+ #define OJ_ODD_H
8
8
 
9
9
  #include <stdbool.h>
10
10
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  typedef VALUE (*AttrGetFunc)(VALUE obj);
16
16
 
17
- typedef struct _Odd {
17
+ typedef struct _odd {
18
18
  const char *classname;
19
19
  size_t clen;
20
20
  VALUE clas; // Ruby class or module
@@ -28,7 +28,7 @@ typedef struct _Odd {
28
28
  AttrGetFunc attrFuncs[MAX_ODD_ARGS];
29
29
  } *Odd;
30
30
 
31
- typedef struct _OddArgs {
31
+ typedef struct _oddArgs {
32
32
  Odd odd;
33
33
  VALUE args[MAX_ODD_ARGS];
34
34
  } *OddArgs;
@@ -41,4 +41,4 @@ extern void oj_odd_free(OddArgs args);
41
41
  extern int oj_odd_set_arg(OddArgs args, const char *key, size_t klen, VALUE value);
42
42
  extern void oj_reg_odd(VALUE clas, VALUE create_object, VALUE create_method, int mcnt, VALUE *members, bool raw);
43
43
 
44
- #endif /* __OJ_ODD_H__ */
44
+ #endif /* OJ_ODD_H */
@@ -19,7 +19,7 @@
19
19
  #include "rails.h"
20
20
  #include "encode.h"
21
21
 
22
- typedef struct _YesNoOpt {
22
+ typedef struct _yesNoOpt {
23
23
  VALUE sym;
24
24
  char *attr;
25
25
  } *YesNoOpt;
@@ -154,7 +154,7 @@ VALUE oj_cache_mutex = Qnil;
154
154
 
155
155
  const char oj_json_class[] = "json_class";
156
156
 
157
- struct _Options oj_default_options = {
157
+ struct _options oj_default_options = {
158
158
  0, // indent
159
159
  No, // circular
160
160
  No, // auto_define
@@ -401,7 +401,7 @@ set_def_opts(VALUE self, VALUE opts) {
401
401
 
402
402
  void
403
403
  oj_parse_options(VALUE ropts, Options copts) {
404
- struct _YesNoOpt ynos[] = {
404
+ struct _yesNoOpt ynos[] = {
405
405
  { circular_sym, &copts->circular },
406
406
  { auto_define_sym, &copts->auto_define },
407
407
  { symbol_keys_sym, &copts->sym_key },
@@ -901,7 +901,7 @@ load_file(int argc, VALUE *argv, VALUE self) {
901
901
  char *path;
902
902
  int fd;
903
903
  Mode mode = oj_default_options.mode;
904
- struct _ParseInfo pi;
904
+ struct _parseInfo pi;
905
905
 
906
906
  if (1 > argc) {
907
907
  rb_raise(rb_eArgError, "Wrong number of arguments to load().");
@@ -976,7 +976,7 @@ load_file(int argc, VALUE *argv, VALUE self) {
976
976
  */
977
977
  static VALUE
978
978
  safe_load(VALUE self, VALUE doc) {
979
- struct _ParseInfo pi;
979
+ struct _parseInfo pi;
980
980
  VALUE args[1];
981
981
 
982
982
  parse_info_init(&pi);
@@ -1028,8 +1028,8 @@ safe_load(VALUE self, VALUE doc) {
1028
1028
  static VALUE
1029
1029
  dump(int argc, VALUE *argv, VALUE self) {
1030
1030
  char buf[4096];
1031
- struct _Out out;
1032
- struct _Options copts = oj_default_options;
1031
+ struct _out out;
1032
+ struct _options copts = oj_default_options;
1033
1033
  VALUE rstr;
1034
1034
 
1035
1035
  if (1 > argc) {
@@ -1080,8 +1080,8 @@ dump(int argc, VALUE *argv, VALUE self) {
1080
1080
  static VALUE
1081
1081
  to_json(int argc, VALUE *argv, VALUE self) {
1082
1082
  char buf[4096];
1083
- struct _Out out;
1084
- struct _Options copts = oj_default_options;
1083
+ struct _out out;
1084
+ struct _options copts = oj_default_options;
1085
1085
  VALUE rstr;
1086
1086
 
1087
1087
  if (1 > argc) {
@@ -1125,7 +1125,7 @@ to_json(int argc, VALUE *argv, VALUE self) {
1125
1125
  */
1126
1126
  static VALUE
1127
1127
  to_file(int argc, VALUE *argv, VALUE self) {
1128
- struct _Options copts = oj_default_options;
1128
+ struct _options copts = oj_default_options;
1129
1129
 
1130
1130
  if (3 == argc) {
1131
1131
  oj_parse_options(argv[2], &copts);
@@ -1148,7 +1148,7 @@ to_file(int argc, VALUE *argv, VALUE self) {
1148
1148
  */
1149
1149
  static VALUE
1150
1150
  to_stream(int argc, VALUE *argv, VALUE self) {
1151
- struct _Options copts = oj_default_options;
1151
+ struct _options copts = oj_default_options;
1152
1152
 
1153
1153
  if (3 == argc) {
1154
1154
  oj_parse_options(argv[2], &copts);
@@ -1699,7 +1699,9 @@ Init_oj() {
1699
1699
  oj_mimic_rails_init();
1700
1700
 
1701
1701
  #if HAVE_LIBPTHREAD
1702
- pthread_mutex_init(&oj_cache_mutex, 0);
1702
+ if (0 != (err = pthread_mutex_init(&oj_cache_mutex, 0))) {
1703
+ rb_raise(rb_eException, "failed to initialize a mutex. %s", strerror(err));
1704
+ }
1703
1705
  #else
1704
1706
  oj_cache_mutex = rb_mutex_new();
1705
1707
  rb_gc_register_address(&oj_cache_mutex);