debase-ruby_core_source 3.2.1 → 3.2.3

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 (129) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/addr2line.h +3 -1
  4. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/darray.h +246 -0
  5. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/debug_counter.h +7 -10
  6. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/eval_intern.h +3 -1
  7. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/id.h +44 -0
  8. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/insns_info.inc +128 -154
  9. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/array.h +9 -20
  10. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/internal/bits.h +568 -0
  11. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/class.h +11 -2
  12. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/cmdlineopt.h +5 -1
  13. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/compile.h +0 -1
  14. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/error.h +24 -2
  15. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/gc.h +29 -0
  16. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/hash.h +19 -44
  17. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/imemo.h +0 -1
  18. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/internal/io.h +137 -0
  19. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/internal/parse.h +108 -0
  20. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/process.h +0 -14
  21. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/range.h +2 -2
  22. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/re.h +1 -1
  23. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/internal/ruby_parser.h +69 -0
  24. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/signal.h +4 -0
  25. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/string.h +15 -0
  26. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/struct.h +9 -34
  27. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/thread.h +14 -0
  28. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/variable.h +17 -35
  29. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/vm.h +9 -2
  30. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/iseq.h +4 -4
  31. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/method.h +8 -7
  32. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/node.h +128 -0
  33. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/node_name.inc +4 -2
  34. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/parse.h +19 -6
  35. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1/internal/bits.h → ruby-3.3.0-preview3/parser_bits.h} +4 -4
  36. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/parser_node.h +32 -0
  37. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/parser_st.h +162 -0
  38. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/parser_value.h +106 -0
  39. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/prism_compile.h +18 -0
  40. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/ractor_core.h +10 -4
  41. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/regint.h +8 -0
  42. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/regparse.h +2 -1
  43. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/revision.h +5 -0
  44. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/rubyparser.h +1403 -0
  45. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/shape.h +32 -22
  46. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/symbol.h +2 -3
  47. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/thread_none.h +1 -0
  48. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/thread_pthread.h +66 -28
  49. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/thread_win32.h +1 -6
  50. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/variable.h +9 -2
  51. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/version.h +7 -3
  52. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/vm.inc +383 -497
  53. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/vm_callinfo.h +54 -16
  54. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/vm_core.h +92 -57
  55. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/vm_exec.h +11 -10
  56. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/vm_insnhelper.h +20 -23
  57. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/vm_opts.h +0 -5
  58. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/yjit.h +12 -12
  59. data/lib/debase/ruby_core_source/version.rb +1 -1
  60. metadata +120 -115
  61. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/darray.h +0 -179
  62. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/io.h +0 -38
  63. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/parse.h +0 -25
  64. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/node.h +0 -514
  65. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/opt_sc.inc +0 -109
  66. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/revision.h +0 -5
  67. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/transient_heap.h +0 -65
  68. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/builtin.h +0 -0
  69. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/ccan/build_assert/build_assert.h +0 -0
  70. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/ccan/check_type/check_type.h +0 -0
  71. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/ccan/container_of/container_of.h +0 -0
  72. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/ccan/list/list.h +0 -0
  73. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/ccan/str/str.h +0 -0
  74. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/constant.h +0 -0
  75. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/dln.h +0 -0
  76. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/encindex.h +0 -0
  77. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/hrtime.h +0 -0
  78. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/id_table.h +0 -0
  79. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/insns.inc +0 -0
  80. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/basic_operators.h +0 -0
  81. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/bignum.h +0 -0
  82. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/compar.h +0 -0
  83. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/compilers.h +0 -0
  84. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/complex.h +0 -0
  85. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/cont.h +0 -0
  86. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/dir.h +0 -0
  87. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/enc.h +0 -0
  88. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/encoding.h +0 -0
  89. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/enum.h +0 -0
  90. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/enumerator.h +0 -0
  91. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/eval.h +0 -0
  92. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/file.h +0 -0
  93. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/fixnum.h +0 -0
  94. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/inits.h +0 -0
  95. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/load.h +0 -0
  96. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/loadpath.h +0 -0
  97. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/math.h +0 -0
  98. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/missing.h +0 -0
  99. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/numeric.h +0 -0
  100. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/object.h +0 -0
  101. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/proc.h +0 -0
  102. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/ractor.h +0 -0
  103. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/random.h +0 -0
  104. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/rational.h +0 -0
  105. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/sanitizers.h +0 -0
  106. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/serial.h +0 -0
  107. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/static_assert.h +0 -0
  108. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/symbol.h +0 -0
  109. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/time.h +0 -0
  110. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/transcode.h +0 -0
  111. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/util.h +0 -0
  112. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal/warnings.h +0 -0
  113. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/internal.h +0 -0
  114. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/known_errors.inc +0 -0
  115. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/optinsn.inc +0 -0
  116. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/optunifs.inc +0 -0
  117. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/probes_helper.h +0 -0
  118. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/regenc.h +0 -0
  119. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/rjit.h +0 -0
  120. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/rjit_c.h +0 -0
  121. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/ruby_assert.h +0 -0
  122. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/ruby_atomic.h +0 -0
  123. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/siphash.h +0 -0
  124. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/timev.h +0 -0
  125. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/transcode_data.h +0 -0
  126. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/vm_call_iseq_optimized.inc +0 -0
  127. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/vm_debug.h +0 -0
  128. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/vm_sync.h +0 -0
  129. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview1 → ruby-3.3.0-preview3}/vmtc.inc +0 -0
