debase-ruby_core_source 3.2.0 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +5 -0
  4. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/addr2line.h +20 -0
  5. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/builtin.h +117 -0
  6. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/ccan/build_assert/build_assert.h +40 -0
  7. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/ccan/check_type/check_type.h +63 -0
  8. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/ccan/container_of/container_of.h +142 -0
  9. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/ccan/list/list.h +789 -0
  10. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/ccan/str/str.h +17 -0
  11. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/constant.h +53 -0
  12. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/darray.h +179 -0
  13. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/debug_counter.h +426 -0
  14. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/dln.h +31 -0
  15. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/encindex.h +70 -0
  16. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/eval_intern.h +339 -0
  17. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/hrtime.h +227 -0
  18. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/id.h +299 -0
  19. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/id_table.h +39 -0
  20. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/insns.inc +249 -0
  21. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/insns_info.inc +9159 -0
  22. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/array.h +162 -0
  23. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/basic_operators.h +63 -0
  24. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/bignum.h +244 -0
  25. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/bits.h +564 -0
  26. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/class.h +221 -0
  27. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/cmdlineopt.h +61 -0
  28. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/compar.h +29 -0
  29. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/compile.h +35 -0
  30. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/compilers.h +107 -0
  31. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/complex.h +29 -0
  32. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/cont.h +32 -0
  33. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/dir.h +16 -0
  34. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/enc.h +19 -0
  35. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/encoding.h +32 -0
  36. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/enum.h +18 -0
  37. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/enumerator.h +21 -0
  38. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/error.h +191 -0
  39. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/eval.h +32 -0
  40. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/file.h +38 -0
  41. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/fixnum.h +184 -0
  42. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/gc.h +333 -0
  43. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/hash.h +216 -0
  44. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/imemo.h +241 -0
  45. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/inits.h +50 -0
  46. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/io.h +38 -0
  47. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/load.h +18 -0
  48. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/loadpath.h +16 -0
  49. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/math.h +23 -0
  50. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/missing.h +18 -0
  51. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/numeric.h +273 -0
  52. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/object.h +59 -0
  53. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/parse.h +25 -0
  54. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/proc.h +30 -0
  55. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/process.h +138 -0
  56. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/ractor.h +6 -0
  57. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/random.h +16 -0
  58. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/range.h +40 -0
  59. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/rational.h +71 -0
  60. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/re.h +28 -0
  61. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/sanitizers.h +186 -0
  62. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/serial.h +23 -0
  63. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/signal.h +21 -0
  64. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/static_assert.h +16 -0
  65. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/string.h +145 -0
  66. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/struct.h +152 -0
  67. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/symbol.h +42 -0
  68. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/thread.h +61 -0
  69. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/time.h +34 -0
  70. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/transcode.h +20 -0
  71. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/util.h +27 -0
  72. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/variable.h +88 -0
  73. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/vm.h +124 -0
  74. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal/warnings.h +16 -0
  75. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/internal.h +112 -0
  76. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/iseq.h +334 -0
  77. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/known_errors.inc +791 -0
  78. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/method.h +254 -0
  79. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/node.h +514 -0
  80. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/node_name.inc +210 -0
  81. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/opt_sc.inc +109 -0
  82. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/optinsn.inc +128 -0
  83. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/optunifs.inc +43 -0
  84. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/parse.h +230 -0
  85. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/probes_helper.h +42 -0
  86. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/ractor_core.h +387 -0
  87. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/regenc.h +254 -0
  88. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/regint.h +996 -0
  89. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/regparse.h +370 -0
  90. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/revision.h +5 -0
  91. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/rjit.h +103 -0
  92. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/rjit_c.h +165 -0
  93. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/ruby_assert.h +14 -0
  94. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/ruby_atomic.h +23 -0
  95. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/shape.h +232 -0
  96. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/siphash.h +48 -0
  97. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/symbol.h +119 -0
  98. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/thread_none.h +20 -0
  99. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/thread_pthread.h +128 -0
  100. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/thread_win32.h +63 -0
  101. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/timev.h +58 -0
  102. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/transcode_data.h +138 -0
  103. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/transient_heap.h +65 -0
  104. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/variable.h +30 -0
  105. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/version.h +65 -0
  106. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/vm.inc +5497 -0
  107. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/vm_call_iseq_optimized.inc +244 -0
  108. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/vm_callinfo.h +574 -0
  109. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/vm_core.h +2107 -0
  110. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/vm_debug.h +122 -0
  111. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/vm_exec.h +198 -0
  112. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/vm_insnhelper.h +274 -0
  113. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/vm_opts.h +72 -0
  114. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/vm_sync.h +137 -0
  115. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/vmtc.inc +243 -0
  116. data/lib/debase/ruby_core_source/ruby-3.3.0-preview1/yjit.h +72 -0
  117. data/lib/debase/ruby_core_source/version.rb +1 -1
  118. metadata +116 -3
