zscan 2.0.8 → 2.0.9

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 (167) hide show
  1. checksums.yaml +4 -4
  2. data/ext/pack/pack-27.c +1 -0
  3. data/ext/pack/pack.c +1 -0
  4. data/ext/pack/ruby/backward/2/assume.h +43 -0
  5. data/ext/pack/ruby/backward/2/attributes.h +157 -0
  6. data/ext/pack/ruby/backward/2/bool.h +37 -0
  7. data/ext/pack/ruby/backward/2/extern.h +46 -0
  8. data/ext/pack/ruby/backward/2/gcc_version_since.h +38 -0
  9. data/ext/pack/ruby/backward/2/inttypes.h +132 -0
  10. data/ext/pack/ruby/backward/2/limits.h +100 -0
  11. data/ext/pack/ruby/backward/2/long_long.h +65 -0
  12. data/ext/pack/ruby/backward/2/r_cast.h +27 -0
  13. data/ext/pack/ruby/backward/2/rmodule.h +31 -0
  14. data/ext/pack/ruby/backward/2/stdalign.h +30 -0
  15. data/ext/pack/ruby/backward/2/stdarg.h +47 -0
  16. data/ext/pack/ruby/backward/classext.h +25 -0
  17. data/ext/pack/ruby/backward/rubyio.h +18 -0
  18. data/ext/pack/ruby/backward/rubysig.h +26 -0
  19. data/ext/pack/ruby/backward/st.h +18 -0
  20. data/ext/pack/ruby/backward/util.h +18 -0
  21. data/ext/pack/ruby/internal/anyargs.h +375 -0
  22. data/ext/pack/ruby/internal/arithmetic.h +38 -0
  23. data/ext/pack/ruby/internal/arithmetic/char.h +58 -0
  24. data/ext/pack/ruby/internal/arithmetic/double.h +39 -0
  25. data/ext/pack/ruby/internal/arithmetic/fixnum.h +44 -0
  26. data/ext/pack/ruby/internal/arithmetic/gid_t.h +34 -0
  27. data/ext/pack/ruby/internal/arithmetic/int.h +163 -0
  28. data/ext/pack/ruby/internal/arithmetic/intptr_t.h +42 -0
  29. data/ext/pack/ruby/internal/arithmetic/long.h +244 -0
  30. data/ext/pack/ruby/internal/arithmetic/long_long.h +53 -0
  31. data/ext/pack/ruby/internal/arithmetic/mode_t.h +34 -0
  32. data/ext/pack/ruby/internal/arithmetic/off_t.h +49 -0
  33. data/ext/pack/ruby/internal/arithmetic/pid_t.h +34 -0
  34. data/ext/pack/ruby/internal/arithmetic/short.h +54 -0
  35. data/ext/pack/ruby/internal/arithmetic/size_t.h +51 -0
  36. data/ext/pack/ruby/internal/arithmetic/st_data_t.h +59 -0
  37. data/ext/pack/ruby/internal/arithmetic/uid_t.h +34 -0
  38. data/ext/pack/ruby/internal/assume.h +90 -0
  39. data/ext/pack/ruby/internal/attr/alloc_size.h +32 -0
  40. data/ext/pack/ruby/internal/attr/artificial.h +46 -0
  41. data/ext/pack/ruby/internal/attr/cold.h +37 -0
  42. data/ext/pack/ruby/internal/attr/const.h +46 -0
  43. data/ext/pack/ruby/internal/attr/constexpr.h +85 -0
  44. data/ext/pack/ruby/internal/attr/deprecated.h +59 -0
  45. data/ext/pack/ruby/internal/attr/diagnose_if.h +42 -0
  46. data/ext/pack/ruby/internal/attr/enum_extensibility.h +32 -0
  47. data/ext/pack/ruby/internal/attr/error.h +32 -0
  48. data/ext/pack/ruby/internal/attr/flag_enum.h +33 -0
  49. data/ext/pack/ruby/internal/attr/forceinline.h +40 -0
  50. data/ext/pack/ruby/internal/attr/format.h +38 -0
  51. data/ext/pack/ruby/internal/attr/maybe_unused.h +38 -0
  52. data/ext/pack/ruby/internal/attr/noalias.h +58 -0
  53. data/ext/pack/ruby/internal/attr/nodiscard.h +45 -0
  54. data/ext/pack/ruby/internal/attr/noexcept.h +91 -0
  55. data/ext/pack/ruby/internal/attr/noinline.h +35 -0
  56. data/ext/pack/ruby/internal/attr/nonnull.h +32 -0
  57. data/ext/pack/ruby/internal/attr/noreturn.h +48 -0
  58. data/ext/pack/ruby/internal/attr/pure.h +43 -0
  59. data/ext/pack/ruby/internal/attr/restrict.h +45 -0
  60. data/ext/pack/ruby/internal/attr/returns_nonnull.h +37 -0
  61. data/ext/pack/ruby/internal/attr/warning.h +32 -0
  62. data/ext/pack/ruby/internal/attr/weakref.h +32 -0
  63. data/ext/pack/ruby/internal/cast.h +53 -0
  64. data/ext/pack/ruby/internal/compiler_is.h +45 -0
  65. data/ext/pack/ruby/internal/compiler_is/apple.h +41 -0
  66. data/ext/pack/ruby/internal/compiler_is/clang.h +38 -0
  67. data/ext/pack/ruby/internal/compiler_is/gcc.h +46 -0
  68. data/ext/pack/ruby/internal/compiler_is/intel.h +41 -0
  69. data/ext/pack/ruby/internal/compiler_is/msvc.h +57 -0
  70. data/ext/pack/ruby/internal/compiler_is/sunpro.h +55 -0
  71. data/ext/pack/ruby/internal/compiler_since.h +61 -0
  72. data/ext/pack/ruby/internal/config.h +131 -0
  73. data/ext/pack/ruby/internal/constant_p.h +37 -0
  74. data/ext/pack/ruby/internal/core.h +35 -0
  75. data/ext/pack/ruby/internal/core/rarray.h +275 -0
  76. data/ext/pack/ruby/internal/core/rbasic.h +85 -0
  77. data/ext/pack/ruby/internal/core/rbignum.h +51 -0
  78. data/ext/pack/ruby/internal/core/rclass.h +47 -0
  79. data/ext/pack/ruby/internal/core/rdata.h +174 -0
  80. data/ext/pack/ruby/internal/core/rfile.h +36 -0
  81. data/ext/pack/ruby/internal/core/rhash.h +62 -0
  82. data/ext/pack/ruby/internal/core/rmatch.h +73 -0
  83. data/ext/pack/ruby/internal/core/robject.h +97 -0
  84. data/ext/pack/ruby/internal/core/rregexp.h +84 -0
  85. data/ext/pack/ruby/internal/core/rstring.h +215 -0
  86. data/ext/pack/ruby/internal/core/rstruct.h +73 -0
  87. data/ext/pack/ruby/internal/core/rtypeddata.h +184 -0
  88. data/ext/pack/ruby/internal/ctype.h +203 -0
  89. data/ext/pack/ruby/internal/dllexport.h +92 -0
  90. data/ext/pack/ruby/internal/dosish.h +63 -0
  91. data/ext/pack/ruby/internal/error.h +74 -0
  92. data/ext/pack/ruby/internal/eval.h +50 -0
  93. data/ext/pack/ruby/internal/event.h +75 -0
  94. data/ext/pack/ruby/internal/fl_type.h +469 -0
  95. data/ext/pack/ruby/internal/gc.h +35 -0
  96. data/ext/pack/ruby/internal/glob.h +35 -0
  97. data/ext/pack/ruby/internal/globals.h +159 -0
  98. data/ext/pack/ruby/internal/has/attribute.h +164 -0
  99. data/ext/pack/ruby/internal/has/builtin.h +105 -0
  100. data/ext/pack/ruby/internal/has/c_attribute.h +38 -0
  101. data/ext/pack/ruby/internal/has/cpp_attribute.h +79 -0
  102. data/ext/pack/ruby/internal/has/declspec_attribute.h +48 -0
  103. data/ext/pack/ruby/internal/has/extension.h +33 -0
  104. data/ext/pack/ruby/internal/has/feature.h +31 -0
  105. data/ext/pack/ruby/internal/has/warning.h +31 -0
  106. data/ext/pack/ruby/internal/intern/array.h +78 -0
  107. data/ext/pack/ruby/internal/intern/bignum.h +105 -0
  108. data/ext/pack/ruby/internal/intern/class.h +57 -0
  109. data/ext/pack/ruby/internal/intern/compar.h +34 -0
  110. data/ext/pack/ruby/internal/intern/complex.h +60 -0
  111. data/ext/pack/ruby/internal/intern/cont.h +40 -0
  112. data/ext/pack/ruby/internal/intern/dir.h +33 -0
  113. data/ext/pack/ruby/internal/intern/enum.h +33 -0
  114. data/ext/pack/ruby/internal/intern/enumerator.h +79 -0
  115. data/ext/pack/ruby/internal/intern/error.h +82 -0
  116. data/ext/pack/ruby/internal/intern/eval.h +59 -0
  117. data/ext/pack/ruby/internal/intern/file.h +44 -0
  118. data/ext/pack/ruby/internal/intern/gc.h +57 -0
  119. data/ext/pack/ruby/internal/intern/hash.h +59 -0
  120. data/ext/pack/ruby/internal/intern/io.h +70 -0
  121. data/ext/pack/ruby/internal/intern/load.h +39 -0
  122. data/ext/pack/ruby/internal/intern/marshal.h +35 -0
  123. data/ext/pack/ruby/internal/intern/numeric.h +42 -0
  124. data/ext/pack/ruby/internal/intern/object.h +90 -0
  125. data/ext/pack/ruby/internal/intern/parse.h +64 -0
  126. data/ext/pack/ruby/internal/intern/proc.h +53 -0
  127. data/ext/pack/ruby/internal/intern/process.h +46 -0
  128. data/ext/pack/ruby/internal/intern/random.h +45 -0
  129. data/ext/pack/ruby/internal/intern/range.h +35 -0
  130. data/ext/pack/ruby/internal/intern/rational.h +46 -0
  131. data/ext/pack/ruby/internal/intern/re.h +50 -0
  132. data/ext/pack/ruby/internal/intern/ruby.h +37 -0
  133. data/ext/pack/ruby/internal/intern/select.h +52 -0
  134. data/ext/pack/ruby/internal/intern/select/largesize.h +103 -0
  135. data/ext/pack/ruby/internal/intern/select/posix.h +82 -0
  136. data/ext/pack/ruby/internal/intern/select/win32.h +124 -0
  137. data/ext/pack/ruby/internal/intern/signal.h +40 -0
  138. data/ext/pack/ruby/internal/intern/sprintf.h +43 -0
  139. data/ext/pack/ruby/internal/intern/string.h +290 -0
  140. data/ext/pack/ruby/internal/intern/struct.h +47 -0
  141. data/ext/pack/ruby/internal/intern/thread.h +76 -0
  142. data/ext/pack/ruby/internal/intern/time.h +52 -0
  143. data/ext/pack/ruby/internal/intern/variable.h +83 -0
  144. data/ext/pack/ruby/internal/intern/vm.h +77 -0
  145. data/ext/pack/ruby/internal/interpreter.h +94 -0
  146. data/ext/pack/ruby/internal/iterator.h +65 -0
  147. data/ext/pack/ruby/internal/memory.h +286 -0
  148. data/ext/pack/ruby/internal/method.h +39 -0
  149. data/ext/pack/ruby/internal/module.h +39 -0
  150. data/ext/pack/ruby/internal/newobj.h +73 -0
  151. data/ext/pack/ruby/internal/rgengc.h +199 -0
  152. data/ext/pack/ruby/internal/scan_args.h +394 -0
  153. data/ext/pack/ruby/internal/special_consts.h +204 -0
  154. data/ext/pack/ruby/internal/static_assert.h +77 -0
  155. data/ext/pack/ruby/internal/stdalign.h +124 -0
  156. data/ext/pack/ruby/internal/stdbool.h +51 -0
  157. data/ext/pack/ruby/internal/symbol.h +114 -0
  158. data/ext/pack/ruby/internal/token_paste.h +75 -0
  159. data/ext/pack/ruby/internal/value.h +66 -0
  160. data/ext/pack/ruby/internal/value_type.h +354 -0
  161. data/ext/pack/ruby/internal/variable.h +62 -0
  162. data/ext/pack/ruby/internal/warning_push.h +91 -0
  163. data/ext/pack/ruby/internal/xmalloc.h +201 -0
  164. data/lib/zscan.rb +1 -1
  165. data/readme.md +2 -0
  166. data/zscan.gemspec +1 -1
  167. metadata +162 -2
