oj 3.9.1 → 3.16.11

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.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1452 -0
  3. data/README.md +21 -6
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +50 -68
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +60 -62
  9. data/ext/oj/cache8.h +9 -36
  10. data/ext/oj/circarray.c +38 -42
  11. data/ext/oj/circarray.h +12 -13
  12. data/ext/oj/code.c +158 -179
  13. data/ext/oj/code.h +20 -22
  14. data/ext/oj/compat.c +145 -205
  15. data/ext/oj/custom.c +740 -880
  16. data/ext/oj/debug.c +126 -0
  17. data/ext/oj/dump.c +1145 -844
  18. data/ext/oj/dump.h +71 -57
  19. data/ext/oj/dump_compat.c +575 -655
  20. data/ext/oj/dump_leaf.c +96 -186
  21. data/ext/oj/dump_object.c +533 -660
  22. data/ext/oj/dump_strict.c +306 -340
  23. data/ext/oj/encode.h +4 -33
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +28 -28
  26. data/ext/oj/err.h +39 -42
  27. data/ext/oj/extconf.rb +28 -7
  28. data/ext/oj/fast.c +1052 -1113
  29. data/ext/oj/intern.c +313 -0
  30. data/ext/oj/intern.h +22 -0
  31. data/ext/oj/mem.c +318 -0
  32. data/ext/oj/mem.h +53 -0
  33. data/ext/oj/mimic_json.c +471 -430
  34. data/ext/oj/object.c +532 -580
  35. data/ext/oj/odd.c +156 -142
  36. data/ext/oj/odd.h +25 -26
  37. data/ext/oj/oj.c +1346 -961
  38. data/ext/oj/oj.h +307 -290
  39. data/ext/oj/parse.c +954 -858
  40. data/ext/oj/parse.h +74 -72
  41. data/ext/oj/parser.c +1600 -0
  42. data/ext/oj/parser.h +103 -0
  43. data/ext/oj/rails.c +819 -836
  44. data/ext/oj/rails.h +8 -11
  45. data/ext/oj/reader.c +136 -147
  46. data/ext/oj/reader.h +69 -83
  47. data/ext/oj/resolve.c +41 -63
  48. data/ext/oj/resolve.h +4 -6
  49. data/ext/oj/rxclass.c +69 -72
  50. data/ext/oj/rxclass.h +12 -13
  51. data/ext/oj/saj.c +440 -485
  52. data/ext/oj/saj2.c +584 -0
  53. data/ext/oj/saj2.h +23 -0
  54. data/ext/oj/scp.c +79 -118
  55. data/ext/oj/simd.h +10 -0
  56. data/ext/oj/sparse.c +739 -709
  57. data/ext/oj/stream_writer.c +141 -175
  58. data/ext/oj/strict.c +103 -128
  59. data/ext/oj/string_writer.c +244 -261
  60. data/ext/oj/trace.c +34 -41
  61. data/ext/oj/trace.h +42 -15
  62. data/ext/oj/usual.c +1218 -0
  63. data/ext/oj/usual.h +69 -0
  64. data/ext/oj/util.c +107 -107
  65. data/ext/oj/util.h +4 -3
  66. data/ext/oj/val_stack.c +61 -78
  67. data/ext/oj/val_stack.h +80 -114
  68. data/ext/oj/validate.c +46 -0
  69. data/ext/oj/wab.c +316 -361
  70. data/lib/oj/active_support_helper.rb +1 -3
  71. data/lib/oj/bag.rb +8 -1
  72. data/lib/oj/easy_hash.rb +9 -9
  73. data/lib/oj/error.rb +1 -2
  74. data/lib/oj/json.rb +162 -150
  75. data/lib/oj/mimic.rb +54 -20
  76. data/lib/oj/saj.rb +20 -6
  77. data/lib/oj/schandler.rb +5 -4
  78. data/lib/oj/state.rb +12 -8
  79. data/lib/oj/version.rb +1 -2
  80. data/lib/oj.rb +2 -8
  81. data/pages/Compatibility.md +1 -1
  82. data/pages/Encoding.md +1 -1
  83. data/pages/InstallOptions.md +20 -0
  84. data/pages/JsonGem.md +15 -0
  85. data/pages/Modes.md +9 -3
  86. data/pages/Options.md +62 -12
  87. data/pages/Parser.md +309 -0
  88. data/pages/Rails.md +73 -22
  89. metadata +68 -192
  90. data/ext/oj/hash.c +0 -163
  91. data/ext/oj/hash.h +0 -46
  92. data/ext/oj/hash_test.c +0 -512
  93. data/test/_test_active.rb +0 -76
  94. data/test/_test_active_mimic.rb +0 -96
  95. data/test/_test_mimic_rails.rb +0 -126
  96. data/test/activerecord/result_test.rb +0 -27
  97. data/test/activesupport4/decoding_test.rb +0 -108
  98. data/test/activesupport4/encoding_test.rb +0 -531
  99. data/test/activesupport4/test_helper.rb +0 -41
  100. data/test/activesupport5/decoding_test.rb +0 -125
  101. data/test/activesupport5/encoding_test.rb +0 -485
  102. data/test/activesupport5/encoding_test_cases.rb +0 -90
  103. data/test/activesupport5/test_helper.rb +0 -50
  104. data/test/activesupport5/time_zone_test_helpers.rb +0 -24
  105. data/test/bar.rb +0 -25
  106. data/test/files.rb +0 -29
  107. data/test/foo.rb +0 -21
  108. data/test/helper.rb +0 -26
  109. data/test/isolated/shared.rb +0 -308
  110. data/test/isolated/test_mimic_after.rb +0 -13
  111. data/test/isolated/test_mimic_alone.rb +0 -12
  112. data/test/isolated/test_mimic_as_json.rb +0 -45
  113. data/test/isolated/test_mimic_before.rb +0 -13
  114. data/test/isolated/test_mimic_define.rb +0 -28
  115. data/test/isolated/test_mimic_rails_after.rb +0 -22
  116. data/test/isolated/test_mimic_rails_before.rb +0 -21
  117. data/test/isolated/test_mimic_redefine.rb +0 -15
  118. data/test/json_gem/json_addition_test.rb +0 -216
  119. data/test/json_gem/json_common_interface_test.rb +0 -148
  120. data/test/json_gem/json_encoding_test.rb +0 -107
  121. data/test/json_gem/json_ext_parser_test.rb +0 -20
  122. data/test/json_gem/json_fixtures_test.rb +0 -35
  123. data/test/json_gem/json_generator_test.rb +0 -383
  124. data/test/json_gem/json_generic_object_test.rb +0 -90
  125. data/test/json_gem/json_parser_test.rb +0 -470
  126. data/test/json_gem/json_string_matching_test.rb +0 -42
  127. data/test/json_gem/test_helper.rb +0 -18
  128. data/test/perf.rb +0 -107
  129. data/test/perf_compat.rb +0 -130
  130. data/test/perf_fast.rb +0 -164
  131. data/test/perf_file.rb +0 -64
  132. data/test/perf_object.rb +0 -138
  133. data/test/perf_saj.rb +0 -109
  134. data/test/perf_scp.rb +0 -151
  135. data/test/perf_simple.rb +0 -287
  136. data/test/perf_strict.rb +0 -145
  137. data/test/perf_wab.rb +0 -131
  138. data/test/sample/change.rb +0 -14
  139. data/test/sample/dir.rb +0 -19
  140. data/test/sample/doc.rb +0 -36
  141. data/test/sample/file.rb +0 -48
  142. data/test/sample/group.rb +0 -16
  143. data/test/sample/hasprops.rb +0 -16
  144. data/test/sample/layer.rb +0 -12
  145. data/test/sample/line.rb +0 -20
  146. data/test/sample/oval.rb +0 -10
  147. data/test/sample/rect.rb +0 -10
  148. data/test/sample/shape.rb +0 -35
  149. data/test/sample/text.rb +0 -20
  150. data/test/sample.rb +0 -54
  151. data/test/sample_json.rb +0 -37
  152. data/test/test_compat.rb +0 -509
  153. data/test/test_custom.rb +0 -503
  154. data/test/test_debian.rb +0 -53
  155. data/test/test_fast.rb +0 -470
  156. data/test/test_file.rb +0 -239
  157. data/test/test_gc.rb +0 -49
  158. data/test/test_hash.rb +0 -29
  159. data/test/test_integer_range.rb +0 -73
  160. data/test/test_null.rb +0 -376
  161. data/test/test_object.rb +0 -1018
  162. data/test/test_saj.rb +0 -186
  163. data/test/test_scp.rb +0 -433
  164. data/test/test_strict.rb +0 -410
  165. data/test/test_various.rb +0 -741
  166. data/test/test_wab.rb +0 -307
  167. data/test/test_writer.rb +0 -380
  168. data/test/tests.rb +0 -24
  169. data/test/tests_mimic.rb +0 -14
  170. data/test/tests_mimic_addition.rb +0 -7
  171. data/test/zoo.rb +0 -13
