debase-ruby_core_source 0.10.14 → 0.10.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/debase-ruby_core_source.gemspec +1 -1
  3. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/addr2line.h +20 -0
  4. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/builtin.h +84 -0
  5. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/ccan/build_assert/build_assert.h +40 -0
  6. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/ccan/check_type/check_type.h +63 -0
  7. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/ccan/container_of/container_of.h +142 -0
  8. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/ccan/list/list.h +789 -0
  9. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/ccan/str/str.h +17 -0
  10. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/constant.h +55 -0
  11. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/darray.h +226 -0
  12. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/debug_counter.h +469 -0
  13. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/dln.h +31 -0
  14. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/encindex.h +70 -0
  15. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/eval_intern.h +339 -0
  16. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/gc.h +143 -0
  17. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/hrtime.h +216 -0
  18. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/id.h +295 -0
  19. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/id_table.h +36 -0
  20. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/insns.inc +249 -0
  21. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/insns_info.inc +9064 -0
  22. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/array.h +113 -0
  23. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/bignum.h +246 -0
  24. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/bits.h +565 -0
  25. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/class.h +211 -0
  26. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/cmdlineopt.h +61 -0
  27. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/compar.h +49 -0
  28. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/compile.h +35 -0
  29. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/compilers.h +107 -0
  30. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/complex.h +29 -0
  31. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/cont.h +24 -0
  32. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/dir.h +16 -0
  33. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/enc.h +19 -0
  34. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/encoding.h +30 -0
  35. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/enum.h +18 -0
  36. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/enumerator.h +21 -0
  37. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/error.h +191 -0
  38. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/eval.h +32 -0
  39. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/file.h +38 -0
  40. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/fixnum.h +184 -0
  41. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/gc.h +188 -0
  42. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/hash.h +243 -0
  43. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/imemo.h +243 -0
  44. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/inits.h +50 -0
  45. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/io.h +38 -0
  46. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/load.h +18 -0
  47. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/loadpath.h +16 -0
  48. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/math.h +23 -0
  49. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/missing.h +18 -0
  50. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/numeric.h +271 -0
  51. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/object.h +83 -0
  52. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/parse.h +23 -0
  53. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/proc.h +32 -0
  54. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/process.h +137 -0
  55. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/ractor.h +6 -0
  56. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/random.h +16 -0
  57. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/range.h +40 -0
  58. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/rational.h +72 -0
  59. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/re.h +30 -0
  60. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/sanitizers.h +190 -0
  61. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/serial.h +23 -0
  62. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/signal.h +21 -0
  63. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/static_assert.h +16 -0
  64. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/string.h +141 -0
  65. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/struct.h +153 -0
  66. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/symbol.h +41 -0
  67. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/thread.h +53 -0
  68. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/time.h +34 -0
  69. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/transcode.h +20 -0
  70. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/util.h +27 -0
  71. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/variable.h +83 -0
  72. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/vm.h +134 -0
  73. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal/warnings.h +16 -0
  74. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/internal.h +109 -0
  75. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/iseq.h +325 -0
  76. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/known_errors.inc +791 -0
  77. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/method.h +254 -0
  78. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/mjit.h +231 -0
  79. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/mjit_compile.inc +8333 -0
  80. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/node.h +510 -0
  81. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/node_name.inc +208 -0
  82. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/opt_sc.inc +109 -0
  83. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/optinsn.inc +128 -0
  84. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/optunifs.inc +43 -0
  85. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/parse.h +214 -0
  86. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/probes_helper.h +44 -0
  87. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/ractor_core.h +346 -0
  88. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/regenc.h +255 -0
  89. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/regint.h +957 -0
  90. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/regparse.h +370 -0
  91. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/revision.h +2 -0
  92. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/ruby_assert.h +14 -0
  93. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/ruby_atomic.h +23 -0
  94. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/siphash.h +48 -0
  95. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/symbol.h +119 -0
  96. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/thread_none.h +17 -0
  97. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/thread_pthread.h +115 -0
  98. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/thread_win32.h +61 -0
  99. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/timev.h +57 -0
  100. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/transcode_data.h +138 -0
  101. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/transient_heap.h +65 -0
  102. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/variable.h +21 -0
  103. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/version.h +91 -0
  104. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/vm.inc +5481 -0
  105. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/vm_call_iseq_optimized.inc +244 -0
  106. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/vm_callinfo.h +502 -0
  107. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/vm_core.h +2089 -0
  108. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/vm_debug.h +113 -0
  109. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/vm_exec.h +197 -0
  110. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/vm_insnhelper.h +262 -0
  111. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/vm_opts.h +73 -0
  112. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/vm_sync.h +137 -0
  113. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/vmtc.inc +243 -0
  114. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/yjit.h +73 -0
  115. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/yjit_asm.h +408 -0
  116. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/yjit_codegen.h +23 -0
  117. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/yjit_core.h +307 -0
  118. data/lib/debase/ruby_core_source/ruby-3.2.0-preview1/yjit_iface.h +38 -0
  119. data/lib/debase/ruby_core_source/version.rb +1 -1
  120. metadata +121 -5