@@ -40,8 +40,6 @@ VALUE rb_ary_diff(VALUE ary1, VALUE ary2);
40
40
 
41
41
  static inline VALUE rb_ary_entry_internal(VALUE ary, long offset);
42
42
  static inline bool ARY_PTR_USING_P(VALUE ary);
43
- static inline void RARY_TRANSIENT_SET(VALUE ary);
44
- static inline void RARY_TRANSIENT_UNSET(VALUE ary);
45
43
 
46
44
  VALUE rb_ary_tmp_new_from_values(VALUE, long, const VALUE *);
47
45
  VALUE rb_check_to_array(VALUE ary);
@@ -56,7 +54,7 @@ static inline VALUE
56
54
  rb_ary_entry_internal(VALUE ary, long offset)
57
55
  {
58
56
  long len = RARRAY_LEN(ary);
59
- const VALUE *ptr = RARRAY_CONST_PTR_TRANSIENT(ary);
57
+ const VALUE *ptr = RARRAY_CONST_PTR(ary);
60
58
  if (len == 0) return Qnil;
61
59
  if (offset < 0) {
62
60
  offset += len;
@@ -118,22 +116,6 @@ ARY_SHARED_ROOT_REFCNT(VALUE ary)
118
116
  return RARRAY(ary)->as.heap.aux.capa;
119
117
  }
120
118
 
121
- static inline void
122
- RARY_TRANSIENT_SET(VALUE ary)
123
- {
124
- #if USE_TRANSIENT_HEAP
125
- FL_SET_RAW(ary, RARRAY_TRANSIENT_FLAG);
126
- #endif
127
- }
128
-
129
- static inline void
130
- RARY_TRANSIENT_UNSET(VALUE ary)
131
- {
132
- #if USE_TRANSIENT_HEAP
133
- FL_UNSET_RAW(ary, RARRAY_TRANSIENT_FLAG);
134
- #endif
135
- }
136
-
137
119
  #undef rb_ary_new_from_args
138
120
  #if RBIMPL_HAS_WARNING("-Wgnu-zero-variadic-macro-arguments")
139
121
  # /* Skip it; clang -pedantic doesn't like the following */
@@ -154,9 +136,16 @@ RBIMPL_ATTR_ARTIFICIAL()
154
136
  static inline VALUE
155
137
  RARRAY_AREF(VALUE ary, long i)
156
138
  {
139
+ VALUE val;
157
140
  RBIMPL_ASSERT_TYPE(ary, RUBY_T_ARRAY);
158
141
 
159
- return RARRAY_CONST_PTR_TRANSIENT(ary)[i];
142
+ RBIMPL_WARNING_PUSH();
143
+ #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ == 13
144
+ RBIMPL_WARNING_IGNORED(-Warray-bounds);
145
+ #endif
146
+ val = RARRAY_CONST_PTR(ary)[i];
147
+ RBIMPL_WARNING_POP();
148
+ return val;
160
149
  }
161
150
 
162
151
  #endif /* INTERNAL_ARRAY_H */
@@ -0,0 +1,568 @@
1
+ #ifndef INTERNAL_BITS_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_BITS_H
3
+ /**
4
+ * @author Ruby developers <ruby-core@ruby-lang.org>
5
+ * @copyright This file is a part of the programming language Ruby.
6
+ * Permission is hereby granted, to either redistribute and/or
7
+ * modify this file, provided that the conditions mentioned in the
8
+ * file COPYING are met. Consult the file for details.
9
+ * @brief Internal header for bitwise integer algorithms.
10
+ * @see Henry S. Warren Jr., "Hacker's Delight" (2nd ed.), 2013.
11
+ * @see SEI CERT C Coding Standard INT32-C. "Ensure that operations on
12
+ * signed integers do not result in overflow"
13
+ * @see https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
14
+ * @see https://clang.llvm.org/docs/LanguageExtensions.html#builtin-rotateleft
15
+ * @see https://clang.llvm.org/docs/LanguageExtensions.html#builtin-rotateright
16
+ * @see https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/byteswap-uint64-byteswap-ulong-byteswap-ushort
17
+ * @see https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/rotl-rotl64-rotr-rotr64
18
+ * @see https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanforward-bitscanforward64
19
+ * @see https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanreverse-bitscanreverse64
20
+ * @see https://docs.microsoft.com/en-us/cpp/intrinsics/lzcnt16-lzcnt-lzcnt64
21
+ * @see https://docs.microsoft.com/en-us/cpp/intrinsics/popcnt16-popcnt-popcnt64
22
+ * @see https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_lzcnt_u32
23
+ * @see https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_tzcnt_u32
24
+ * @see https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_rotl64
25
+ * @see https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_rotr64
26
+ * @see https://stackoverflow.com/a/776523
27
+ */
28
+ #include "ruby/internal/config.h"
29
+ #include <limits.h> /* for CHAR_BITS */
30
+ #include <stdint.h> /* for uintptr_t */
31
+ #include "internal/compilers.h" /* for MSC_VERSION_SINCE */
32
+
33
+ #if MSC_VERSION_SINCE(1310)
34
+ # include <stdlib.h> /* for _byteswap_uint64 */
35
+ #endif
36
+
37
+ #if defined(HAVE_X86INTRIN_H)
38
+ # include <x86intrin.h> /* for _lzcnt_u64 */
39
+ #elif MSC_VERSION_SINCE(1310)
40
+ # include <intrin.h> /* for the following intrinsics */
41
+ #endif
42
+
43
+ #if defined(_MSC_VER) && defined(__AVX__)
44
+ # pragma intrinsic(__popcnt)
45
+ # pragma intrinsic(__popcnt64)
46
+ #endif
47
+
48
+ #if defined(_MSC_VER) && defined(__AVX2__)
49
+ # pragma intrinsic(__lzcnt)
50
+ # pragma intrinsic(__lzcnt64)
51
+ #endif
52
+
53
+ #if MSC_VERSION_SINCE(1310)
54
+ # pragma intrinsic(_rotl)
55
+ # pragma intrinsic(_rotr)
56
+ # ifdef _WIN64
57
+ # pragma intrinsic(_rotl64)
58
+ # pragma intrinsic(_rotr64)
59
+ # endif
60
+ #endif
61
+
62
+ #if MSC_VERSION_SINCE(1400)
63
+ # pragma intrinsic(_BitScanForward)
64
+ # pragma intrinsic(_BitScanReverse)
65
+ # ifdef _WIN64
66
+ # pragma intrinsic(_BitScanForward64)
67
+ # pragma intrinsic(_BitScanReverse64)
68
+ # endif
69
+ #endif
70
+
71
+ #include "ruby/ruby.h" /* for VALUE */
72
+ #include "internal/static_assert.h" /* for STATIC_ASSERT */
73
+
74
+ /* The most significant bit of the lower part of half-long integer.
75
+ * If sizeof(long) == 4, this is 0x8000.
76
+ * If sizeof(long) == 8, this is 0x80000000.
77
+ */
78
+ #define HALF_LONG_MSB ((SIGNED_VALUE)1<<((SIZEOF_LONG*CHAR_BIT-1)/2))
79
+
80
+ #define SIGNED_INTEGER_TYPE_P(T) (0 > ((T)0)-1)
81
+
82
+ #define SIGNED_INTEGER_MIN(T) \
83
+ ((sizeof(T) == sizeof(int8_t)) ? ((T)INT8_MIN) : \
84
+ ((sizeof(T) == sizeof(int16_t)) ? ((T)INT16_MIN) : \
85
+ ((sizeof(T) == sizeof(int32_t)) ? ((T)INT32_MIN) : \
86
+ ((sizeof(T) == sizeof(int64_t)) ? ((T)INT64_MIN) : \
87
+ 0))))
88
+
89
+ #define SIGNED_INTEGER_MAX(T) ((T)(SIGNED_INTEGER_MIN(T) ^ ((T)~(T)0)))
90
+
91
+ #define UNSIGNED_INTEGER_MAX(T) ((T)~(T)0)
92
+
93
+ #if __has_builtin(__builtin_mul_overflow_p)
94
+ # define MUL_OVERFLOW_P(a, b) \
95
+ __builtin_mul_overflow_p((a), (b), (__typeof__(a * b))0)
96
+ #elif __has_builtin(__builtin_mul_overflow)
97
+ # define MUL_OVERFLOW_P(a, b) \
98
+ __extension__ ({ __typeof__(a) c; __builtin_mul_overflow((a), (b), &c); })
99
+ #endif
100
+
101
+ #define MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, min, max) ( \
102
+ (a) == 0 ? 0 : \
103
+ (a) == -1 ? (b) < -(max) : \
104
+ (a) > 0 ? \
105
+ ((b) > 0 ? (max) / (a) < (b) : (min) / (a) > (b)) : \
106
+ ((b) > 0 ? (min) / (a) < (b) : (max) / (a) > (b)))
107
+
108
+ #if __has_builtin(__builtin_mul_overflow_p)
109
+ /* __builtin_mul_overflow_p can take bitfield */
110
+ /* and GCC permits bitfields for integers other than int */
111
+ # define MUL_OVERFLOW_FIXNUM_P(a, b) \
112
+ __extension__ ({ \
113
+ struct { long fixnum : sizeof(long) * CHAR_BIT - 1; } c = { 0 }; \
114
+ __builtin_mul_overflow_p((a), (b), c.fixnum); \
115
+ })
116
+ #else
117
+ # define MUL_OVERFLOW_FIXNUM_P(a, b) \
118
+ MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX)
119
+ #endif
120
+
121
+ #if defined(MUL_OVERFLOW_P) && defined(USE___BUILTIN_MUL_OVERFLOW_LONG_LONG)
122
+ # define MUL_OVERFLOW_LONG_LONG_P(a, b) MUL_OVERFLOW_P(a, b)
123
+ #else
124
+ # define MUL_OVERFLOW_LONG_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX)
125
+ #endif
126
+
127
+ #ifdef MUL_OVERFLOW_P
128
+ # define MUL_OVERFLOW_LONG_P(a, b) MUL_OVERFLOW_P(a, b)
129
+ # define MUL_OVERFLOW_INT_P(a, b) MUL_OVERFLOW_P(a, b)
130
+ #else
131
+ # define MUL_OVERFLOW_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX)
132
+ # define MUL_OVERFLOW_INT_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX)
133
+ #endif
134
+
135
+ #ifdef HAVE_UINT128_T
136
+ # define bit_length(x) \
137
+ (unsigned int) \
138
+ (sizeof(x) <= sizeof(int32_t) ? 32 - nlz_int32((uint32_t)(x)) : \
139
+ sizeof(x) <= sizeof(int64_t) ? 64 - nlz_int64((uint64_t)(x)) : \
140
+ 128 - nlz_int128((uint128_t)(x)))
141
+ #else
142
+ # define bit_length(x) \
143
+ (unsigned int) \
144
+ (sizeof(x) <= sizeof(int32_t) ? 32 - nlz_int32((uint32_t)(x)) : \
145
+ 64 - nlz_int64((uint64_t)(x)))
146
+ #endif
147
+
148
+ #ifndef swap16
149
+ # define swap16 ruby_swap16
150
+ #endif
151
+
152
+ #ifndef swap32
153
+ # define swap32 ruby_swap32
154
+ #endif
155
+
156
+ #ifndef swap64
157
+ # define swap64 ruby_swap64
158
+ #endif
159
+
160
+ static inline uint16_t ruby_swap16(uint16_t);
161
+ static inline uint32_t ruby_swap32(uint32_t);
162
+ static inline uint64_t ruby_swap64(uint64_t);
163
+ static inline unsigned nlz_int(unsigned x);
164
+ static inline unsigned nlz_long(unsigned long x);
165
+ static inline unsigned nlz_long_long(unsigned long long x);
166
+ static inline unsigned nlz_intptr(uintptr_t x);
167
+ static inline unsigned nlz_int32(uint32_t x);
168
+ static inline unsigned nlz_int64(uint64_t x);
169
+ #ifdef HAVE_UINT128_T
170
+ static inline unsigned nlz_int128(uint128_t x);
171
+ #endif
172
+ static inline unsigned rb_popcount32(uint32_t x);
173
+ static inline unsigned rb_popcount64(uint64_t x);
174
+ static inline unsigned rb_popcount_intptr(uintptr_t x);
175
+ static inline int ntz_int32(uint32_t x);
176
+ static inline int ntz_int64(uint64_t x);
177
+ static inline int ntz_intptr(uintptr_t x);
178
+ static inline VALUE RUBY_BIT_ROTL(VALUE, int);
179
+ static inline VALUE RUBY_BIT_ROTR(VALUE, int);
180
+
181
+ static inline uint16_t
182
+ ruby_swap16(uint16_t x)
183
+ {
184
+ #if __has_builtin(__builtin_bswap16)
185
+ return __builtin_bswap16(x);
186
+
187
+ #elif MSC_VERSION_SINCE(1310)
188
+ return _byteswap_ushort(x);
189
+
190
+ #else
191
+ return (x << 8) | (x >> 8);
192
+
193
+ #endif
194
+ }
195
+
196
+ static inline uint32_t
197
+ ruby_swap32(uint32_t x)
198
+ {
199
+ #if __has_builtin(__builtin_bswap32)
200
+ return __builtin_bswap32(x);
201
+
202
+ #elif MSC_VERSION_SINCE(1310)
203
+ return _byteswap_ulong(x);
204
+
205
+ #else
206
+ x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16);
207
+ x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8);
208
+ return x;
209
+
210
+ #endif
211
+ }
212
+
213
+ static inline uint64_t
214
+ ruby_swap64(uint64_t x)
215
+ {
216
+ #if __has_builtin(__builtin_bswap64)
217
+ return __builtin_bswap64(x);
218
+
219
+ #elif MSC_VERSION_SINCE(1310)
220
+ return _byteswap_uint64(x);
221
+
222
+ #else
223
+ x = ((x & 0x00000000FFFFFFFFULL) << 32) | ((x & 0xFFFFFFFF00000000ULL) >> 32);
224
+ x = ((x & 0x0000FFFF0000FFFFULL) << 16) | ((x & 0xFFFF0000FFFF0000ULL) >> 16);
225
+ x = ((x & 0x00FF00FF00FF00FFULL) << 8) | ((x & 0xFF00FF00FF00FF00ULL) >> 8);
226
+ return x;
227
+
228
+ #endif
229
+ }
230
+
231
+ static inline unsigned int
232
+ nlz_int32(uint32_t x)
233
+ {
234
+ #if defined(_MSC_VER) && defined(__AVX2__)
235
+ /* Note: It seems there is no such thing like __LZCNT__ predefined in MSVC.
236
+ * AMD CPUs have had this instruction for decades (since K10) but for
237
+ * Intel, Haswell is the oldest one. We need to use __AVX2__ for maximum
238
+ * safety. */
239
+ return (unsigned int)__lzcnt(x);
240
+
241
+ #elif defined(__x86_64__) && defined(__LZCNT__)
242
+ return (unsigned int)_lzcnt_u32(x);
243
+
244
+ #elif MSC_VERSION_SINCE(1400) /* &&! defined(__AVX2__) */
245
+ unsigned long r;
246
+ return _BitScanReverse(&r, x) ? (31 - (int)r) : 32;
247
+
248
+ #elif __has_builtin(__builtin_clz)
249
+ STATIC_ASSERT(sizeof_int, sizeof(int) * CHAR_BIT == 32);
250
+ return x ? (unsigned int)__builtin_clz(x) : 32;
251
+
252
+ #else
253
+ uint32_t y;
254
+ unsigned n = 32;
255
+ y = x >> 16; if (y) {n -= 16; x = y;}
256
+ y = x >> 8; if (y) {n -= 8; x = y;}
257
+ y = x >> 4; if (y) {n -= 4; x = y;}
258
+ y = x >> 2; if (y) {n -= 2; x = y;}
259
+ y = x >> 1; if (y) {return n - 2;}
260
+ return (unsigned int)(n - x);
261
+ #endif
262
+ }
263
+
264
+ static inline unsigned int
265
+ nlz_int64(uint64_t x)
266
+ {
267
+ #if defined(_MSC_VER) && defined(__AVX2__)
268
+ return (unsigned int)__lzcnt64(x);
269
+
270
+ #elif defined(__x86_64__) && defined(__LZCNT__)
271
+ return (unsigned int)_lzcnt_u64(x);
272
+
273
+ #elif defined(_WIN64) && MSC_VERSION_SINCE(1400) /* &&! defined(__AVX2__) */
274
+ unsigned long r;
275
+ return _BitScanReverse64(&r, x) ? (63u - (unsigned int)r) : 64;
276
+
277
+ #elif __has_builtin(__builtin_clzl)
278
+ if (x == 0) {
279
+ return 64;
280
+ }
281
+ else if (sizeof(long) * CHAR_BIT == 64) {
282
+ return (unsigned int)__builtin_clzl((unsigned long)x);
283
+ }
284
+ else if (sizeof(long long) * CHAR_BIT == 64) {
285
+ return (unsigned int)__builtin_clzll((unsigned long long)x);
286
+ }
287
+ else {
288
+ /* :FIXME: Is there a way to make this branch a compile-time error? */
289
+ UNREACHABLE_RETURN(~0);
290
+ }
291
+
292
+ #else
293
+ uint64_t y;
294
+ unsigned int n = 64;
295
+ y = x >> 32; if (y) {n -= 32; x = y;}
296
+ y = x >> 16; if (y) {n -= 16; x = y;}
297
+ y = x >> 8; if (y) {n -= 8; x = y;}
298
+ y = x >> 4; if (y) {n -= 4; x = y;}
299
+ y = x >> 2; if (y) {n -= 2; x = y;}
300
+ y = x >> 1; if (y) {return n - 2;}
301
+ return (unsigned int)(n - x);
302
+
303
+ #endif
304
+ }
305
+
306
+ #ifdef HAVE_UINT128_T
307
+ static inline unsigned int
308
+ nlz_int128(uint128_t x)
309
+ {
310
+ uint64_t y = (uint64_t)(x >> 64);
311
+
312
+ if (x == 0) {
313
+ return 128;
314
+ }
315
+ else if (y == 0) {
316
+ return (unsigned int)nlz_int64(x) + 64;
317
+ }
318
+ else {
319
+ return (unsigned int)nlz_int64(y);
320
+ }
321
+ }
322
+ #endif
323
+
324
+ static inline unsigned int
325
+ nlz_int(unsigned int x)
326
+ {
327
+ if (sizeof(unsigned int) * CHAR_BIT == 32) {
328
+ return nlz_int32((uint32_t)x);
329
+ }
330
+ else if (sizeof(unsigned int) * CHAR_BIT == 64) {
331
+ return nlz_int64((uint64_t)x);
332
+ }
333
+ else {
334
+ UNREACHABLE_RETURN(~0);
335
+ }
336
+ }
337
+
338
+ static inline unsigned int
339
+ nlz_long(unsigned long x)
340
+ {
341
+ if (sizeof(unsigned long) * CHAR_BIT == 32) {
342
+ return nlz_int32((uint32_t)x);
343
+ }
344
+ else if (sizeof(unsigned long) * CHAR_BIT == 64) {
345
+ return nlz_int64((uint64_t)x);
346
+ }
347
+ else {
348
+ UNREACHABLE_RETURN(~0);
349
+ }
350
+ }
351
+
352
+ static inline unsigned int
353
+ nlz_long_long(unsigned long long x)
354
+ {
355
+ if (sizeof(unsigned long long) * CHAR_BIT == 64) {
356
+ return nlz_int64((uint64_t)x);
357
+ }
358
+ #ifdef HAVE_UINT128_T
359
+ else if (sizeof(unsigned long long) * CHAR_BIT == 128) {
360
+ return nlz_int128((uint128_t)x);
361
+ }
362
+ #endif
363
+ else {
364
+ UNREACHABLE_RETURN(~0);
365
+ }
366
+ }
367
+
368
+ static inline unsigned int
369
+ nlz_intptr(uintptr_t x)
370
+ {
371
+ if (sizeof(uintptr_t) == sizeof(unsigned int)) {
372
+ return nlz_int((unsigned int)x);
373
+ }
374
+ if (sizeof(uintptr_t) == sizeof(unsigned long)) {
375
+ return nlz_long((unsigned long)x);
376
+ }
377
+ if (sizeof(uintptr_t) == sizeof(unsigned long long)) {
378
+ return nlz_long_long((unsigned long long)x);
379
+ }
380
+ else {
381
+ UNREACHABLE_RETURN(~0);
382
+ }
383
+ }
384
+
385
+ static inline unsigned int
386
+ rb_popcount32(uint32_t x)
387
+ {
388
+ #if defined(_MSC_VER) && defined(__AVX__)
389
+ /* Note: CPUs since Nehalem and Barcelona have had this instruction so SSE
390
+ * 4.2 should suffice, but it seems there is no such thing like __SSE_4_2__
391
+ * predefined macro in MSVC. They do have __AVX__ so use it instead. */
392
+ return (unsigned int)__popcnt(x);
393
+
394
+ #elif __has_builtin(__builtin_popcount)
395
+ STATIC_ASSERT(sizeof_int, sizeof(int) * CHAR_BIT >= 32);
396
+ return (unsigned int)__builtin_popcount(x);
397
+
398
+ #else
399
+ x = (x & 0x55555555) + (x >> 1 & 0x55555555);
400
+ x = (x & 0x33333333) + (x >> 2 & 0x33333333);
401
+ x = (x & 0x07070707) + (x >> 4 & 0x07070707);
402
+ x = (x & 0x000f000f) + (x >> 8 & 0x000f000f);
403
+ x = (x & 0x0000001f) + (x >>16 & 0x0000001f);
404
+ return (unsigned int)x;
405
+
406
+ #endif
407
+ }
408
+
409
+ static inline unsigned int
410
+ rb_popcount64(uint64_t x)
411
+ {
412
+ #if defined(_MSC_VER) && defined(__AVX__)
413
+ return (unsigned int)__popcnt64(x);
414
+
415
+ #elif __has_builtin(__builtin_popcount)
416
+ if (sizeof(long) * CHAR_BIT == 64) {
417
+ return (unsigned int)__builtin_popcountl((unsigned long)x);
418
+ }
419
+ else if (sizeof(long long) * CHAR_BIT == 64) {
420
+ return (unsigned int)__builtin_popcountll((unsigned long long)x);
421
+ }
422
+ else {
423
+ /* :FIXME: Is there a way to make this branch a compile-time error? */
424
+ UNREACHABLE_RETURN(~0);
425
+ }
426
+
427
+ #else
428
+ x = (x & 0x5555555555555555) + (x >> 1 & 0x5555555555555555);
429
+ x = (x & 0x3333333333333333) + (x >> 2 & 0x3333333333333333);
430
+ x = (x & 0x0707070707070707) + (x >> 4 & 0x0707070707070707);
431
+ x = (x & 0x000f000f000f000f) + (x >> 8 & 0x000f000f000f000f);
432
+ x = (x & 0x0000001f0000001f) + (x >>16 & 0x0000001f0000001f);
433
+ x = (x & 0x000000000000003f) + (x >>32 & 0x000000000000003f);
434
+ return (unsigned int)x;
435
+
436
+ #endif
437
+ }
438
+
439
+ static inline unsigned int
440
+ rb_popcount_intptr(uintptr_t x)
441
+ {
442
+ if (sizeof(uintptr_t) * CHAR_BIT == 64) {
443
+ return rb_popcount64((uint64_t)x);
444
+ }
445
+ else if (sizeof(uintptr_t) * CHAR_BIT == 32) {
446
+ return rb_popcount32((uint32_t)x);
447
+ }
448
+ else {
449
+ UNREACHABLE_RETURN(~0);
450
+ }
451
+ }
452
+
453
+ static inline int
454
+ ntz_int32(uint32_t x)
455
+ {
456
+ #if defined(__x86_64__) && defined(__BMI__)
457
+ return (unsigned)_tzcnt_u32(x);
458
+
459
+ #elif MSC_VERSION_SINCE(1400)
460
+ /* :FIXME: Is there any way to issue TZCNT instead of BSF, apart from using
461
+ * assembly? Because issuing LZCNT seems possible (see nlz.h). */
462
+ unsigned long r;
463
+ return _BitScanForward(&r, x) ? (int)r : 32;
464
+
465
+ #elif __has_builtin(__builtin_ctz)
466
+ STATIC_ASSERT(sizeof_int, sizeof(int) * CHAR_BIT == 32);
467
+ return x ? (unsigned)__builtin_ctz(x) : 32;
468
+
469
+ #else
470
+ return rb_popcount32((~x) & (x-1));
471
+
472
+ #endif
473
+ }
474
+
475
+ static inline int
476
+ ntz_int64(uint64_t x)
477
+ {
478
+ #if defined(__x86_64__) && defined(__BMI__)
479
+ return (unsigned)_tzcnt_u64(x);
480
+
481
+ #elif defined(_WIN64) && MSC_VERSION_SINCE(1400)
482
+ unsigned long r;
483
+ return _BitScanForward64(&r, x) ? (int)r : 64;
484
+
485
+ #elif __has_builtin(__builtin_ctzl)
486
+ if (x == 0) {
487
+ return 64;
488
+ }
489
+ else if (sizeof(long) * CHAR_BIT == 64) {
490
+ return (unsigned)__builtin_ctzl((unsigned long)x);
491
+ }
492
+ else if (sizeof(long long) * CHAR_BIT == 64) {
493
+ return (unsigned)__builtin_ctzll((unsigned long long)x);
494
+ }
495
+ else {
496
+ /* :FIXME: Is there a way to make this branch a compile-time error? */
497
+ UNREACHABLE_RETURN(~0);
498
+ }
499
+
500
+ #else
501
+ return rb_popcount64((~x) & (x-1));
502
+
503
+ #endif
504
+ }
505
+
506
+ static inline int
507
+ ntz_intptr(uintptr_t x)
508
+ {
509
+ if (sizeof(uintptr_t) * CHAR_BIT == 64) {
510
+ return ntz_int64((uint64_t)x);
511
+ }
512
+ else if (sizeof(uintptr_t) * CHAR_BIT == 32) {
513
+ return ntz_int32((uint32_t)x);
514
+ }
515
+ else {
516
+ UNREACHABLE_RETURN(~0);
517
+ }
518
+ }
519
+
520
+ static inline VALUE
521
+ RUBY_BIT_ROTL(VALUE v, int n)
522
+ {
523
+ #if __has_builtin(__builtin_rotateleft32) && (SIZEOF_VALUE * CHAR_BIT == 32)
524
+ return __builtin_rotateleft32(v, n);
525
+
526
+ #elif __has_builtin(__builtin_rotateleft64) && (SIZEOF_VALUE * CHAR_BIT == 64)
527
+ return __builtin_rotateleft64(v, n);
528
+
529
+ #elif MSC_VERSION_SINCE(1310) && (SIZEOF_VALUE * CHAR_BIT == 32)
530
+ return _rotl(v, n);
531
+
532
+ #elif MSC_VERSION_SINCE(1310) && (SIZEOF_VALUE * CHAR_BIT == 64)
533
+ return _rotl64(v, n);
534
+
535
+ #elif defined(_lrotl) && (SIZEOF_VALUE == SIZEOF_LONG)
536
+ return _lrotl(v, n);
537
+
538
+ #else
539
+ const int m = (sizeof(VALUE) * CHAR_BIT) - 1;
540
+ return (v << (n & m)) | (v >> (-n & m));
541
+ #endif
542
+ }
543
+
544
+ static inline VALUE
545
+ RUBY_BIT_ROTR(VALUE v, int n)
546
+ {
547
+ #if __has_builtin(__builtin_rotateright32) && (SIZEOF_VALUE * CHAR_BIT == 32)
548
+ return __builtin_rotateright32(v, n);
549
+
550
+ #elif __has_builtin(__builtin_rotateright64) && (SIZEOF_VALUE * CHAR_BIT == 64)
551
+ return __builtin_rotateright64(v, n);
552
+
553
+ #elif MSC_VERSION_SINCE(1310) && (SIZEOF_VALUE * CHAR_BIT == 32)
554
+ return _rotr(v, n);
555
+
556
+ #elif MSC_VERSION_SINCE(1310) && (SIZEOF_VALUE * CHAR_BIT == 64)
557
+ return _rotr64(v, n);
558
+
559
+ #elif defined(_lrotr) && (SIZEOF_VALUE == SIZEOF_LONG)
560
+ return _lrotr(v, n);
561
+
562
+ #else
563
+ const int m = (sizeof(VALUE) * CHAR_BIT) - 1;
564
+ return (v << (-n & m)) | (v >> (n & m));
565
+ #endif
566
+ }
567
+
568
+ #endif /* INTERNAL_BITS_H */
@@ -17,6 +17,9 @@
17
17
  #include "ruby/intern.h" /* for rb_alloc_func_t */