data/ext/oj/usual.h ADDED
@@ -0,0 +1,69 @@
1
+ // Copyright (c) 2022, Peter Ohler, All rights reserved.
2
+
3
+ #include <ruby.h>
4
+ #include <stdbool.h>
5
+ #include <stdint.h>
6
+
7
+ struct _cache;
8
+ struct _ojParser;
9
+
10
+ // Used to mark the start of each Hash, Array, or Object. The members point at
11
+ // positions of the start in the value stack and if not an Array into the key
12
+ // stack.
13
+ typedef struct _col {
14
+ long vi; // value stack index
15
+ long ki; // key stack index if an hash else -1 for an array
16
+ } *Col;
17
+
18
+ typedef union _key {
19
+ struct {
20
+ int16_t len;
21
+ char buf[30];
22
+ };
23
+ struct {
24
+ int16_t xlen; // should be the same as len
25
+ char *key;
26
+ };
27
+ } *Key;
28
+
29
+ #define MISS_AUTO 'A'
30
+ #define MISS_RAISE 'R'
31
+ #define MISS_IGNORE 'I'
32
+
33
+ typedef struct _usual {
34
+ VALUE *vhead;
35
+ VALUE *vtail;
36
+ VALUE *vend;
37
+
38
+ Col chead;
39
+ Col ctail;
40
+ Col cend;
41
+
42
+ Key khead;
43
+ Key ktail;
44
+ Key kend;
45
+
46
+ VALUE (*get_key)(struct _ojParser *p, Key kp);
47
+ struct _cache *key_cache; // same as str_cache or sym_cache
48
+ struct _cache *str_cache;
49
+ struct _cache *sym_cache;
50
+ struct _cache *class_cache;
51
+ struct _cache *attr_cache;
52
+
53
+ VALUE array_class;
54
+ VALUE hash_class;
55
+
56
+ char *create_id;
57
+ uint8_t create_id_len;
58
+ uint8_t cache_str;
59
+ uint8_t cache_xrate;
60
+ uint8_t miss_class;
61
+ bool cache_keys;
62
+ bool ignore_json_create;
63
+ bool raise_on_empty;
64
+ } *Usual;
65
+
66
+ // Initialize the parser with the usual delegate. If the usual delegate is
67
+ // wrapped then this function is called first and then the parser functions
68
+ // can be replaced.
69
+ extern void oj_init_usual(struct _ojParser *p, Usual d);
data/ext/oj/util.c CHANGED
@@ -1,4 +1,5 @@
1
- // Copyright (c) 2019, Peter Ohler, All rights reserved.
1
+ // Copyright (c) 2019 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
2
3
 
