zscan 2.0.8 → 2.0.9

Sign up to get free protection for your applications and to get access to all the features.
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,354 @@
1
+ #ifndef RBIMPL_VALUE_TYPE_H /*-*-C++-*-vi:se ft=cpp:*/
2
+ #define RBIMPL_VALUE_TYPE_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 enum ::ruby_value_type.
22
+ */
23
+ #include "ruby/internal/assume.h"
24
+ #include "ruby/internal/attr/artificial.h"
25
+ #include "ruby/internal/attr/cold.h"
26
+ #include "ruby/internal/attr/enum_extensibility.h"
27
+ #include "ruby/internal/attr/forceinline.h"
28
+ #include "ruby/internal/attr/pure.h"
29
+ #include "ruby/internal/cast.h"
30
+ #include "ruby/internal/constant_p.h"
31
+ #include "ruby/internal/core/rbasic.h"
32
+ #include "ruby/internal/dllexport.h"
33
+ #include "ruby/internal/has/builtin.h"
34
+ #include "ruby/internal/special_consts.h"
35
+ #include "ruby/internal/stdbool.h"
36
+ #include "ruby/internal/value.h"
37
+ #include "ruby/assert.h"
38
+
39
+ #if defined(T_DATA)
40
+ /*
41
+ * :!BEWARE!: (Recent?) Solaris' <nfs/nfs.h> have conflicting definition of
42
+ * T_DATA. Let us stop here. Please have a workaround like this:
43
+ *
44
+ * ```C
45
+ * #include <ruby/ruby.h> // <- Include this one first.
46
+ * #undef T_DATA // <- ... and stick to RUBY_T_DATA forever.
47
+ * #include <nfs/nfs.h> // <- OS-provided T_DATA introduced.
48
+ * ```
49
+ *
50
+ * See also [ruby-core:4261]
51
+ */
52
+ # error Bail out due to conflicting definition of T_DATA.
53
+ #endif
54
+
55
+ #define T_ARRAY RUBY_T_ARRAY
56
+ #define T_BIGNUM RUBY_T_BIGNUM
57
+ #define T_CLASS RUBY_T_CLASS
58
+ #define T_COMPLEX RUBY_T_COMPLEX
59
+ #define T_DATA RUBY_T_DATA
60
+ #define T_FALSE RUBY_T_FALSE
61
+ #define T_FILE RUBY_T_FILE
62
+ #define T_FIXNUM RUBY_T_FIXNUM
63
+ #define T_FLOAT RUBY_T_FLOAT
64
+ #define T_HASH RUBY_T_HASH
65
+ #define T_ICLASS RUBY_T_ICLASS
66
+ #define T_IMEMO RUBY_T_IMEMO
67
+ #define T_MASK RUBY_T_MASK
68
+ #define T_MATCH RUBY_T_MATCH
69
+ #define T_MODULE RUBY_T_MODULE
70
+ #define T_MOVED RUBY_T_MOVED
71
+ #define T_NIL RUBY_T_NIL
72
+ #define T_NODE RUBY_T_NODE
73
+ #define T_NONE RUBY_T_NONE
74
+ #define T_OBJECT RUBY_T_OBJECT
75
+ #define T_RATIONAL RUBY_T_RATIONAL
76
+ #define T_REGEXP RUBY_T_REGEXP
77
+ #define T_STRING RUBY_T_STRING
78
+ #define T_STRUCT RUBY_T_STRUCT
79
+ #define T_SYMBOL RUBY_T_SYMBOL
80
+ #define T_TRUE RUBY_T_TRUE
81
+ #define T_UNDEF RUBY_T_UNDEF
82
+ #define T_ZOMBIE RUBY_T_ZOMBIE
83
+
84
+ #define BUILTIN_TYPE RB_BUILTIN_TYPE
85
+ #define DYNAMIC_SYM_P RB_DYNAMIC_SYM_P
86
+ #define RB_INTEGER_TYPE_P rb_integer_type_p
87
+ #define SYMBOL_P RB_SYMBOL_P
88
+ #define rb_type_p RB_TYPE_P
89
+
90
+ /** @cond INTERNAL_MACRO */
91
+ #define RB_BUILTIN_TYPE RB_BUILTIN_TYPE
92
+ #define RB_DYNAMIC_SYM_P RB_DYNAMIC_SYM_P
93
+ #define RB_FLOAT_TYPE_P RB_FLOAT_TYPE_P
94
+ #define RB_SYMBOL_P RB_SYMBOL_P
95
+ #define RB_TYPE_P RB_TYPE_P
96
+ #define Check_Type Check_Type
97
+
98
+ #if RUBY_NDEBUG
99
+ # define RBIMPL_ASSERT_TYPE(v, t) RBIMPL_ASSERT_OR_ASSUME(RB_TYPE_P((v), (t)))
100
+ #else
101
+ # define RBIMPL_ASSERT_TYPE Check_Type
102
+ #endif
103
+ /** @endcond */
104
+
105
+ #define TYPE(_) RBIMPL_CAST((int)rb_type(_))
106
+
107
+ /** C-level type of an object. */
108
+ enum
109
+ RBIMPL_ATTR_ENUM_EXTENSIBILITY(closed)
110
+ ruby_value_type {
111
+ RUBY_T_NONE = 0x00, /**< Non-object (sweeped etc.) */
112
+
113
+ RUBY_T_OBJECT = 0x01, /**< @see struct ::RObject */
114
+ RUBY_T_CLASS = 0x02, /**< @see struct ::RClass and ::rb_cClass */
115
+ RUBY_T_MODULE = 0x03, /**< @see struct ::RClass and ::rb_cModule */
116
+ RUBY_T_FLOAT = 0x04, /**< @see struct ::RFloat */
117
+ RUBY_T_STRING = 0x05, /**< @see struct ::RString */
118
+ RUBY_T_REGEXP = 0x06, /**< @see struct ::RRegexp */
119
+ RUBY_T_ARRAY = 0x07, /**< @see struct ::RArray */
120
+ RUBY_T_HASH = 0x08, /**< @see struct ::RHash */
121
+ RUBY_T_STRUCT = 0x09, /**< @see struct ::RStruct */
122
+ RUBY_T_BIGNUM = 0x0a, /**< @see struct ::RBignum */
123
+ RUBY_T_FILE = 0x0b, /**< @see struct ::RFile */
124
+ RUBY_T_DATA = 0x0c, /**< @see struct ::RTypedData */
125
+ RUBY_T_MATCH = 0x0d, /**< @see struct ::RMatch */
126
+ RUBY_T_COMPLEX = 0x0e, /**< @see struct ::RComplex */
127
+ RUBY_T_RATIONAL = 0x0f, /**< @see struct ::RRational */
128
+
129
+ RUBY_T_NIL = 0x11, /**< @see ::RUBY_Qnil */
130
+ RUBY_T_TRUE = 0x12, /**< @see ::RUBY_Qfalse */
131
+ RUBY_T_FALSE = 0x13, /**< @see ::RUBY_Qtrue */
132
+ RUBY_T_SYMBOL = 0x14, /**< @see struct ::RSymbol */
133
+ RUBY_T_FIXNUM = 0x15, /**< Integers formerly known as Fixnums. */
134
+ RUBY_T_UNDEF = 0x16, /**< @see ::RUBY_Qundef */
135
+
136
+ RUBY_T_IMEMO = 0x1a, /**< @see struct ::RIMemo */
137
+ RUBY_T_NODE = 0x1b, /**< @see struct ::RNode */
138
+ RUBY_T_ICLASS = 0x1c, /**< Hidden classes known as IClasses. */
139
+ RUBY_T_ZOMBIE = 0x1d, /**< @see struct ::RZombie */
140
+ RUBY_T_MOVED = 0x1e, /**< @see struct ::RMoved */
141
+
142
+ RUBY_T_MASK = 0x1f
143
+ };
144
+
145
+ RBIMPL_SYMBOL_EXPORT_BEGIN()
146
+ RBIMPL_ATTR_COLD()
147
+ void rb_check_type(VALUE obj, int t);
148
+ RBIMPL_SYMBOL_EXPORT_END()
149
+
150
+ RBIMPL_ATTR_PURE_ON_NDEBUG()
151
+ RBIMPL_ATTR_ARTIFICIAL()
152
+ static inline enum ruby_value_type
153
+ RB_BUILTIN_TYPE(VALUE obj)
154
+ {
155
+ RBIMPL_ASSERT_OR_ASSUME(! RB_SPECIAL_CONST_P(obj));
156
+
157
+ VALUE ret = RBASIC(obj)->flags & RUBY_T_MASK;
158
+ return RBIMPL_CAST((enum ruby_value_type)ret);
159
+ }
160
+
161
+ RBIMPL_ATTR_PURE_ON_NDEBUG()
162
+ static inline bool
163
+ rb_integer_type_p(VALUE obj)
164
+ {
165
+ if (RB_FIXNUM_P(obj)) {
166
+ return true;
167
+ }
168
+ else if (RB_SPECIAL_CONST_P(obj)) {
169
+ return false;
170
+ }
171
+ else {
172
+ return RB_BUILTIN_TYPE(obj) == RUBY_T_BIGNUM;
173
+ }
174
+ }
175
+
176
+ RBIMPL_ATTR_PURE_ON_NDEBUG()
177
+ static inline enum ruby_value_type
178
+ rb_type(VALUE obj)
179
+ {
180
+ if (! RB_SPECIAL_CONST_P(obj)) {
181
+ return RB_BUILTIN_TYPE(obj);
182
+ }
183
+ else if (obj == RUBY_Qfalse) {
184
+ return RUBY_T_FALSE;
185
+ }
186
+ else if (obj == RUBY_Qnil) {
187
+ return RUBY_T_NIL;
188
+ }
189
+ else if (obj == RUBY_Qtrue) {
190
+ return RUBY_T_TRUE;
191
+ }
192
+ else if (obj == RUBY_Qundef) {
193
+ return RUBY_T_UNDEF;
194
+ }
195
+ else if (RB_FIXNUM_P(obj)) {
196
+ return RUBY_T_FIXNUM;
197
+ }
198
+ else if (RB_STATIC_SYM_P(obj)) {
199
+ return RUBY_T_SYMBOL;
200
+ }
201
+ else {
202
+ RBIMPL_ASSUME(RB_FLONUM_P(obj));
203
+ return RUBY_T_FLOAT;
204
+ }
205
+ }
206
+
207
+ RBIMPL_ATTR_PURE_ON_NDEBUG()
208
+ RBIMPL_ATTR_ARTIFICIAL()
209
+ static inline bool
210
+ RB_FLOAT_TYPE_P(VALUE obj)
211
+ {
212
+ if (RB_FLONUM_P(obj)) {
213
+ return true;
214
+ }
215
+ else if (RB_SPECIAL_CONST_P(obj)) {
216
+ return false;
217
+ }
218
+ else {
219
+ return RB_BUILTIN_TYPE(obj) == RUBY_T_FLOAT;
220
+ }
221
+ }
222
+
223
+ RBIMPL_ATTR_PURE_ON_NDEBUG()
224
+ RBIMPL_ATTR_ARTIFICIAL()
225
+ static inline bool
226
+ RB_DYNAMIC_SYM_P(VALUE obj)
227
+ {
228
+ if (RB_SPECIAL_CONST_P(obj)) {
229
+ return false;
230
+ }
231
+ else {
232
+ return RB_BUILTIN_TYPE(obj) == RUBY_T_SYMBOL;
233
+ }
234
+ }
235
+
236
+ RBIMPL_ATTR_PURE_ON_NDEBUG()
237
+ RBIMPL_ATTR_ARTIFICIAL()
238
+ static inline bool
239
+ RB_SYMBOL_P(VALUE obj)
240
+ {
241
+ return RB_STATIC_SYM_P(obj) || RB_DYNAMIC_SYM_P(obj);
242
+ }
243
+
244
+ RBIMPL_ATTR_PURE_ON_NDEBUG()
245
+ RBIMPL_ATTR_ARTIFICIAL()
246
+ RBIMPL_ATTR_FORCEINLINE()
247
+ static bool
248
+ rbimpl_RB_TYPE_P_fastpath(VALUE obj, enum ruby_value_type t)
249
+ {
250
+ if (t == RUBY_T_TRUE) {
251
+ return obj == RUBY_Qtrue;
252
+ }
253
+ else if (t == RUBY_T_FALSE) {
254
+ return obj == RUBY_Qfalse;
255
+ }
256
+ else if (t == RUBY_T_NIL) {
257
+ return obj == RUBY_Qnil;
258
+ }
259
+ else if (t == RUBY_T_UNDEF) {
260
+ return obj == RUBY_Qundef;
261
+ }
262
+ else if (t == RUBY_T_FIXNUM) {
263
+ return RB_FIXNUM_P(obj);
264
+ }
265
+ else if (t == RUBY_T_SYMBOL) {
266
+ return RB_SYMBOL_P(obj);
267
+ }
268
+ else if (t == RUBY_T_FLOAT) {
269
+ return RB_FLOAT_TYPE_P(obj);
270
+ }
271
+ else if (RB_SPECIAL_CONST_P(obj)) {
272
+ return false;
273
+ }
274
+ else if (t == RB_BUILTIN_TYPE(obj)) {
275
+ return true;
276
+ }
277
+ else {
278
+ return false;
279
+ }
280
+ }
281
+
282
+ RBIMPL_ATTR_PURE_ON_NDEBUG()
283
+ RBIMPL_ATTR_ARTIFICIAL()
284
+ static inline bool
285
+ RB_TYPE_P(VALUE obj, enum ruby_value_type t)
286
+ {
287
+ if (RBIMPL_CONSTANT_P(t)) {
288
+ return rbimpl_RB_TYPE_P_fastpath(obj, t);
289
+ }
290
+ else {
291
+ return t == rb_type(obj);
292
+ }
293
+ }
294
+
295
+ /** @cond INTERNAL_MACRO */
296
+ /* Clang, unlike GCC, cannot propagate __builtin_constant_p beyond function
297
+ * boundary. */
298
+ #if defined(__clang__)
299
+ # undef RB_TYPE_P
300
+ # define RB_TYPE_P(obj, t) \
301
+ (RBIMPL_CONSTANT_P(t) ? \
302
+ rbimpl_RB_TYPE_P_fastpath((obj), (t)) : \
303
+ (RB_TYPE_P)((obj), (t)))
304
+ #endif
305
+
306
+ /* clang 3.x (4.2 compatible) can't eliminate CSE of RB_BUILTIN_TYPE
307
+ * in inline function and caller function
308
+ * See also 8998c06461ea0bef11b3aeb30b6d2ab71c8762ba
309
+ */
310
+ #if RBIMPL_COMPILER_BEFORE(Clang, 4, 0, 0)
311
+ # undef rb_integer_type_p
312
+ # define rb_integer_type_p(obj) \
313
+ __extension__ ({ \
314
+ const VALUE integer_type_obj = (obj); \
315
+ (RB_FIXNUM_P(integer_type_obj) || \
316
+ (!RB_SPECIAL_CONST_P(integer_type_obj) && \
317
+ RB_BUILTIN_TYPE(integer_type_obj) == RUBY_T_BIGNUM)); \
318
+ })
319
+ #endif
320
+ /** @endcond */
321
+
322
+ RBIMPL_ATTR_PURE()
323
+ RBIMPL_ATTR_ARTIFICIAL()
324
+ /* Defined in ruby/internal/core/rtypeddata.h */
325
+ static inline bool rbimpl_rtypeddata_p(VALUE obj);
326
+
327
+ RBIMPL_ATTR_ARTIFICIAL()
328
+ static inline void
329
+ Check_Type(VALUE v, enum ruby_value_type t)
330
+ {
331
+ if (RB_UNLIKELY(! RB_TYPE_P(v, t))) {
332
+ goto slowpath;
333
+ }
334
+ else if (t != RUBY_T_DATA) {
335
+ goto fastpath;
336
+ }
337
+ else if (rbimpl_rtypeddata_p(v)) {
338
+ /* The intention itself is not necessarily clear to me, but at least it
339
+ * is intentional to rule out typed data here. See commit
340
+ * a7c32bf81d3391cfb78cfda278f469717d0fb794. */
341
+ goto slowpath;
342
+ }
343
+ else {
344
+ goto fastpath;
345
+ }
346
+
347
+ fastpath:
348
+ return;
349
+
350
+ slowpath: /* <- :TODO: mark this label as cold. */
351
+ rb_check_type(v, t);
352
+ }
353
+
354
+ #endif /* RBIMPL_VALUE_TYPE_H */
@@ -0,0 +1,62 @@
1
+ #ifndef RBIMPL_VARIABLE_H /*-*-C++-*-vi:se ft=cpp:*/
2
+ #define RBIMPL_VARIABLE_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 C-function backended Ruby-global variables.
22
+ */
23
+ #include "ruby/internal/dllexport.h"
24
+ #include "ruby/internal/value.h"
25
+ #include "ruby/internal/attr/noreturn.h"
26
+
27
+ RBIMPL_SYMBOL_EXPORT_BEGIN()
28
+
29
+ typedef VALUE rb_gvar_getter_t(ID id, VALUE *data);
30
+ typedef void rb_gvar_setter_t(VALUE val, ID id, VALUE *data);
31
+ typedef void rb_gvar_marker_t(VALUE *var);
32
+
33
+ rb_gvar_getter_t rb_gvar_undef_getter;
34
+ rb_gvar_setter_t rb_gvar_undef_setter;
35
+ rb_gvar_marker_t rb_gvar_undef_marker;
36
+
37
+ rb_gvar_getter_t rb_gvar_val_getter;
38
+ rb_gvar_setter_t rb_gvar_val_setter;
39
+ rb_gvar_marker_t rb_gvar_val_marker;
40
+
41
+ rb_gvar_getter_t rb_gvar_var_getter;
42
+ rb_gvar_setter_t rb_gvar_var_setter;
43
+ rb_gvar_marker_t rb_gvar_var_marker;
44
+
45
+ RBIMPL_ATTR_NORETURN()
46
+ rb_gvar_setter_t rb_gvar_readonly_setter;
47
+
48
+ void rb_define_variable(const char*,VALUE*);
49
+ void rb_define_virtual_variable(const char*,rb_gvar_getter_t*,rb_gvar_setter_t*);
50
+ void rb_define_hooked_variable(const char*,VALUE*,rb_gvar_getter_t*,rb_gvar_setter_t*);
51
+ void rb_define_readonly_variable(const char*,const VALUE*);
52
+ void rb_define_const(VALUE,const char*,VALUE);
53
+ void rb_define_global_const(const char*,VALUE);
54
+
55
+ VALUE rb_gv_set(const char*, VALUE);
56
+ VALUE rb_gv_get(const char*);
57
+ VALUE rb_iv_get(VALUE, const char*);
58
+ VALUE rb_iv_set(VALUE, const char*, VALUE);
59
+
60
+ RBIMPL_SYMBOL_EXPORT_END()
61
+
62
+ #endif /* RBIMPL_VARIABLE_H */
@@ -0,0 +1,91 @@
1
+ #ifndef RBIMPL_WARNING_PUSH_H /*-*-C++-*-vi:se ft=cpp:*/
2
+ #define RBIMPL_WARNING_PUSH_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 RBIMPL_WARNING_PUSH.
22
+ * @cond INTERNAL_MACRO
23
+ *
24
+ * ### Q&A ###
25
+ *
26
+ * Q: Why all the macros defined in this file are function-like macros?
27
+ *
28
+ * A: Sigh. This is because of Doxgen. Its `SKIP_FUNCTION_MACROS = YES`
29
+ * configuration setting requests us that if we want it to ignore these
30
+ * macros, then we have to do two things: (1) let them be defined as
31
+ * function-like macros, and (2) place them separately in their own line,
32
+ * like below:
33
+ *
34
+ * ```CXX
35
+ * // NG -- foo's type considered something like `unsigned int`.
36
+ * RBIMPL_WARNING_PUSH
37
+ * int foo(void);
38
+ * RBIMPL_WARNING_POP
39
+ *
40
+ * // OK -- the macros are ignored by Doxygen.
41
+ * RBIMPL_WARNING_PUSH()
42
+ * int foo(void);
43
+ * RBIMPL_WARNING_POP()
44
+ * ```
45
+ */
46
+ #include "ruby/internal/compiler_is.h"
47
+ #include "ruby/internal/compiler_since.h"
48
+
49
+ #if RBIMPL_COMPILER_SINCE(MSVC, 12, 0, 0)
50
+ # /* Not sure exactly when but it seems VC++ 6.0 is a version with it.*/
51
+ # define RBIMPL_WARNING_PUSH() __pragma(warning(push))
52
+ # define RBIMPL_WARNING_POP() __pragma(warning(pop))
53
+ # define RBIMPL_WARNING_ERROR(flag) __pragma(warning(error: flag))
54
+ # define RBIMPL_WARNING_IGNORED(flag) __pragma(warning(disable: flag))
55
+
56
+ #elif RBIMPL_COMPILER_SINCE(Intel, 13, 0, 0)
57
+ # define RBIMPL_WARNING_PUSH() __pragma(warning(push))
58
+ # define RBIMPL_WARNING_POP() __pragma(warning(pop))
59
+ # define RBIMPL_WARNING_ERROR(flag) __pragma(warning(error: flag))
60
+ # define RBIMPL_WARNING_IGNORED(flag) __pragma(warning(disable: flag))
61
+
62
+ #elif RBIMPL_COMPILER_IS(Clang) || RBIMPL_COMPILER_IS(Apple)
63
+ # /* Not sure exactly when but it seems LLVM 2.6.0 is a version with it. */
64
+ # define RBIMPL_WARNING_PRAGMA0(x) _Pragma(# x)
65
+ # define RBIMPL_WARNING_PRAGMA1(x) RBIMPL_WARNING_PRAGMA0(clang diagnostic x)
66
+ # define RBIMPL_WARNING_PRAGMA2(x, y) RBIMPL_WARNING_PRAGMA1(x # y)
67
+ # define RBIMPL_WARNING_PUSH() RBIMPL_WARNING_PRAGMA1(push)
68
+ # define RBIMPL_WARNING_POP() RBIMPL_WARNING_PRAGMA1(pop)
69
+ # define RBIMPL_WARNING_ERROR(flag) RBIMPL_WARNING_PRAGMA2(error, flag)
70
+ # define RBIMPL_WARNING_IGNORED(flag) RBIMPL_WARNING_PRAGMA2(ignored, flag)
71
+
72
+ #elif RBIMPL_COMPILER_SINCE(GCC, 4, 6, 0)
73
+ # /* https://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Diagnostic-Pragmas.html */
74
+ # define RBIMPL_WARNING_PRAGMA0(x) _Pragma(# x)
75
+ # define RBIMPL_WARNING_PRAGMA1(x) RBIMPL_WARNING_PRAGMA0(GCC diagnostic x)
76
+ # define RBIMPL_WARNING_PRAGMA2(x, y) RBIMPL_WARNING_PRAGMA1(x # y)
77
+ # define RBIMPL_WARNING_PUSH() RBIMPL_WARNING_PRAGMA1(push)
78
+ # define RBIMPL_WARNING_POP() RBIMPL_WARNING_PRAGMA1(pop)
79
+ # define RBIMPL_WARNING_ERROR(flag) RBIMPL_WARNING_PRAGMA2(error, flag)
80
+ # define RBIMPL_WARNING_IGNORED(flag) RBIMPL_WARNING_PRAGMA2(ignored, flag)
81
+
82
+ #else
83
+ # /* :FIXME: improve here */
84
+ # define RBIMPL_WARNING_PUSH() /* void */
85
+ # define RBIMPL_WARNING_POP() /* void */
86
+ # define RBIMPL_WARNING_ERROR(flag) /* void */
87
+ # define RBIMPL_WARNING_IGNORED(flag) /* void */
88
+ #endif /* _MSC_VER */
89
+ /** @endcond */
90
+
91
+ #endif /* RBIMPL_WARNING_PUSH_H */