@@ -0,0 +1,17 @@
1
+ /* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
2
+ #ifndef CCAN_STR_H
3
+ #define CCAN_STR_H
4
+ /**
5
+ * ccan_stringify - Turn expression into a string literal
6
+ * @expr: any C expression
7
+ *
8
+ * Example:
9
+ * #define PRINT_COND_IF_FALSE(cond) \
10
+ * ((cond) || printf("%s is false!", ccan_stringify(cond)))
11
+ */
12
+ #define stringify(expr) ccan_stringify_1(expr)
13
+ #define ccan_stringify(expr) ccan_stringify_1(expr)
14
+ /* Double-indirection required to stringify expansions */
15
+ #define ccan_stringify_1(expr) #expr
16
+
17
+ #endif /* CCAN_STR_H */
@@ -0,0 +1,55 @@
1
+ #ifndef CONSTANT_H
2
+ #define CONSTANT_H
3
+ /**********************************************************************
4
+
5
+ constant.h -
6
+
7
+ $Author$
8
+ created at: Sun Nov 15 00:09:33 2009
9
+
10
+ Copyright (C) 2009 Yusuke Endoh
11
+
12
+ **********************************************************************/
13
+ #include "ruby/ruby.h"
14
+ #include "id_table.h"
15
+
16
+ typedef enum {
17
+ CONST_DEPRECATED = 0x100,
18
+
19
+ CONST_VISIBILITY_MASK = 0xff,
20
+ CONST_PUBLIC = 0x00,
21
+ CONST_PRIVATE,
22
+ CONST_VISIBILITY_MAX
23
+ } rb_const_flag_t;
24
+
25
+ #define RB_CONST_PRIVATE_P(ce) \
26
+ (((ce)->flag & CONST_VISIBILITY_MASK) == CONST_PRIVATE)
27
+ #define RB_CONST_PUBLIC_P(ce) \
28
+ (((ce)->flag & CONST_VISIBILITY_MASK) == CONST_PUBLIC)
29
+
30
+ #define RB_CONST_DEPRECATED_P(ce) \
31
+ ((ce)->flag & CONST_DEPRECATED)
32
+
33
+ typedef struct rb_const_entry_struct {
34
+ rb_const_flag_t flag;
35
+ int line;
36
+ VALUE value; /* should be mark */
37
+ VALUE file; /* should be mark */
38
+ } rb_const_entry_t;
39
+
40
+ VALUE rb_mod_private_constant(int argc, const VALUE *argv, VALUE obj);
41
+ VALUE rb_mod_public_constant(int argc, const VALUE *argv, VALUE obj);
42
+ VALUE rb_mod_deprecate_constant(int argc, const VALUE *argv, VALUE obj);
43
+ void rb_free_const_table(struct rb_id_table *tbl);
44
+ VALUE rb_const_source_location(VALUE, ID);
45
+
46
+ MJIT_SYMBOL_EXPORT_BEGIN
47
+ int rb_autoloading_value(VALUE mod, ID id, VALUE *value, rb_const_flag_t *flag);
48
+ rb_const_entry_t *rb_const_lookup(VALUE klass, ID id);
49
+ VALUE rb_public_const_get_at(VALUE klass, ID id);
50
+ VALUE rb_public_const_get_from(VALUE klass, ID id);
51
+ int rb_public_const_defined_from(VALUE klass, ID id);
52
+ VALUE rb_const_source_location_at(VALUE, ID);
53
+ MJIT_SYMBOL_EXPORT_END
54
+
55
+ #endif /* CONSTANT_H */
@@ -0,0 +1,226 @@
1
+ #ifndef RUBY_DARRAY_H
2
+ #define RUBY_DARRAY_H
3
+
4
+ #include <stdint.h>
5
+ #include <stddef.h>
6
+ #include <stdlib.h>
7
+
8
+ // Type for a dynamic array. Use to declare a dynamic array.
9
+ // It is a pointer so it fits in st_table nicely. Designed
10
+ // to be fairly type-safe.
11
+ //
12
+ // NULL is a valid empty dynamic array.
13
+ //
14
+ // Example:
15
+ // rb_darray(char) char_array = NULL;
16
+ // rb_darray_append(&char_array, 'e');
17
+ // printf("pushed %c\n", *rb_darray_ref(char_array, 0));
18
+ // rb_darray_free(char_array);
19
+ //
20
+ #define rb_darray(T) struct { rb_darray_meta_t meta; T data[]; } *
21
+
22
+ // Copy an element out of the array. Warning: not bounds checked.
23
+ //
24
+ // T rb_darray_get(rb_darray(T) ary, size_t idx);
25
+ //
26
+ #define rb_darray_get(ary, idx) ((ary)->data[(idx)])
27
+
28
+ // Assign to an element. Warning: not bounds checked.
29
+ //
30
+ // void rb_darray_set(rb_darray(T) ary, size_t idx, T element);
31
+ //
32
+ #define rb_darray_set(ary, idx, element) ((ary)->data[(idx)] = (element))
33
+
34
+ // Get a pointer to an element. Warning: not bounds checked.
35
+ //
36
+ // T *rb_darray_ref(rb_darray(T) ary, size_t idx);
37
+ //
38
+ #define rb_darray_ref(ary, idx) (&((ary)->data[(idx)]))
39
+
40
+ // Copy a new element into the array. ptr_to_ary is evaluated multiple times.
41
+ //
42
+ // void rb_darray_append(rb_darray(T) *ptr_to_ary, T element);
43
+ //
44
+ // TODO: replace this with rb_darray_append_with_gc when YJIT moves to Rust.
45
+ //
46
+ #define rb_darray_append(ptr_to_ary, element) do { \
47
+ rb_darray_ensure_space((ptr_to_ary), sizeof(**(ptr_to_ary)), \
48
+ sizeof((*(ptr_to_ary))->data[0]), realloc); \
49
+ rb_darray_set(*(ptr_to_ary), \
50
+ (*(ptr_to_ary))->meta.size, \
51
+ (element)); \
52
+ (*(ptr_to_ary))->meta.size++; \
53
+ } while (0)
54
+
55
+ #define rb_darray_append_with_gc(ptr_to_ary, element) do { \
56
+ rb_darray_ensure_space((ptr_to_ary), sizeof(**(ptr_to_ary)), \
57
+ sizeof((*(ptr_to_ary))->data[0]), ruby_xrealloc); \
58
+ rb_darray_set(*(ptr_to_ary), \
59
+ (*(ptr_to_ary))->meta.size, \
60
+ (element)); \
61
+ (*(ptr_to_ary))->meta.size++; \
62
+ } while (0)
63
+
64
+
65
+ // Last element of the array
66
+ //
67
+ #define rb_darray_back(ary) ((ary)->data[(ary)->meta.size - 1])
68
+
69
+ // Remove the last element of the array.
70
+ //
71
+ #define rb_darray_pop_back(ary) ((ary)->meta.size--)
72
+
73
+ // Remove element at idx and replace it by the last element
74
+ #define rb_darray_remove_unordered(ary, idx) do { \
75
+ rb_darray_set(ary, idx, rb_darray_back(ary)); \
76
+ rb_darray_pop_back(ary); \
77
+ } while (0);
78
+
79
+ // Iterate over items of the array in a for loop
80
+ //
81
+ #define rb_darray_foreach(ary, idx_name, elem_ptr_var) \
82
+ for (size_t idx_name = 0; idx_name < rb_darray_size(ary) && ((elem_ptr_var) = rb_darray_ref(ary, idx_name)); ++idx_name)
83
+
84
+ // Iterate over valid indicies in the array in a for loop
85
+ //
86
+ #define rb_darray_for(ary, idx_name) \
87
+ for (size_t idx_name = 0; idx_name < rb_darray_size(ary); ++idx_name)
88
+
89
+ // Make a dynamic array of a certain size. All bytes backing the elements are set to zero.
90
+ // Return 1 on success and 0 on failure.
91
+ //
92
+ // Note that NULL is a valid empty dynamic array.
93
+ //
94
+ // void rb_darray_make(rb_darray(T) *ptr_to_ary, size_t size);
95
+ //
96
+ // TODO: replace this with rb_darray_make_with_gc with YJIT moves to Rust.
97
+ //
98
+ #define rb_darray_make(ptr_to_ary, size) \
99
+ rb_darray_make_impl((ptr_to_ary), size, sizeof(**(ptr_to_ary)), \
100
+ sizeof((*(ptr_to_ary))->data[0]), calloc)
101
+
102
+
103
+ #define rb_darray_make_with_gc(ptr_to_ary, size) \
104
+ rb_darray_make_impl((ptr_to_ary), size, sizeof(**(ptr_to_ary)), \
105
+ sizeof((*(ptr_to_ary))->data[0]), ruby_xcalloc)
106
+
107
+ #define rb_darray_data_ptr(ary) ((ary)->data)
108
+
109
+ // Set the size of the array to zero without freeing the backing memory.
110
+ // Allows reusing the same array.
111
+ //
112
+ #define rb_darray_clear(ary) (ary->meta.size = 0)
113
+
114
+ typedef struct rb_darray_meta {
115
+ size_t size;
116
+ size_t capa;
117
+ } rb_darray_meta_t;
118
+
119
+ // Get the size of the dynamic array.
120
+ //
121
+ static inline size_t
122
+ rb_darray_size(const void *ary)
123
+ {
124
+ const rb_darray_meta_t *meta = ary;
125
+ return meta ? meta->size : 0;
126
+ }
127
+
128
+ // Get the capacity of the dynamic array.
129
+ //
130
+ static inline size_t
131
+ rb_darray_capa(const void *ary)
132
+ {
133
+ const rb_darray_meta_t *meta = ary;
134
+ return meta ? meta->capa : 0;
135
+ }
136
+
137
+ // Free the dynamic array.
138
+ //
139
+ // TODO: replace this with rb_darray_free_with_gc when YJIT moves to Rust.
140
+ //
141
+ static inline void
142
+ rb_darray_free(void *ary)
143
+ {
144
+ free(ary);
145
+ }
146
+
147
+ static inline void
148
+ rb_darray_free_with_gc(void *ary)
149
+ {
150
+ rb_darray_meta_t *meta = ary;
151
+ ruby_sized_xfree(ary, meta->capa);
152
+ }
153
+
154
+ // Internal function. Calculate buffer size on malloc heap.
155
+ static inline size_t
156
+ rb_darray_buffer_size(size_t capacity, size_t header_size, size_t element_size)
157
+ {
158
+ if (capacity == 0) return 0;
159
+ return header_size + capacity * element_size;
160
+ }
161
+
162
+ // Internal function
163
+ // Ensure there is space for one more element.
164
+ // Note: header_size can be bigger than sizeof(rb_darray_meta_t) when T is __int128_t, for example.
165
+ static inline void
166
+ rb_darray_ensure_space(void *ptr_to_ary, size_t header_size, size_t element_size, void *(*realloc_impl)(void *, size_t))
167
+ {
168
+ rb_darray_meta_t **ptr_to_ptr_to_meta = ptr_to_ary;
169
+ rb_darray_meta_t *meta = *ptr_to_ptr_to_meta;
170
+ size_t current_capa = rb_darray_capa(meta);
171
+ if (rb_darray_size(meta) < current_capa) return;
172
+
173
+ // Double the capacity
174
+ size_t new_capa = current_capa == 0 ? 1 : current_capa * 2;
175
+
176
+ // Calculate new buffer size
177
+ size_t current_buffer_size = rb_darray_buffer_size(current_capa, header_size, element_size);
178
+ size_t new_buffer_size = rb_darray_buffer_size(new_capa, header_size, element_size);
179
+ if (new_buffer_size <= current_buffer_size) {
180
+ rb_bug("rb_darray_ensure_space: overflow");
181
+ }
182
+
183
+ // TODO: replace with rb_xrealloc_mul_add(meta, new_capa, element_size, header_size);
184
+ rb_darray_meta_t *doubled_ary = realloc_impl(meta, new_buffer_size);
185
+ if (!doubled_ary) {
186
+ rb_bug("rb_darray_ensure_space: failed");
187
+ }
188
+
189
+ if (meta == NULL) {
190
+ // First allocation. Initialize size. On subsequence allocations
191
+ // realloc takes care of carrying over the size.
192
+ doubled_ary->size = 0;
193
+ }
194
+
195
+ doubled_ary->capa = new_capa;
196
+
197
+ // We don't have access to the type of the dynamic array in function context.
198
+ // Write out result with memcpy to avoid strict aliasing issue.
199
+ memcpy(ptr_to_ary, &doubled_ary, sizeof(doubled_ary));
200
+ }
201
+
202
+ static inline void
203
+ rb_darray_make_impl(void *ptr_to_ary, size_t array_size, size_t header_size, size_t element_size, void *(*calloc_impl)(size_t, size_t))
204
+ {
205
+ rb_darray_meta_t **ptr_to_ptr_to_meta = ptr_to_ary;
206
+ if (array_size == 0) {
207
+ *ptr_to_ptr_to_meta = NULL;
208
+ return;
209
+ }
210
+
211
+ // TODO: replace with rb_xcalloc_mul_add(array_size, element_size, header_size)
212
+ size_t buffer_size = rb_darray_buffer_size(array_size, header_size, element_size);
213
+ rb_darray_meta_t *meta = calloc_impl(buffer_size, 1);
214
+ if (!meta) {
215
+ rb_bug("rb_darray_make_impl: failed");
216
+ }
217
+
218
+ meta->size = array_size;
219
+ meta->capa = array_size;
220
+
221
+ // We don't have access to the type of the dynamic array in function context.
222
+ // Write out result with memcpy to avoid strict aliasing issue.
223
+ memcpy(ptr_to_ary, &meta, sizeof(meta));
224
+ }
225
+
226
+ #endif /* RUBY_DARRAY_H */