18
18
  #include "ruby/ruby.h" /* for struct RBasic */
19
19
  #include "shape.h"
20
+ #include "ruby_assert.h"
21
+ #include "vm_core.h"
22
+ #include "method.h" /* for rb_cref_t */
20
23
 
21
24
  #ifdef RCLASS_SUPER
22
25
  # undef RCLASS_SUPER
@@ -32,6 +35,7 @@ typedef struct rb_subclass_entry rb_subclass_entry_t;
32
35
  struct rb_cvar_class_tbl_entry {
33
36
  uint32_t index;
34
37
  rb_serial_t global_cvar_state;
38
+ const rb_cref_t * cref;
35
39
  VALUE class_value;
36
40
  };
37
41
 
@@ -81,7 +85,12 @@ struct RClass {
81
85
  // Assert that classes can be embedded in size_pools[2] (which has 160B slot size)
82
86
  STATIC_ASSERT(sizeof_rb_classext_t, sizeof(struct RClass) + sizeof(rb_classext_t) <= 4 * RVALUE_SIZE);
83
87
 
84
- #define RCLASS_EXT(c) ((rb_classext_t *)((char *)(c) + sizeof(struct RClass)))
88
+ struct RClass_and_rb_classext_t {
89
+ struct RClass rclass;
90
+ rb_classext_t classext;
91
+ };
92
+
93
+ #define RCLASS_EXT(c) (&((struct RClass_and_rb_classext_t*)(c))->classext)
85
94
  #define RCLASS_CONST_TBL(c) (RCLASS_EXT(c)->const_tbl)
86
95
  #define RCLASS_M_TBL(c) (RCLASS(c)->m_tbl)
87
96
  #define RCLASS_IVPTR(c) (RCLASS_EXT(c)->iv_ptr)
@@ -143,7 +152,7 @@ static inline rb_alloc_func_t
143
152
  RCLASS_ALLOCATOR(VALUE klass)
144
153
  {
145
154
  if (FL_TEST_RAW(klass, FL_SINGLETON)) {
146
- return NULL;
155
+ return 0;
147
156
  }
148
157
  return RCLASS_EXT(klass)->as.class.allocator;
149
158
  }
@@ -23,11 +23,15 @@ typedef struct ruby_cmdline_options {
23
23
  ruby_features_t features;
24
24
  ruby_features_t warn;
25
25
  unsigned int dump;
26
+ long backtrace_length_limit;
26
27
  #if USE_RJIT
27
28
  struct rb_rjit_options rjit;
28
29
  #endif
29
30
 
30
- int sflag, xflag;
31
+ const char *crash_report;
32
+
33
+ signed int sflag: 2;
34
+ unsigned int xflag: 1;
31
35
  unsigned int warning: 1;
32
36
  unsigned int verbose: 1;
33
37
  unsigned int do_loop: 1;
@@ -17,7 +17,6 @@ struct rb_iseq_struct; /* in vm_core.h */
17
17
  /* compile.c */
18
18
  int rb_dvar_defined(ID, const struct rb_iseq_struct *);
19
19
  int rb_local_defined(ID, const struct rb_iseq_struct *);
20
- bool rb_insns_leaf_p(int i);
21
20
  int rb_insn_len(VALUE insn);
22
21
  const char *rb_insns_name(int i);
23
22
  VALUE rb_insns_name_array(void);