@@ -0,0 +1,286 @@
1
+ #ifndef RBIMPL_MEMORY_H /*-*-C++-*-vi:se ft=cpp:*/
2
+ #define RBIMPL_MEMORY_H
3
+ /**
4
+ * @file
5
+ * @author Ruby developers <ruby-core@ruby-lang.org>
6
+ * @copyright This file is a part of the programming language Ruby.
7
+ * Permission is hereby granted, to either redistribute and/or
8
+ * modify this file, provided that the conditions mentioned in the
9
+ * file COPYING are met. Consult the file for details.
10
+ * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are
11
+ * implementation details. Don't take them as canon. They could
12
+ * rapidly appear then vanish. The name (path) of this header file
13
+ * is also an implementation detail. Do not expect it to persist
14
+ * at the place it is now. Developers are free to move it anywhere
15
+ * anytime at will.
16
+ * @note To ruby-core: remember that this header can be possibly
17
+ * recursively included from extension libraries written in C++.
18
+ * Do not expect for instance `__VA_ARGS__` is always available.
19
+ * We assume C99 for ruby itself but we don't assume languages of
20
+ * extension libraries. They could be written in C++98.
21
+ * @brief Memory management stuff.
22
+ */
23
+ #include "ruby/internal/config.h"
24
+
25
+ #ifdef STDC_HEADERS
26
+ # include <stddef.h>
27
+ #endif
28
+
29
+ #ifdef HAVE_STRING_H
30
+ # include <string.h>
31
+ #endif
32
+
33
+ #ifdef HAVE_STDINT_H
34
+ # include <stdint.h>
35
+ #endif
36
+
37
+ #ifdef HAVE_ALLOCA_H
38
+ # include <alloca.h>
39
+ #endif
40
+
41
+ #if defined(_MSC_VER) && defined(_WIN64)
42
+ # include <intrin.h>
43
+ # pragma intrinsic(_umul128)
44
+ #endif
45
+
46
+ #include "ruby/internal/attr/alloc_size.h"
47
+ #include "ruby/internal/attr/const.h"
48
+ #include "ruby/internal/attr/constexpr.h"
49
+ #include "ruby/internal/attr/noalias.h"
50
+ #include "ruby/internal/attr/nonnull.h"
51
+ #include "ruby/internal/attr/noreturn.h"
52
+ #include "ruby/internal/attr/restrict.h"
53
+ #include "ruby/internal/attr/returns_nonnull.h"
54
+ #include "ruby/internal/cast.h"
55
+ #include "ruby/internal/dllexport.h"
56
+ #include "ruby/internal/has/builtin.h"
57
+ #include "ruby/internal/stdalign.h"
58
+ #include "ruby/internal/stdbool.h"
59
+ #include "ruby/internal/xmalloc.h"
60
+ #include "ruby/backward/2/limits.h"
61
+ #include "ruby/backward/2/long_long.h"
62
+ #include "ruby/backward/2/assume.h"
63
+ #include "ruby/defines.h"
64
+
65
+ /* Make alloca work the best possible way. */
66
+ #if defined(alloca)
67
+ # /* Take that. */
68
+ #elif RBIMPL_HAS_BUILTIN(__builtin_alloca)
69
+ # define alloca __builtin_alloca
70
+ #elif defined(_AIX)
71
+ # pragma alloca
72
+ #elif defined(__cplusplus)
73
+ extern "C" void *alloca(size_t);
74
+ #else
75
+ extern void *alloca();
76
+ #endif
77
+
78
+ #if defined(HAVE_INT128_T) && SIZEOF_SIZE_T <= 8
79
+ # define DSIZE_T uint128_t
80
+ #elif SIZEOF_SIZE_T * 2 <= SIZEOF_LONG_LONG
81
+ # define DSIZE_T unsigned LONG_LONG
82
+ #endif
83
+
84
+ #ifdef C_ALLOCA
85
+ # define RUBY_ALLOCV_LIMIT 0
86
+ #else
87
+ # define RUBY_ALLOCV_LIMIT 1024
88
+ #endif
89
+
90
+ #ifdef __GNUC__
91
+ #define RB_GC_GUARD(v) \
92
+ (*__extension__ ({ \
93
+ volatile VALUE *rb_gc_guarded_ptr = &(v); \
94
+ __asm__("" : : "m"(rb_gc_guarded_ptr)); \
95
+ rb_gc_guarded_ptr; \
96
+ }))
97
+ #elif defined _MSC_VER
98
+ #define RB_GC_GUARD(v) (*rb_gc_guarded_ptr(&(v)))
99
+ #else
100
+ #define HAVE_RB_GC_GUARDED_PTR_VAL 1
101
+ #define RB_GC_GUARD(v) (*rb_gc_guarded_ptr_val(&(v),(v)))
102
+ #endif
103
+
104
+ /* Casts needed because void* is NOT compaible with others in C++. */
105
+ #define RB_ALLOC_N(type,n) RBIMPL_CAST((type *)ruby_xmalloc2((n), sizeof(type)))
106
+ #define RB_ALLOC(type) RBIMPL_CAST((type *)ruby_xmalloc(sizeof(type)))
107
+ #define RB_ZALLOC_N(type,n) RBIMPL_CAST((type *)ruby_xcalloc((n), sizeof(type)))
108
+ #define RB_ZALLOC(type) (RB_ZALLOC_N(type, 1))
109
+ #define RB_REALLOC_N(var,type,n) \
110
+ ((var) = RBIMPL_CAST((type *)ruby_xrealloc2((void *)(var), (n), sizeof(type))))
111
+
112
+ /* I don't know why but __builtin_alloca_with_align's second argument
113
+ takes bits rather than bytes. */
114
+ #if RBIMPL_HAS_BUILTIN(__builtin_alloca_with_align)
115
+ # define ALLOCA_N(type, n) \
116
+ RBIMPL_CAST((type *) \
117
+ __builtin_alloca_with_align( \
118
+ rbimpl_size_mul_or_raise(sizeof(type), (n)), \
119
+ RUBY_ALIGNOF(type) * CHAR_BIT))
120
+ #else
121
+ # define ALLOCA_N(type,n) \
122
+ RBIMPL_CAST((type *)alloca(rbimpl_size_mul_or_raise(sizeof(type), (n))))
123
+ #endif
124
+
125
+ /* allocates _n_ bytes temporary buffer and stores VALUE including it
126
+ * in _v_. _n_ may be evaluated twice. */
127
+ #define RB_ALLOCV(v, n) \
128
+ ((n) < RUBY_ALLOCV_LIMIT ? \
129
+ ((v) = 0, alloca(n)) : \
130
+ rb_alloc_tmp_buffer(&(v), (n)))
131
+ #define RB_ALLOCV_N(type, v, n) \
132
+ RBIMPL_CAST((type *) \
133
+ (((size_t)(n) < RUBY_ALLOCV_LIMIT / sizeof(type)) ? \
134
+ ((v) = 0, alloca((n) * sizeof(type))) : \
135
+ rb_alloc_tmp_buffer2(&(v), (n), sizeof(type))))
136
+ #define RB_ALLOCV_END(v) rb_free_tmp_buffer(&(v))
137
+
138
+ #define MEMZERO(p,type,n) memset((p), 0, rbimpl_size_mul_or_raise(sizeof(type), (n)))
139
+ #define MEMCPY(p1,p2,type,n) memcpy((p1), (p2), rbimpl_size_mul_or_raise(sizeof(type), (n)))
140
+ #define MEMMOVE(p1,p2,type,n) memmove((p1), (p2), rbimpl_size_mul_or_raise(sizeof(type), (n)))
141
+ #define MEMCMP(p1,p2,type,n) memcmp((p1), (p2), rbimpl_size_mul_or_raise(sizeof(type), (n)))
142
+
143
+ #define ALLOC_N RB_ALLOC_N
144
+ #define ALLOC RB_ALLOC
145
+ #define ZALLOC_N RB_ZALLOC_N
146
+ #define ZALLOC RB_ZALLOC
147
+ #define REALLOC_N RB_REALLOC_N
148
+ #define ALLOCV RB_ALLOCV
149
+ #define ALLOCV_N RB_ALLOCV_N
150
+ #define ALLOCV_END RB_ALLOCV_END
151
+
152
+ /* Expecting this struct to be eliminated by function inlinings */
153
+ struct rbimpl_size_mul_overflow_tag {
154
+ bool left;
155
+ size_t right;
156
+ };
157
+
158
+ RBIMPL_SYMBOL_EXPORT_BEGIN()
159
+ RBIMPL_ATTR_RESTRICT()
160
+ RBIMPL_ATTR_RETURNS_NONNULL()
161
+ RBIMPL_ATTR_ALLOC_SIZE((2))
162
+ void *rb_alloc_tmp_buffer(volatile VALUE *store, long len);
163
+
164
+ RBIMPL_ATTR_RESTRICT()
165
+ RBIMPL_ATTR_RETURNS_NONNULL()
166
+ RBIMPL_ATTR_ALLOC_SIZE((2,3))
167
+ void *rb_alloc_tmp_buffer_with_count(volatile VALUE *store, size_t len,size_t count);
168
+
169
+ void rb_free_tmp_buffer(volatile VALUE *store);
170
+
171
+ RBIMPL_ATTR_NORETURN()
172
+ void ruby_malloc_size_overflow(size_t, size_t);
173
+
174
+ #ifdef HAVE_RB_GC_GUARDED_PTR_VAL
175
+ volatile VALUE *rb_gc_guarded_ptr_val(volatile VALUE *ptr, VALUE val);
176
+ #endif
177
+ RBIMPL_SYMBOL_EXPORT_END()
178
+
179
+ #ifdef _MSC_VER
180
+ # pragma optimize("", off)
181
+
182
+ static inline volatile VALUE *
183
+ rb_gc_guarded_ptr(volatile VALUE *ptr)
184
+ {
185
+ return ptr;
186
+ }
187
+
188
+ # pragma optimize("", on)
189
+ #endif
190
+
191
+ /* Does anyone use it? Just here for backwards compatibility. */
192
+ static inline int
193
+ rb_mul_size_overflow(size_t a, size_t b, size_t max, size_t *c)
194
+ {
195
+ #ifdef DSIZE_T
196
+ RB_GNUC_EXTENSION DSIZE_T da, db, c2;
197
+ da = a;
198
+ db = b;
199
+ c2 = da * db;
200
+ if (c2 > max) return 1;
201
+ *c = RBIMPL_CAST((size_t)c2);
202
+ #else
203
+ if (b != 0 && a > max / b) return 1;
204
+ *c = a * b;
205
+ #endif
206
+ return 0;
207
+ }
208
+
209
+ #if RBIMPL_COMPILER_SINCE(GCC, 7, 0, 0)
210
+ RBIMPL_ATTR_CONSTEXPR(CXX14) /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70507 */
211
+ #elif RBIMPL_COMPILER_SINCE(Clang, 7, 0, 0)
212
+ RBIMPL_ATTR_CONSTEXPR(CXX14) /* https://bugs.llvm.org/show_bug.cgi?id=37633 */
213
+ #endif
214
+ RBIMPL_ATTR_CONST()
215
+ static inline struct rbimpl_size_mul_overflow_tag
216
+ rbimpl_size_mul_overflow(size_t x, size_t y)
217
+ {
218
+ struct rbimpl_size_mul_overflow_tag ret = { false, 0, };
219
+
220
+ #if RBIMPL_HAS_BUILTIN(__builtin_mul_overflow)
221
+ ret.left = __builtin_mul_overflow(x, y, &ret.right);
222
+
223
+ #elif defined(DSIZE_T)
224
+ RB_GNUC_EXTENSION DSIZE_T dx = x;
225
+ RB_GNUC_EXTENSION DSIZE_T dy = y;
226
+ RB_GNUC_EXTENSION DSIZE_T dz = dx * dy;
227
+ ret.left = dz > SIZE_MAX;
228
+ ret.right = RBIMPL_CAST((size_t)dz);
229
+
230
+ #elif defined(_MSC_VER) && defined(_WIN64)
231
+ unsigned __int64 dp = 0;
232
+ unsigned __int64 dz = _umul128(x, y, &dp);
233
+ ret.left = RBIMPL_CAST((bool)dp);
234
+ ret.right = RBIMPL_CAST((size_t)dz);
235
+
236
+ #else
237
+ /* https://wiki.sei.cmu.edu/confluence/display/c/INT30-C.+Ensure+that+unsigned+integer+operations+do+not+wrap */
238
+ ret.left = (y != 0) && (x > SIZE_MAX / y);
239
+ ret.right = x * y;
240
+ #endif
241
+
242
+ return ret;
243
+ }
244
+
245
+ static inline size_t
246
+ rbimpl_size_mul_or_raise(size_t x, size_t y)
247
+ {
248
+ struct rbimpl_size_mul_overflow_tag size =
249
+ rbimpl_size_mul_overflow(x, y);
250
+
251
+ if (RB_LIKELY(! size.left)) {
252
+ return size.right;
253
+ }
254
+ else {
255
+ ruby_malloc_size_overflow(x, y);
256
+ RBIMPL_UNREACHABLE_RETURN(0);
257
+ }
258
+ }
259
+
260
+ static inline void *
261
+ rb_alloc_tmp_buffer2(volatile VALUE *store, long count, size_t elsize)
262
+ {
263
+ return rb_alloc_tmp_buffer_with_count(
264
+ store, rbimpl_size_mul_or_raise(count, elsize), count);
265
+ }
266
+
267
+ RBIMPL_ATTR_NOALIAS()
268
+ RBIMPL_ATTR_NONNULL((1))
269
+ RBIMPL_ATTR_RETURNS_NONNULL()
270
+ /* At least since 2004, glibc's <string.h> annotates memcpy to be
271
+ * __attribute__((__nonnull__(1, 2))). However it is safe to pass NULL to the
272
+ * source pointer, if n is 0. Let's wrap memcpy. */
273
+ static inline void *
274
+ ruby_nonempty_memcpy(void *dest, const void *src, size_t n)
275
+ {
276
+ if (n) {
277
+ return memcpy(dest, src, n);
278
+ }
279
+ else {
280
+ return dest;
281
+ }
282
+ }
283
+ #undef memcpy
284
+ #define memcpy ruby_nonempty_memcpy
285
+
286
+ #endif /* RBIMPL_MEMORY_H */
@@ -0,0 +1,39 @@
1
+ #ifndef RBIMPL_METHOD_H /*-*-C++-*-vi:se ft=cpp:*/
2
+ #define RBIMPL_METHOD_H
3
+ /**
4
+ * @file
5
+ * @author Ruby developers <ruby-core@ruby-lang.org>
6
+ * @copyright This file is a part of the programming language Ruby.
7
+ * Permission is hereby granted, to either redistribute and/or
8
+ * modify this file, provided that the conditions mentioned in the
9
+ * file COPYING are met. Consult the file for details.
10
+ * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are
11
+ * implementation details. Don't take them as canon. They could
12
+ * rapidly appear then vanish. The name (path) of this header file
13
+ * is also an implementation detail. Do not expect it to persist
14
+ * at the place it is now. Developers are free to move it anywhere
15
+ * anytime at will.
16
+ * @note To ruby-core: remember that this header can be possibly
17
+ * recursively included from extension libraries written in C++.
18
+ * Do not expect for instance `__VA_ARGS__` is always available.
19
+ * We assume C99 for ruby itself but we don't assume languages of
20
+ * extension libraries. They could be written in C++98.
21
+ * @brief Creation and modification of Ruby methods.
22
+ */
23
+ #include "ruby/internal/dllexport.h"
24
+ #include "ruby/internal/value.h"
25
+ #include "ruby/backward/2/stdarg.h"
26
+
27
+ RBIMPL_SYMBOL_EXPORT_BEGIN()
28
+
29
+ void rb_define_method(VALUE,const char*,VALUE(*)(ANYARGS),int);
30
+ void rb_define_module_function(VALUE,const char*,VALUE(*)(ANYARGS),int);
31
+ void rb_define_global_function(const char*,VALUE(*)(ANYARGS),int);
32
+
33
+ void rb_undef_method(VALUE,const char*);
34
+ void rb_define_alias(VALUE,const char*,const char*);
35
+ void rb_define_attr(VALUE,const char*,int,int);
36
+
37
+ RBIMPL_SYMBOL_EXPORT_END()
38
+
39
+ #endif /* RBIMPL_METHOD_H */
@@ -0,0 +1,39 @@
1
+ #ifndef RBIMPL_MODULE_H /*-*-C++-*-vi:se ft=cpp:*/
2
+ #define RBIMPL_MODULE_H
3
+ /**
4
+ * @file
5
+ * @author Ruby developers <ruby-core@ruby-lang.org>
6
+ * @copyright This file is a part of the programming language Ruby.
7
+ * Permission is hereby granted, to either redistribute and/or
8
+ * modify this file, provided that the conditions mentioned in the
9
+ * file COPYING are met. Consult the file for details.
10
+ * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are
11
+ * implementation details. Don't take them as canon. They could
12
+ * rapidly appear then vanish. The name (path) of this header file
13
+ * is also an implementation detail. Do not expect it to persist
14
+ * at the place it is now. Developers are free to move it anywhere
15
+ * anytime at will.
16
+ * @note To ruby-core: remember that this header can be possibly
17
+ * recursively included from extension libraries written in C++.
18
+ * Do not expect for instance `__VA_ARGS__` is always available.
19
+ * We assume C99 for ruby itself but we don't assume languages of
20
+ * extension libraries. They could be written in C++98.
21
+ * @brief Creation and modification of Ruby modules.
22
+ */
23
+ #include "ruby/internal/dllexport.h"
24
+ #include "ruby/internal/value.h"
25
+
26
+ RBIMPL_SYMBOL_EXPORT_BEGIN()
27
+
28
+ VALUE rb_define_class(const char*,VALUE);
29
+ VALUE rb_define_module(const char*);
30
+ VALUE rb_define_class_under(VALUE, const char*, VALUE);
31
+ VALUE rb_define_module_under(VALUE, const char*);
32
+
33
+ void rb_include_module(VALUE,VALUE);
34
+ void rb_extend_object(VALUE,VALUE);
35
+ void rb_prepend_module(VALUE,VALUE);
36
+
37
+ RBIMPL_SYMBOL_EXPORT_END()
38
+
39
+ #endif /* RBIMPL_MODULE_H */
@@ -0,0 +1,73 @@
1
+ #ifndef RBIMPL_NEWOBJ_H /*-*-C++-*-vi:se ft=cpp:*/
2
+ #define RBIMPL_NEWOBJ_H
3
+ /**
4
+ * @file
5
+ * @author Ruby developers <ruby-core@ruby-lang.org>
6
+ * @copyright This file is a part of the programming language Ruby.
7
+ * Permission is hereby granted, to either redistribute and/or
8
+ * modify this file, provided that the conditions mentioned in the
9
+ * file COPYING are met. Consult the file for details.
10
+ * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are
11
+ * implementation details. Don't take them as canon. They could
12
+ * rapidly appear then vanish. The name (path) of this header file
13
+ * is also an implementation detail. Do not expect it to persist
14
+ * at the place it is now. Developers are free to move it anywhere
15
+ * anytime at will.
16
+ * @note To ruby-core: remember that this header can be possibly
17
+ * recursively included from extension libraries written in C++.
18
+ * Do not expect for instance `__VA_ARGS__` is always available.
19
+ * We assume C99 for ruby itself but we don't assume languages of
20
+ * extension libraries. They could be written in C++98.
21
+ * @brief Defines #NEWOBJ.
22
+ */
23
+ #include "ruby/internal/cast.h"
24
+ #include "ruby/internal/core/rbasic.h"
25
+ #include "ruby/internal/dllexport.h"
26
+ #include "ruby/internal/fl_type.h"
27
+ #include "ruby/internal/special_consts.h"
28
+ #include "ruby/internal/value.h"
29
+ #include "ruby/assert.h"
30
+
31
+ #define RB_NEWOBJ(obj,type) type *(obj) = RBIMPL_CAST((type *)rb_newobj())
32
+ #define RB_NEWOBJ_OF(obj,type,klass,flags) type *(obj) = RBIMPL_CAST((type *)rb_newobj_of(klass, flags))
33
+
34
+ #define NEWOBJ RB_NEWOBJ
35
+ #define NEWOBJ_OF RB_NEWOBJ_OF /* core has special NEWOBJ_OF() in internal.h */
36
+ #define OBJSETUP rb_obj_setup /* use NEWOBJ_OF instead of NEWOBJ()+OBJSETUP() */
37
+ #define CLONESETUP rb_clone_setup
38
+ #define DUPSETUP rb_dup_setup
39
+
40
+ RBIMPL_SYMBOL_EXPORT_BEGIN()
41
+ VALUE rb_newobj(void);
42
+ VALUE rb_newobj_of(VALUE, VALUE);
43
+ VALUE rb_obj_setup(VALUE obj, VALUE klass, VALUE type);
44
+ VALUE rb_obj_class(VALUE);
45
+ VALUE rb_singleton_class_clone(VALUE);
46
+ void rb_singleton_class_attached(VALUE,VALUE);
47
+ void rb_copy_generic_ivar(VALUE,VALUE);
48
+ RBIMPL_SYMBOL_EXPORT_END()
49
+
50
+ static inline void
51
+ rb_clone_setup(VALUE clone, VALUE obj)
52
+ {
53
+ RBIMPL_ASSERT_OR_ASSUME(! RB_SPECIAL_CONST_P(obj));
54
+ RBIMPL_ASSERT_OR_ASSUME(! RB_SPECIAL_CONST_P(clone));
55
+
56
+ const VALUE flags = RUBY_FL_PROMOTED0 | RUBY_FL_PROMOTED1 | RUBY_FL_FINALIZE;
57
+ rb_obj_setup(clone, rb_singleton_class_clone(obj),
58
+ RB_FL_TEST_RAW(obj, ~flags));
59
+ rb_singleton_class_attached(RBASIC_CLASS(clone), clone);
60
+ if (RB_FL_TEST(obj, RUBY_FL_EXIVAR)) rb_copy_generic_ivar(clone, obj);
61
+ }
62
+
63
+ static inline void
64
+ rb_dup_setup(VALUE dup, VALUE obj)
65
+ {
66
+ RBIMPL_ASSERT_OR_ASSUME(! RB_SPECIAL_CONST_P(obj));
67
+ RBIMPL_ASSERT_OR_ASSUME(! RB_SPECIAL_CONST_P(dup));
68
+
69
+ rb_obj_setup(dup, rb_obj_class(obj), RB_FL_TEST_RAW(obj, RUBY_FL_DUPPED));
70
+ if (RB_FL_TEST(obj, RUBY_FL_EXIVAR)) rb_copy_generic_ivar(dup, obj);
71
+ }
72
+
73
+ #endif /* RBIMPL_NEWOBJ_H */
@@ -0,0 +1,199 @@
1
+ #ifndef RBIMPL_RGENGC_H /*-*-C++-*-vi:se ft=cpp:*/
2
+ #define RBIMPL_RGENGC_H
3
+ /**
4
+ * @file
5
+ * @author Ruby developers <ruby-core@ruby-lang.org>
6
+ * @copyright This file is a part of the programming language Ruby.
7
+ * Permission is hereby granted, to either redistribute and/or
8
+ * modify this file, provided that the conditions mentioned in the
9
+ * file COPYING are met. Consult the file for details.
10
+ * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are
11
+ * implementation details. Don't take them as canon. They could
12
+ * rapidly appear then vanish. The name (path) of this header file
13
+ * is also an implementation detail. Do not expect it to persist
14
+ * at the place it is now. Developers are free to move it anywhere
15
+ * anytime at will.
16
+ * @note To ruby-core: remember that this header can be possibly
17
+ * recursively included from extension libraries written in C++.
18
+ * Do not expect for instance `__VA_ARGS__` is always available.
19
+ * We assume C99 for ruby itself but we don't assume languages of
20
+ * extension libraries. They could be written in C++98.
21
+ * @brief RGENGC write-barrier APIs.
22
+ * @see Sasada, K., "Gradual write-barrier insertion into a Ruby
23
+ * interpreter", in proceedings of the 2019 ACM SIGPLAN
24
+ * International Symposium on Memory Management (ISMM 2019), pp
25
+ * 115-121, 2019. https://doi.org/10.1145/3315573.3329986
26
+ */
27
+ #include "ruby/internal/attr/artificial.h"
28
+ #include "ruby/internal/attr/pure.h"
29
+ #include "ruby/internal/dllexport.h"
30
+ #include "ruby/internal/special_consts.h"
31
+ #include "ruby/internal/stdbool.h"
32
+ #include "ruby/internal/value.h"
33
+ #include "ruby/assert.h"
34
+ #include "ruby/backward/2/attributes.h"
35
+
36
+ #undef USE_RGENGC
37
+ #define USE_RGENGC 1
38
+
39
+ #ifndef USE_RINCGC
40
+ # define USE_RINCGC 1
41
+ #endif
42
+
43
+ #ifndef USE_RGENGC_LOGGING_WB_UNPROTECT
44
+ # define USE_RGENGC_LOGGING_WB_UNPROTECT 0
45
+ #endif
46
+
47
+ #ifndef RGENGC_WB_PROTECTED_ARRAY
48
+ # define RGENGC_WB_PROTECTED_ARRAY 1
49
+ #endif
50
+
51
+ #ifndef RGENGC_WB_PROTECTED_HASH
52
+ # define RGENGC_WB_PROTECTED_HASH 1
53
+ #endif
54
+
55
+ #ifndef RGENGC_WB_PROTECTED_STRUCT
56
+ # define RGENGC_WB_PROTECTED_STRUCT 1
57
+ #endif
58
+
59
+ #ifndef RGENGC_WB_PROTECTED_STRING
60
+ # define RGENGC_WB_PROTECTED_STRING 1
61
+ #endif
62
+
63
+ #ifndef RGENGC_WB_PROTECTED_OBJECT
64
+ # define RGENGC_WB_PROTECTED_OBJECT 1
65
+ #endif
66
+
67
+ #ifndef RGENGC_WB_PROTECTED_REGEXP
68
+ # define RGENGC_WB_PROTECTED_REGEXP 1
69
+ #endif
70
+
71
+ #ifndef RGENGC_WB_PROTECTED_CLASS
72
+ # define RGENGC_WB_PROTECTED_CLASS 1
73
+ #endif
74
+
75
+ #ifndef RGENGC_WB_PROTECTED_FLOAT
76
+ # define RGENGC_WB_PROTECTED_FLOAT 1
77
+ #endif
78
+
79
+ #ifndef RGENGC_WB_PROTECTED_COMPLEX
80
+ # define RGENGC_WB_PROTECTED_COMPLEX 1
81
+ #endif
82
+
83
+ #ifndef RGENGC_WB_PROTECTED_RATIONAL
84
+ # define RGENGC_WB_PROTECTED_RATIONAL 1
85
+ #endif
86
+
87
+ #ifndef RGENGC_WB_PROTECTED_BIGNUM
88
+ # define RGENGC_WB_PROTECTED_BIGNUM 1
89
+ #endif
90
+
91
+ #ifndef RGENGC_WB_PROTECTED_NODE_CREF
92
+ # define RGENGC_WB_PROTECTED_NODE_CREF 1
93
+ #endif
94
+
95
+ /**
96
+ * @name Write barrier (WB) interfaces:
97
+ * @{
98
+ *
99
+ * @note The following core interfaces can be changed in the future. Please
100
+ * catch up if you want to insert WB into C-extensions correctly.
101
+ */
102
+
103
+ /**
104
+ * WB for new reference from `a' to `b'. Write `b' into `*slot'. `slot' is a
105
+ * pointer in `a'.
106
+ */
107
+ #define RB_OBJ_WRITE(a, slot, b) \
108
+ RBIMPL_CAST(rb_obj_write((VALUE)(a), (VALUE *)(slot), (VALUE)(b), __FILE__, __LINE__))
109
+ /**
110
+ * WB for new reference from `a' to `b'. This doesn't write any values, but
111
+ * only a WB declaration. `oldv' is replaced value with `b' (not used in
112
+ * current Ruby).
113
+ */
114
+ #define RB_OBJ_WRITTEN(a, oldv, b) \
115
+ RBIMPL_CAST(rb_obj_written((VALUE)(a), (VALUE)(oldv), (VALUE)(b), __FILE__, __LINE__))
116
+ /** @} */
117
+
118
+ #define OBJ_PROMOTED_RAW RB_OBJ_PROMOTED_RAW
119
+ #define OBJ_PROMOTED RB_OBJ_PROMOTED
120
+ #define OBJ_WB_UNPROTECT RB_OBJ_WB_UNPROTECT
121
+
122
+ #define RB_OBJ_WB_UNPROTECT(x) rb_obj_wb_unprotect(x, __FILE__, __LINE__)
123
+ #define RB_OBJ_WB_UNPROTECT_FOR(type, obj) \
124
+ (RGENGC_WB_PROTECTED_##type ? OBJ_WB_UNPROTECT(obj) : obj)
125
+ #define RGENGC_LOGGING_WB_UNPROTECT rb_gc_unprotect_logging
126
+
127
+ /** @cond INTERNAL_MACRO */
128
+ #define RB_OBJ_PROMOTED_RAW RB_OBJ_PROMOTED_RAW
129
+ #define RB_OBJ_PROMOTED RB_OBJ_PROMOTED
130
+ /** @endcond */
131
+
132
+ RBIMPL_SYMBOL_EXPORT_BEGIN()
133
+ void rb_gc_writebarrier(VALUE a, VALUE b);
134
+ void rb_gc_writebarrier_unprotect(VALUE obj);
135
+ #if USE_RGENGC_LOGGING_WB_UNPROTECT
136
+ void rb_gc_unprotect_logging(void *objptr, const char *filename, int line);
137
+ #endif
138
+ RBIMPL_SYMBOL_EXPORT_END()
139
+
140
+ RBIMPL_ATTR_PURE_ON_NDEBUG()
141
+ RBIMPL_ATTR_ARTIFICIAL()
142
+ static inline bool
143
+ RB_OBJ_PROMOTED_RAW(VALUE obj)
144
+ {
145
+ RBIMPL_ASSERT_OR_ASSUME(RB_FL_ABLE(obj));
146
+ return RB_FL_ANY_RAW(obj, RUBY_FL_PROMOTED);
147
+ }
148
+
149
+ RBIMPL_ATTR_PURE_ON_NDEBUG()
150
+ RBIMPL_ATTR_ARTIFICIAL()
151
+ static inline bool
152
+ RB_OBJ_PROMOTED(VALUE obj)
153
+ {
154
+ if (! RB_FL_ABLE(obj)) {
155
+ return false;
156
+ }
157
+ else {
158
+ return RB_OBJ_PROMOTED_RAW(obj);
159
+ }
160
+ }
161
+
162
+ static inline VALUE
163
+ rb_obj_wb_unprotect(VALUE x, RB_UNUSED_VAR(const char *filename), RB_UNUSED_VAR(int line))
164
+ {
165
+ #if USE_RGENGC_LOGGING_WB_UNPROTECT
166
+ RGENGC_LOGGING_WB_UNPROTECT(RBIMPL_CAST((void *)x), filename, line);
167
+ #endif
168
+ rb_gc_writebarrier_unprotect(x);
169
+ return x;
170
+ }
171
+
172
+ static inline VALUE
173
+ rb_obj_written(VALUE a, RB_UNUSED_VAR(VALUE oldv), VALUE b, RB_UNUSED_VAR(const char *filename), RB_UNUSED_VAR(int line))
174
+ {
175
+ #if USE_RGENGC_LOGGING_WB_UNPROTECT
176
+ RGENGC_LOGGING_OBJ_WRITTEN(a, oldv, b, filename, line);
177
+ #endif
178
+
179
+ if (!RB_SPECIAL_CONST_P(b)) {
180
+ rb_gc_writebarrier(a, b);
181
+ }
182
+
183
+ return a;
184
+ }
185
+
186
+ static inline VALUE
187
+ rb_obj_write(VALUE a, VALUE *slot, VALUE b, RB_UNUSED_VAR(const char *filename), RB_UNUSED_VAR(int line))
188
+ {
189
+ #ifdef RGENGC_LOGGING_WRITE
190
+ RGENGC_LOGGING_WRITE(a, slot, b, filename, line);
191
+ #endif
192
+
193
+ *slot = b;
194
+
195
+ rb_obj_written(a, RUBY_Qundef /* ignore `oldv' now */, b, filename, line);
196
+ return a;
197
+ }
198
+
199
+ #endif /* RBIMPL_RGENGC_H */