3
4
  #include "util.h"
4
5
 
@@ -8,129 +9,128 @@
8
9
  #include <string.h>
9
10
  #include <time.h>
10
11
 
11
- #define SECS_PER_DAY 86400LL
12
- #define SECS_PER_YEAR 31536000LL
13
- #define SECS_PER_LEAP 31622400LL
14
- #define SECS_PER_QUAD_YEAR (SECS_PER_YEAR * 3 + SECS_PER_LEAP)
15
- #define SECS_PER_CENT (SECS_PER_QUAD_YEAR * 24 + SECS_PER_YEAR * 4)
16
- #define SECS_PER_LEAP_CENT (SECS_PER_CENT + SECS_PER_DAY)
17
- #define SECS_PER_QUAD_CENT (SECS_PER_CENT * 4 + SECS_PER_DAY)
12
+ #define SECS_PER_DAY 86400LL
13
+ #define SECS_PER_YEAR 31536000LL
14
+ #define SECS_PER_LEAP 31622400LL
15
+ #define SECS_PER_QUAD_YEAR (SECS_PER_YEAR * 3 + SECS_PER_LEAP)
16
+ #define SECS_PER_CENT (SECS_PER_QUAD_YEAR * 24 + SECS_PER_YEAR * 4)
17
+ #define SECS_PER_LEAP_CENT (SECS_PER_CENT + SECS_PER_DAY)
18
+ #define SECS_PER_QUAD_CENT (SECS_PER_CENT * 4 + SECS_PER_DAY)
18
19
 