@@ -0,0 +1,162 @@
1
+ #ifndef INTERNAL_ARRAY_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_ARRAY_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 Array.
10
+ */
11
+ #include "ruby/internal/config.h"
12
+ #include <stddef.h> /* for size_t */
13
+ #include "internal/static_assert.h" /* for STATIC_ASSERT */
14
+ #include "ruby/internal/stdbool.h" /* for bool */
15
+ #include "ruby/ruby.h" /* for RARRAY_LEN */
16
+
17
+ #ifndef ARRAY_DEBUG
18
+ # define ARRAY_DEBUG (0+RUBY_DEBUG)
19
+ #endif
20
+
21
+ #define RARRAY_SHARED_FLAG ELTS_SHARED
22
+ #define RARRAY_SHARED_ROOT_FLAG FL_USER12
23
+ #define RARRAY_PTR_IN_USE_FLAG FL_USER14
24
+
25
+ /* array.c */
26
+ VALUE rb_ary_hash_values(long len, const VALUE *elements);
27
+ VALUE rb_ary_last(int, const VALUE *, VALUE);
28
+ void rb_ary_set_len(VALUE, long);
29
+ void rb_ary_delete_same(VALUE, VALUE);
30
+ VALUE rb_ary_hidden_new_fill(long capa);
31
+ VALUE rb_ary_at(VALUE, VALUE);
32
+ size_t rb_ary_memsize(VALUE);
33
+ VALUE rb_to_array_type(VALUE obj);
34
+ VALUE rb_to_array(VALUE obj);
35
+ void rb_ary_cancel_sharing(VALUE ary);
36
+ size_t rb_ary_size_as_embedded(VALUE ary);
37
+ void rb_ary_make_embedded(VALUE ary);
38
+ bool rb_ary_embeddable_p(VALUE ary);
39
+ VALUE rb_ary_diff(VALUE ary1, VALUE ary2);
40
+
41
+ static inline VALUE rb_ary_entry_internal(VALUE ary, long offset);
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
+
46
+ VALUE rb_ary_tmp_new_from_values(VALUE, long, const VALUE *);
47
+ VALUE rb_check_to_array(VALUE ary);
48
+ VALUE rb_ary_behead(VALUE, long);
49
+ VALUE rb_ary_aref1(VALUE ary, VALUE i);
50
+
51
+ struct rb_execution_context_struct;
52
+ VALUE rb_ec_ary_new_from_values(struct rb_execution_context_struct *ec, long n, const VALUE *elts);
53
+
54
+ // YJIT needs this function to never allocate and never raise
55
+ static inline VALUE
56
+ rb_ary_entry_internal(VALUE ary, long offset)
57
+ {
58
+ long len = RARRAY_LEN(ary);
59
+ const VALUE *ptr = RARRAY_CONST_PTR_TRANSIENT(ary);
60
+ if (len == 0) return Qnil;
61
+ if (offset < 0) {
62
+ offset += len;
63
+ if (offset < 0) return Qnil;
64
+ }
65
+ else if (len <= offset) {
66
+ return Qnil;
67
+ }
68
+ return ptr[offset];
69
+ }
70
+
71
+ static inline bool
72
+ ARY_PTR_USING_P(VALUE ary)
73
+ {
74
+ return FL_TEST_RAW(ary, RARRAY_PTR_IN_USE_FLAG);
75
+ }
76
+
77
+ RBIMPL_ATTR_MAYBE_UNUSED()
78
+ static inline int
79
+ ary_should_not_be_shared_and_embedded(VALUE ary)
80
+ {
81
+ return !FL_ALL_RAW(ary, RARRAY_SHARED_FLAG|RARRAY_EMBED_FLAG);
82
+ }
83
+
84
+ static inline bool
85
+ ARY_SHARED_P(VALUE ary)
86
+ {
87
+ assert(RB_TYPE_P(ary, T_ARRAY));
88
+ assert(ary_should_not_be_shared_and_embedded(ary));
89
+ return FL_TEST_RAW(ary, RARRAY_SHARED_FLAG);
90
+ }
91
+
92
+ static inline bool
93
+ ARY_EMBED_P(VALUE ary)
94
+ {
95
+ assert(RB_TYPE_P(ary, T_ARRAY));
96
+ assert(ary_should_not_be_shared_and_embedded(ary));
97
+ return FL_TEST_RAW(ary, RARRAY_EMBED_FLAG);
98
+ }
99
+
100
+ static inline VALUE
101
+ ARY_SHARED_ROOT(VALUE ary)
102
+ {
103
+ assert(ARY_SHARED_P(ary));
104
+ return RARRAY(ary)->as.heap.aux.shared_root;
105
+ }
106
+
107
+ static inline bool
108
+ ARY_SHARED_ROOT_P(VALUE ary)
109
+ {
110
+ assert(RB_TYPE_P(ary, T_ARRAY));
111
+ return FL_TEST_RAW(ary, RARRAY_SHARED_ROOT_FLAG);
112
+ }
113
+
114
+ static inline long
115
+ ARY_SHARED_ROOT_REFCNT(VALUE ary)
116
+ {
117
+ assert(ARY_SHARED_ROOT_P(ary));
118
+ return RARRAY(ary)->as.heap.aux.capa;
119
+ }
120
+
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
+ #undef rb_ary_new_from_args
138
+ #if RBIMPL_HAS_WARNING("-Wgnu-zero-variadic-macro-arguments")
139
+ # /* Skip it; clang -pedantic doesn't like the following */
140
+ #elif defined(__GNUC__) && defined(HAVE_VA_ARGS_MACRO)
141
+ #define rb_ary_new_from_args(n, ...) \
142
+ __extension__ ({ \
143
+ const VALUE args_to_new_ary[] = {__VA_ARGS__}; \
144
+ if (__builtin_constant_p(n)) { \
145
+ STATIC_ASSERT(rb_ary_new_from_args, numberof(args_to_new_ary) == (n)); \
146
+ } \
147
+ rb_ary_new_from_values(numberof(args_to_new_ary), args_to_new_ary); \
148
+ })
149
+ #endif
150
+
151
+ #undef RARRAY_AREF
152
+ RBIMPL_ATTR_PURE_UNLESS_DEBUG()
153
+ RBIMPL_ATTR_ARTIFICIAL()
154
+ static inline VALUE
155
+ RARRAY_AREF(VALUE ary, long i)
156
+ {
157
+ RBIMPL_ASSERT_TYPE(ary, RUBY_T_ARRAY);
158
+
159
+ return RARRAY_CONST_PTR_TRANSIENT(ary)[i];
160
+ }
161
+
162
+ #endif /* INTERNAL_ARRAY_H */
@@ -0,0 +1,63 @@
1
+ #ifndef INTERNAL_BOP_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_BOP_H
3
+
4
+ #include "internal.h"
5
+ #include "ruby/internal/dllexport.h"
6
+
7
+ enum ruby_basic_operators {
8
+ BOP_PLUS,
9
+ BOP_MINUS,
10
+ BOP_MULT,
11
+ BOP_DIV,
12
+ BOP_MOD,
13
+ BOP_EQ,
14
+ BOP_EQQ,
15
+ BOP_LT,
16
+ BOP_LE,
17
+ BOP_LTLT,
18
+ BOP_AREF,
19
+ BOP_ASET,
20
+ BOP_LENGTH,
21
+ BOP_SIZE,
22
+ BOP_EMPTY_P,
23
+ BOP_NIL_P,
24
+ BOP_SUCC,
25
+ BOP_GT,
26
+ BOP_GE,
27
+ BOP_NOT,
28
+ BOP_NEQ,
29
+ BOP_MATCH,
30
+ BOP_FREEZE,
31
+ BOP_UMINUS,
32
+ BOP_MAX,
33
+ BOP_MIN,
34
+ BOP_HASH,
35
+ BOP_CALL,
36
+ BOP_AND,
37
+ BOP_OR,
38
+ BOP_CMP,
39
+ BOP_DEFAULT,
40
+
41
+ BOP_LAST_
42
+ };
43
+
44
+ RUBY_EXTERN short ruby_vm_redefined_flag[BOP_LAST_];
45
+
46
+ /* optimize insn */
47
+ #define INTEGER_REDEFINED_OP_FLAG (1 << 0)
48
+ #define FLOAT_REDEFINED_OP_FLAG (1 << 1)
49
+ #define STRING_REDEFINED_OP_FLAG (1 << 2)
50
+ #define ARRAY_REDEFINED_OP_FLAG (1 << 3)
51
+ #define HASH_REDEFINED_OP_FLAG (1 << 4)
52
+ /* #define BIGNUM_REDEFINED_OP_FLAG (1 << 5) */
53
+ #define SYMBOL_REDEFINED_OP_FLAG (1 << 6)
54
+ #define TIME_REDEFINED_OP_FLAG (1 << 7)
55
+ #define REGEXP_REDEFINED_OP_FLAG (1 << 8)
56
+ #define NIL_REDEFINED_OP_FLAG (1 << 9)
57
+ #define TRUE_REDEFINED_OP_FLAG (1 << 10)
58
+ #define FALSE_REDEFINED_OP_FLAG (1 << 11)
59
+ #define PROC_REDEFINED_OP_FLAG (1 << 12)
60
+
61
+ #define BASIC_OP_UNREDEFINED_P(op, klass) (LIKELY((ruby_vm_redefined_flag[(op)]&(klass)) == 0))
62
+
63
+ #endif
@@ -0,0 +1,244 @@
1
+ #ifndef INTERNAL_BIGNUM_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_BIGNUM_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 Bignums.
10
+ */
11
+ #include "ruby/internal/config.h" /* for HAVE_LIBGMP */
12
+ #include <stddef.h> /* for size_t */
13
+
14
+ #ifdef HAVE_SYS_TYPES_H
15
+ # include <sys/types.h> /* for ssize_t (note: on Windows ssize_t is */
16
+ #endif /* `#define`d in ruby/config.h) */
17
+
18
+ #include "ruby/internal/stdbool.h" /* for bool */
19
+ #include "ruby/ruby.h" /* for struct RBasic */
20
+
21
+ #ifndef BDIGIT
22
+ # if SIZEOF_INT*2 <= SIZEOF_LONG_LONG
23
+ # define BDIGIT unsigned int
24
+ # define SIZEOF_BDIGIT SIZEOF_INT
25
+ # define BDIGIT_DBL unsigned LONG_LONG
26
+ # define BDIGIT_DBL_SIGNED LONG_LONG
27
+ # define PRI_BDIGIT_PREFIX ""
28
+ # define PRI_BDIGIT_DBL_PREFIX PRI_LL_PREFIX
29
+ # elif SIZEOF_INT*2 <= SIZEOF_LONG
30
+ # define BDIGIT unsigned int
31
+ # define SIZEOF_BDIGIT SIZEOF_INT
32
+ # define BDIGIT_DBL unsigned long
33
+ # define BDIGIT_DBL_SIGNED long
34
+ # define PRI_BDIGIT_PREFIX ""
35
+ # define PRI_BDIGIT_DBL_PREFIX "l"
36
+ # elif SIZEOF_SHORT*2 <= SIZEOF_LONG
37
+ # define BDIGIT unsigned short
38
+ # define SIZEOF_BDIGIT SIZEOF_SHORT
39
+ # define BDIGIT_DBL unsigned long
40
+ # define BDIGIT_DBL_SIGNED long
41
+ # define PRI_BDIGIT_PREFIX "h"
42
+ # define PRI_BDIGIT_DBL_PREFIX "l"
43
+ # else
44
+ # define BDIGIT unsigned short
45
+ # define SIZEOF_BDIGIT (SIZEOF_LONG/2)
46
+ # define SIZEOF_ACTUAL_BDIGIT SIZEOF_LONG
47
+ # define BDIGIT_DBL unsigned long
48
+ # define BDIGIT_DBL_SIGNED long
49
+ # define PRI_BDIGIT_PREFIX "h"
50
+ # define PRI_BDIGIT_DBL_PREFIX "l"
51
+ # endif
52
+ #endif
53
+
54
+ #ifndef SIZEOF_ACTUAL_BDIGIT
55
+ # define SIZEOF_ACTUAL_BDIGIT SIZEOF_BDIGIT
56
+ #endif
57
+
58
+ #ifdef PRI_BDIGIT_PREFIX
59
+ # define PRIdBDIGIT PRI_BDIGIT_PREFIX"d"
60
+ # define PRIiBDIGIT PRI_BDIGIT_PREFIX"i"
61
+ # define PRIoBDIGIT PRI_BDIGIT_PREFIX"o"
62
+ # define PRIuBDIGIT PRI_BDIGIT_PREFIX"u"
63
+ # define PRIxBDIGIT PRI_BDIGIT_PREFIX"x"
64
+ # define PRIXBDIGIT PRI_BDIGIT_PREFIX"X"
65
+ #endif
66
+
67
+ #ifdef PRI_BDIGIT_DBL_PREFIX
68
+ # define PRIdBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"d"
69
+ # define PRIiBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"i"
70
+ # define PRIoBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"o"
71
+ # define PRIuBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"u"
72
+ # define PRIxBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"x"
73
+ # define PRIXBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"X"
74
+ #endif
75
+
76
+ #define RBIGNUM(obj) ((struct RBignum *)(obj))
77
+ #define BIGNUM_SIGN_BIT FL_USER1
78
+ #define BIGNUM_EMBED_FLAG ((VALUE)FL_USER2)
79
+ #define BIGNUM_EMBED_LEN_NUMBITS 3
80
+ #define BIGNUM_EMBED_LEN_MASK \
81
+ (~(~(VALUE)0U << BIGNUM_EMBED_LEN_NUMBITS) << BIGNUM_EMBED_LEN_SHIFT)
82
+ #define BIGNUM_EMBED_LEN_SHIFT \
83
+ (FL_USHIFT+3) /* bit offset of BIGNUM_EMBED_LEN_MASK */
84
+ #ifndef BIGNUM_EMBED_LEN_MAX
85
+ # if (SIZEOF_VALUE*RBIMPL_RVALUE_EMBED_LEN_MAX/SIZEOF_ACTUAL_BDIGIT) < (1 << BIGNUM_EMBED_LEN_NUMBITS)-1
86
+ # define BIGNUM_EMBED_LEN_MAX (SIZEOF_VALUE*RBIMPL_RVALUE_EMBED_LEN_MAX/SIZEOF_ACTUAL_BDIGIT)
87
+ # else
88
+ # define BIGNUM_EMBED_LEN_MAX ((1 << BIGNUM_EMBED_LEN_NUMBITS)-1)
89
+ # endif
90
+ #endif
91
+
92
+ enum rb_int_parse_flags {
93
+ RB_INT_PARSE_SIGN = 0x01,
94
+ RB_INT_PARSE_UNDERSCORE = 0x02,
95
+ RB_INT_PARSE_PREFIX = 0x04,
96
+ RB_INT_PARSE_ALL = 0x07,
97
+ RB_INT_PARSE_DEFAULT = 0x07,
98
+ };
99
+
100
+ struct RBignum {
101
+ struct RBasic basic;
102
+ union {
103
+ struct {
104
+ size_t len;
105
+ BDIGIT *digits;
106
+ } heap;
107
+ BDIGIT ary[BIGNUM_EMBED_LEN_MAX];
108
+ } as;
109
+ };
110
+
111
+ /* bignum.c */
112
+ extern const char ruby_digitmap[];
113
+ double rb_big_fdiv_double(VALUE x, VALUE y);
114
+ VALUE rb_big_uminus(VALUE x);
115
+ VALUE rb_big_hash(VALUE);
116
+ VALUE rb_big_odd_p(VALUE);
117
+ VALUE rb_big_even_p(VALUE);
118
+ size_t rb_big_size(VALUE);
119
+ VALUE rb_integer_float_cmp(VALUE x, VALUE y);
120
+ VALUE rb_integer_float_eq(VALUE x, VALUE y);
121
+ VALUE rb_str_convert_to_inum(VALUE str, int base, int badcheck, int raise_exception);
122
+ VALUE rb_big_comp(VALUE x);
123
+ VALUE rb_big_aref(VALUE x, VALUE y);
124
+ VALUE rb_big_abs(VALUE x);
125
+ VALUE rb_big_size_m(VALUE big);
126
+ VALUE rb_big_bit_length(VALUE big);
127
+ VALUE rb_big_remainder(VALUE x, VALUE y);
128
+ VALUE rb_big_gt(VALUE x, VALUE y);
129
+ VALUE rb_big_ge(VALUE x, VALUE y);
130
+ VALUE rb_big_lt(VALUE x, VALUE y);
131
+ VALUE rb_big_le(VALUE x, VALUE y);
132
+ VALUE rb_int_powm(int const argc, VALUE * const argv, VALUE const num);
133
+ VALUE rb_big_isqrt(VALUE n);
134
+ static inline bool BIGNUM_SIGN(VALUE b);
135
+ static inline bool BIGNUM_POSITIVE_P(VALUE b);
136
+ static inline bool BIGNUM_NEGATIVE_P(VALUE b);
137
+ static inline void BIGNUM_SET_SIGN(VALUE b, bool sign);
138
+ static inline void BIGNUM_NEGATE(VALUE b);
139
+ static inline size_t BIGNUM_LEN(VALUE b);
140
+ static inline BDIGIT *BIGNUM_DIGITS(VALUE b);
141
+ static inline int BIGNUM_LENINT(VALUE b);
142
+ static inline bool BIGNUM_EMBED_P(VALUE b);
143
+
144
+ RUBY_SYMBOL_EXPORT_BEGIN
145
+ /* bignum.c (export) */
146
+ VALUE rb_big_mul_normal(VALUE x, VALUE y);
147
+ VALUE rb_big_mul_balance(VALUE x, VALUE y);
148
+ VALUE rb_big_mul_karatsuba(VALUE x, VALUE y);
149
+ VALUE rb_big_mul_toom3(VALUE x, VALUE y);
150
+ VALUE rb_big_sq_fast(VALUE x);
151
+ VALUE rb_big_divrem_normal(VALUE x, VALUE y);
152
+ VALUE rb_big2str_poweroftwo(VALUE x, int base);
153
+ VALUE rb_big2str_generic(VALUE x, int base);
154
+ VALUE rb_str2big_poweroftwo(VALUE arg, int base, int badcheck);
155
+ VALUE rb_str2big_normal(VALUE arg, int base, int badcheck);
156
+ VALUE rb_str2big_karatsuba(VALUE arg, int base, int badcheck);
157
+ #if defined(HAVE_LIBGMP) && defined(HAVE_GMP_H)
158
+ VALUE rb_big_mul_gmp(VALUE x, VALUE y);
159
+ VALUE rb_big_divrem_gmp(VALUE x, VALUE y);
160
+ VALUE rb_big2str_gmp(VALUE x, int base);
161
+ VALUE rb_str2big_gmp(VALUE arg, int base, int badcheck);
162
+ #endif
163
+ VALUE rb_int_parse_cstr(const char *str, ssize_t len, char **endp, size_t *ndigits, int base, int flags);
164
+ RUBY_SYMBOL_EXPORT_END
165
+
166
+ #if defined(HAVE_INT128_T)
167
+ VALUE rb_int128t2big(int128_t n);
168
+ #endif
169
+
170
+ /* sign: positive:1, negative:0 */
171
+ static inline bool
172
+ BIGNUM_SIGN(VALUE b)
173
+ {
174
+ return FL_TEST_RAW(b, BIGNUM_SIGN_BIT);
175
+ }
176
+
177
+ static inline bool
178
+ BIGNUM_POSITIVE_P(VALUE b)
179
+ {
180
+ return BIGNUM_SIGN(b);
181
+ }
182
+
183
+ static inline bool
184
+ BIGNUM_NEGATIVE_P(VALUE b)
185
+ {
186
+ return ! BIGNUM_POSITIVE_P(b);
187
+ }
188
+
189
+ static inline void
190
+ BIGNUM_SET_SIGN(VALUE b, bool sign)
191
+ {
192
+ if (sign) {
193
+ FL_SET_RAW(b, BIGNUM_SIGN_BIT);
194
+ }
195
+ else {
196
+ FL_UNSET_RAW(b, BIGNUM_SIGN_BIT);
197
+ }
198
+ }
199
+
200
+ static inline void
201
+ BIGNUM_NEGATE(VALUE b)
202
+ {
203
+ FL_REVERSE_RAW(b, BIGNUM_SIGN_BIT);
204
+ }
205
+
206
+ static inline size_t
207
+ BIGNUM_LEN(VALUE b)
208
+ {
209
+ if (! BIGNUM_EMBED_P(b)) {
210
+ return RBIGNUM(b)->as.heap.len;
211
+ }
212
+ else {
213
+ size_t ret = RBASIC(b)->flags;
214
+ ret &= BIGNUM_EMBED_LEN_MASK;
215
+ ret >>= BIGNUM_EMBED_LEN_SHIFT;
216
+ return ret;
217
+ }
218
+ }
219
+
220
+ static inline int
221
+ BIGNUM_LENINT(VALUE b)
222
+ {
223
+ return rb_long2int(BIGNUM_LEN(b));
224
+ }
225
+
226
+ /* LSB:BIGNUM_DIGITS(b)[0], MSB:BIGNUM_DIGITS(b)[BIGNUM_LEN(b)-1] */
227
+ static inline BDIGIT *
228
+ BIGNUM_DIGITS(VALUE b)
229
+ {
230
+ if (BIGNUM_EMBED_P(b)) {
231
+ return RBIGNUM(b)->as.ary;
232
+ }
233
+ else {
234
+ return RBIGNUM(b)->as.heap.digits;
235
+ }
236
+ }
237
+
238
+ static inline bool
239
+ BIGNUM_EMBED_P(VALUE b)
240
+ {
241
+ return FL_TEST_RAW(b, BIGNUM_EMBED_FLAG);
242
+ }
243
+
244
+ #endif /* INTERNAL_BIGNUM_H */