19
- static int64_t eom_secs[] = {
20
- 2678400, // January (31)
21
- 5097600, // February (28) 2419200 2505600
22
- 7776000, // March (31)
23
- 10368000, // April (30 2592000
24
- 13046400, // May (31)
25
- 15638400, // June (30)
26
- 18316800, // July (31)
27
- 20995200, // August (31)
28
- 23587200, // September (30)
29
- 26265600, // October (31)
30
- 28857600, // November (30)
31
- 31536000, // December (31)
20
+ static int64_t eom_secs[] = {
21
+ 2678400, // January (31)
22
+ 5097600, // February (28) 2419200 2505600
23
+ 7776000, // March (31)
24
+ 10368000, // April (30 2592000
25
+ 13046400, // May (31)
26
+ 15638400, // June (30)
27
+ 18316800, // July (31)
28
+ 20995200, // August (31)
29
+ 23587200, // September (30)
30
+ 26265600, // October (31)
31
+ 28857600, // November (30)
32
+ 31536000, // December (31)
32
33
  };
33
34
 
34
- static int64_t eom_leap_secs[] = {
35
- 2678400, // January (31)
36
- 5184000, // February (28) 2419200 2505600
37
- 7862400, // March (31)
38
- 10454400, // April (30 2592000
39
- 13132800, // May (31)
40
- 15724800, // June (30)
41
- 18403200, // July (31)
42
- 21081600, // August (31)
43
- 23673600, // September (30)
44
- 26352000, // October (31)
45
- 28944000, // November (30)
46
- 31622400, // December (31)
35
+ static int64_t eom_leap_secs[] = {
36
+ 2678400, // January (31)
37
+ 5184000, // February (28) 2419200 2505600
38
+ 7862400, // March (31)
39
+ 10454400, // April (30 2592000
40
+ 13132800, // May (31)
41
+ 15724800, // June (30)
42
+ 18403200, // July (31)
43
+ 21081600, // August (31)
44
+ 23673600, // September (30)
45
+ 26352000, // October (31)
46
+ 28944000, // November (30)
47
+ 31622400, // December (31)
47
48
  };
48
49
 
50
+ void sec_as_time(int64_t secs, TimeInfo ti) {
51
+ int64_t qc = 0;
52
+ int64_t c = 0;
53
+ int64_t qy = 0;
54
+ int64_t y = 0;
55
+ bool leap = false;
56
+ int64_t *ms;
57
+ int m;
58
+ int shift = 0;
49
59
 
50
- void
51
- sec_as_time(int64_t secs, TimeInfo ti) {
52
- int64_t qc = 0;
53
- int64_t c = 0;
54
- int64_t qy = 0;
55
- int64_t y = 0;
56
- bool leap = false;
57
- int64_t *ms;
58
- int m;
59
- int shift = 0;
60
-
61
- secs += 62167219200LL; // normalize to first day of the year 0
60
+ secs += 62167219200LL; // normalize to first day of the year 0
62
61
  if (secs < 0) {
63
- shift = -secs / SECS_PER_QUAD_CENT;
64
- shift++;
65
- secs += shift * SECS_PER_QUAD_CENT;
62
+ shift = -secs / SECS_PER_QUAD_CENT;
63
+ shift++;
64
+ secs += shift * SECS_PER_QUAD_CENT;
66
65
  }
67
- qc = secs / SECS_PER_QUAD_CENT;
66
+ qc = secs / SECS_PER_QUAD_CENT;
68
67
  secs = secs - qc * SECS_PER_QUAD_CENT;
69
68
  if (secs < SECS_PER_LEAP) {
70
- leap = true;
69
+ leap = true;
71
70
  } else if (secs < SECS_PER_QUAD_YEAR) {
72
- if (SECS_PER_LEAP <= secs) {
73
- secs -= SECS_PER_LEAP;
74
- y = secs / SECS_PER_YEAR;
75
- secs = secs - y * SECS_PER_YEAR;
76
- y++;
77
- leap = false;
78
- }
79
- } else if (secs < SECS_PER_LEAP_CENT) { // first century in 400 years is a leap century (one extra day)
80
- qy = secs / SECS_PER_QUAD_YEAR;
81
- secs = secs - qy * SECS_PER_QUAD_YEAR;
82
- if (secs < SECS_PER_LEAP) {
83
- leap = true;
84
- } else {
85
- secs -= SECS_PER_LEAP;
86
- y = secs / SECS_PER_YEAR;
87
- secs = secs - y * SECS_PER_YEAR;
88
- y++;
89
- }
71
+ if (SECS_PER_LEAP <= secs) {
72
+ secs -= SECS_PER_LEAP;
73
+ y = secs / SECS_PER_YEAR;
74
+ secs = secs - y * SECS_PER_YEAR;
75
+ y++;
76
+ leap = false;
77
+ }
78
+ } else if (secs < SECS_PER_LEAP_CENT) { // first century in 400 years is a leap century (one
79
+ // extra day)
80
+ qy = secs / SECS_PER_QUAD_YEAR;
81
+ secs = secs - qy * SECS_PER_QUAD_YEAR;
82
+ if (secs < SECS_PER_LEAP) {
83
+ leap = true;
84
+ } else {
85
+ secs -= SECS_PER_LEAP;
86
+ y = secs / SECS_PER_YEAR;
87
+ secs = secs - y * SECS_PER_YEAR;
88
+ y++;
89
+ }
90
90
  } else {
91
- secs -= SECS_PER_LEAP_CENT;
92
- c = secs / SECS_PER_CENT;
93
- secs = secs - c * SECS_PER_CENT;
94
- c++;
95
- if (secs < SECS_PER_YEAR * 4) {
96
- y = secs / SECS_PER_YEAR;
97
- secs = secs - y * SECS_PER_YEAR;
98
- } else {
99
- secs -= SECS_PER_YEAR * 4;
100
- qy = secs / SECS_PER_QUAD_YEAR;
101
- secs = secs - qy * SECS_PER_QUAD_YEAR;
102
- qy++;
103
- if (secs < SECS_PER_LEAP) {
104
- leap = true;
105
- } else {
106
- secs -= SECS_PER_LEAP;
107
- y = secs / SECS_PER_YEAR;
108
- secs = secs - y * SECS_PER_YEAR;
109
- y++;
110
- }
111
- }
91
+ secs -= SECS_PER_LEAP_CENT;
92
+ c = secs / SECS_PER_CENT;
93
+ secs = secs - c * SECS_PER_CENT;
94
+ c++;
95
+ if (secs < SECS_PER_YEAR * 4) {
96
+ y = secs / SECS_PER_YEAR;
97
+ secs = secs - y * SECS_PER_YEAR;
98
+ } else {
99
+ secs -= SECS_PER_YEAR * 4;
100
+ qy = secs / SECS_PER_QUAD_YEAR;
101
+ secs = secs - qy * SECS_PER_QUAD_YEAR;
102
+ qy++;
103
+ if (secs < SECS_PER_LEAP) {
104
+ leap = true;
105
+ } else {
106
+ secs -= SECS_PER_LEAP;
107
+ y = secs / SECS_PER_YEAR;
108
+ secs = secs - y * SECS_PER_YEAR;
109
+ y++;
110
+ }
111
+ }
112
112
  }
113
- ti->year = (qc - shift) * 400 + c * 100 + qy * 4 + y;
113
+ ti->year = (int)((qc - (int64_t)shift) * 400 + c * 100 + qy * 4 + y);
114
114
  if (leap) {
115
- ms = eom_leap_secs;
115
+ ms = eom_leap_secs;
116
116
  } else {
117
- ms = eom_secs;
117
+ ms = eom_secs;
118
118
  }
119
119
  for (m = 1; m <= 12; m++, ms++) {
120
- if (secs < *ms) {
121
- if (1 < m) {
122
- secs -= *(ms - 1);
123
- }
124
- ti->mon = m;
125
- break;
126
- }
120
+ if (secs < *ms) {
121
+ if (1 < m) {
122
+ secs -= *(ms - 1);
123
+ }
124
+ ti->mon = m;
125
+ break;
126
+ }
127
127
  }
128
- ti->day = secs / 86400LL;
129
- secs = secs - (int64_t)ti->day * 86400LL;
128
+ ti->day = (int)(secs / 86400LL);
129
+ secs = secs - (int64_t)ti->day * 86400LL;
130
130
  ti->day++;
131
- ti->hour = secs / 3600LL;
132
- secs = secs - (int64_t)ti->hour * 3600LL;
133
- ti->min = secs / 60LL;
134
- secs = secs - (int64_t)ti->min * 60LL;
135
- ti->sec = secs;
131
+ ti->hour = (int)(secs / 3600LL);
132
+ secs = secs - (int64_t)ti->hour * 3600LL;
133
+ ti->min = (int)(secs / 60LL);
134
+ secs = secs - (int64_t)ti->min * 60LL;
135
+ ti->sec = (int)secs;
136
136
  }
data/ext/oj/util.h CHANGED
@@ -1,4 +1,5 @@
1
- // Copyright (c) 2019, Peter Ohler, All rights reserved.
1
+ // Copyright (c) 2019 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
2
3
 
3
4
  #ifndef OJ_UTIL_H
4
5
  #define OJ_UTIL_H
@@ -12,8 +13,8 @@ typedef struct _timeInfo {
12
13
  int day;
13
14
  int mon;
14
15
  int year;
15
- } *TimeInfo;
16
+ }* TimeInfo;
16
17
 
17
- extern void sec_as_time(int64_t secs, TimeInfo ti);
18
+ extern void sec_as_time(int64_t secs, TimeInfo ti);
18
19
 
19
20
  #endif /* OJ_UTIL_H */
data/ext/oj/val_stack.c CHANGED
@@ -1,46 +1,19 @@
1
- /* val_stack.c
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
- */
1
+ // Copyright (c) 2011 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
3
+
4
+ #include "val_stack.h"
30
5
 
31
6
  #include <string.h>
32
7
 
33
- #include "oj.h"
34
8
  #include "odd.h"
35
- #include "val_stack.h"
9
+ #include "oj.h"
36
10
 
37
- static void
38
- mark(void *ptr) {
39
- ValStack stack = (ValStack)ptr;
40
- Val v;
11
+ static void stack_mark(void *ptr) {
12
+ ValStack stack = (ValStack)ptr;
13
+ Val v;
41
14
 
42
- if (0 == ptr) {
43
- return;
15
+ if (NULL == ptr) {
16
+ return;
44
17
  }
45
18
  #ifdef HAVE_PTHREAD_MUTEX_INIT
46
19
  pthread_mutex_lock(&stack->mutex);
@@ -49,22 +22,22 @@ mark(void *ptr) {
49
22
  rb_gc_mark(stack->mutex);
50
23
  #endif
51
24
  for (v = stack->head; v < stack->tail; v++) {
52
- if (Qnil != v->val && Qundef != v->val) {
53
- rb_gc_mark(v->val);
54
- }
55
- if (Qnil != v->key_val && Qundef != v->key_val) {
56
- rb_gc_mark(v->key_val);
57
- }
58
- if (NULL != v->odd_args) {
59
- VALUE *a;
60
- int i;
25
+ if (Qnil != v->val && Qundef != v->val) {
26
+ rb_gc_mark(v->val);
27
+ }
28
+ if (Qnil != v->key_val && Qundef != v->key_val) {
29
+ rb_gc_mark(v->key_val);
30
+ }
31
+ if (NULL != v->odd_args) {
32
+ VALUE *a;
33
+ int i;
61
34
 
62
- for (i = v->odd_args->odd->attr_cnt, a = v->odd_args->args; 0 < i; i--, a++) {
63
- if (Qnil != *a) {
64
- rb_gc_mark(*a);
65
- }
66
- }
67
- }
35
+ for (i = v->odd_args->odd->attr_cnt, a = v->odd_args->args; 0 < i; i--, a++) {
36
+ if (Qnil != *a) {
37
+ rb_gc_mark(*a);
38
+ }
39
+ }
40
+ }
68
41
  }
69
42
  #ifdef HAVE_PTHREAD_MUTEX_INIT
70
43
  pthread_mutex_unlock(&stack->mutex);
@@ -73,46 +46,56 @@ mark(void *ptr) {
73
46
  #endif
74
47
  }
75
48
 
49
+ static const rb_data_type_t oj_stack_type = {
50
+ "Oj/stack",
51
+ {
52
+ stack_mark,
53
+ NULL,
54
+ NULL,
55
+ },
56
+ 0,
57
+ 0,
58
+ };
59
+
76
60
  VALUE
77
61
  oj_stack_init(ValStack stack) {
78
62
  #ifdef HAVE_PTHREAD_MUTEX_INIT
79
- int err;
63
+ int err;
80
64
 
81
65
  if (0 != (err = pthread_mutex_init(&stack->mutex, 0))) {
82
- rb_raise(rb_eException, "failed to initialize a mutex. %s", strerror(err));
66
+ rb_raise(rb_eException, "failed to initialize a mutex. %s", strerror(err));
83
67
  }
84
68
  #else
85
69
  stack->mutex = rb_mutex_new();
86
70
  #endif
87
- stack->head = stack->base;
88
- stack->end = stack->base + sizeof(stack->base) / sizeof(struct _val);
89
- stack->tail = stack->head;
90
- stack->head->val = Qundef;
91
- stack->head->key = NULL;
92
- stack->head->key_val = Qundef;
71
+ stack->head = stack->base;
72
+ stack->end = stack->base + sizeof(stack->base) / sizeof(struct _val);
73
+ stack->tail = stack->head;
74
+ stack->head->val = Qundef;
75
+ stack->head->key = NULL;
76
+ stack->head->key_val = Qundef;
93
77
  stack->head->classname = NULL;
94
- stack->head->odd_args = NULL;
95
- stack->head->clas = Qundef;
96
- stack->head->klen = 0;
97
- stack->head->clen = 0;
98
- stack->head->next = NEXT_NONE;
78
+ stack->head->odd_args = NULL;
79
+ stack->head->clas = Qundef;
80
+ stack->head->klen = 0;
81
+ stack->head->clen = 0;
82
+ stack->head->next = NEXT_NONE;
99
83
 
100
- return Data_Wrap_Struct(oj_cstack_class, mark, 0, stack);
84
+ return TypedData_Wrap_Struct(oj_cstack_class, &oj_stack_type, stack);
101
85
  }
102
86
 
103
- const char*
104
- oj_stack_next_string(ValNext n) {
87
+ const char *oj_stack_next_string(ValNext n) {
105
88
  switch (n) {
106
- case NEXT_ARRAY_NEW: return "array element or close";
107
- case NEXT_ARRAY_ELEMENT: return "array element";
108
- case NEXT_ARRAY_COMMA: return "comma";
109
- case NEXT_HASH_NEW: return "hash pair or close";
110
- case NEXT_HASH_KEY: return "hash key";
111
- case NEXT_HASH_COLON: return "colon";
112
- case NEXT_HASH_VALUE: return "hash value";
113
- case NEXT_HASH_COMMA: return "comma";
114
- case NEXT_NONE: break;
115
- default: break;
89
+ case NEXT_ARRAY_NEW: return "array element or close";
90
+ case NEXT_ARRAY_ELEMENT: return "array element";
91
+ case NEXT_ARRAY_COMMA: return "comma";
92
+ case NEXT_HASH_NEW: return "hash pair or close";
93
+ case NEXT_HASH_KEY: return "hash key";
94
+ case NEXT_HASH_COLON: return "colon";
95
+ case NEXT_HASH_VALUE: return "hash value";
96
+ case NEXT_HASH_COMMA: return "comma";
97
+ case NEXT_NONE: break;
98
+ default: break;
116
99
  }
117
100
  return "nothing";
118
101
  }