zscan 2.0.6 → 2.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/ext/extconf.rb +9 -1
  3. data/ext/pack/builtin-27.h +79 -0
  4. data/ext/pack/builtin.h +79 -0
  5. data/ext/pack/internal-27.h +96 -0
  6. data/ext/pack/internal-27/array.h +103 -0
  7. data/ext/pack/internal-27/bignum.h +246 -0
  8. data/ext/pack/internal-27/bits.h +566 -0
  9. data/ext/pack/internal-27/class.h +162 -0
  10. data/ext/pack/internal-27/compar.h +50 -0
  11. data/ext/pack/internal-27/compile.h +32 -0
  12. data/ext/pack/internal-27/compilers.h +108 -0
  13. data/ext/pack/internal-27/complex.h +29 -0
  14. data/ext/pack/internal-27/cont.h +23 -0
  15. data/ext/pack/internal-27/dir.h +17 -0
  16. data/ext/pack/internal-27/enc.h +20 -0
  17. data/ext/pack/internal-27/encoding.h +28 -0
  18. data/ext/pack/internal-27/enum.h +19 -0
  19. data/ext/pack/internal-27/enumerator.h +22 -0
  20. data/ext/pack/internal-27/error.h +129 -0
  21. data/ext/pack/internal-27/eval.h +33 -0
  22. data/ext/pack/internal-27/file.h +39 -0
  23. data/ext/pack/internal-27/fixnum.h +185 -0
  24. data/ext/pack/internal-27/gc.h +153 -0
  25. data/ext/pack/internal-27/hash.h +234 -0
  26. data/ext/pack/internal-27/imemo.h +242 -0
  27. data/ext/pack/internal-27/inits.h +51 -0
  28. data/ext/pack/internal-27/io.h +35 -0
  29. data/ext/pack/internal-27/load.h +19 -0
  30. data/ext/pack/internal-27/loadpath.h +17 -0
  31. data/ext/pack/internal-27/math.h +24 -0
  32. data/ext/pack/internal-27/missing.h +19 -0
  33. data/ext/pack/internal-27/mjit.h +29 -0
  34. data/ext/pack/internal-27/numeric.h +249 -0
  35. data/ext/pack/internal-27/object.h +60 -0
  36. data/ext/pack/internal-27/parse.h +23 -0
  37. data/ext/pack/internal-27/proc.h +32 -0
  38. data/ext/pack/internal-27/process.h +130 -0
  39. data/ext/pack/internal-27/random.h +17 -0
  40. data/ext/pack/internal-27/range.h +37 -0
  41. data/ext/pack/internal-27/rational.h +68 -0
  42. data/ext/pack/internal-27/re.h +29 -0
  43. data/ext/pack/internal-27/sanitizers.h +191 -0
  44. data/ext/pack/internal-27/serial.h +24 -0
  45. data/ext/pack/internal-27/signal.h +22 -0
  46. data/ext/pack/internal-27/static_assert.h +17 -0
  47. data/ext/pack/internal-27/string.h +135 -0
  48. data/ext/pack/internal-27/struct.h +154 -0
  49. data/ext/pack/internal-27/symbol.h +41 -0
  50. data/ext/pack/internal-27/thread.h +52 -0
  51. data/ext/pack/internal-27/time.h +35 -0
  52. data/ext/pack/internal-27/transcode.h +21 -0
  53. data/ext/pack/internal-27/util.h +31 -0
  54. data/ext/pack/internal-27/variable.h +92 -0
  55. data/ext/pack/internal-27/vm.h +127 -0
  56. data/ext/pack/internal-27/warnings.h +17 -0
  57. data/ext/pack/internal.h +57 -2102
  58. data/ext/pack/internal/array.h +103 -0
  59. data/ext/pack/internal/bignum.h +246 -0
  60. data/ext/pack/internal/bits.h +566 -0
  61. data/ext/pack/internal/class.h +162 -0
  62. data/ext/pack/internal/compar.h +50 -0
  63. data/ext/pack/internal/compile.h +32 -0
  64. data/ext/pack/internal/compilers.h +108 -0
  65. data/ext/pack/internal/complex.h +29 -0
  66. data/ext/pack/internal/cont.h +23 -0
  67. data/ext/pack/internal/dir.h +17 -0
  68. data/ext/pack/internal/enc.h +20 -0
  69. data/ext/pack/internal/encoding.h +28 -0
  70. data/ext/pack/internal/enum.h +19 -0
  71. data/ext/pack/internal/enumerator.h +22 -0
  72. data/ext/pack/internal/error.h +129 -0
  73. data/ext/pack/internal/eval.h +33 -0
  74. data/ext/pack/internal/file.h +39 -0
  75. data/ext/pack/internal/fixnum.h +185 -0
  76. data/ext/pack/internal/gc.h +153 -0
  77. data/ext/pack/internal/hash.h +234 -0
  78. data/ext/pack/internal/imemo.h +242 -0
  79. data/ext/pack/internal/inits.h +51 -0
  80. data/ext/pack/internal/io.h +35 -0
  81. data/ext/pack/internal/load.h +19 -0
  82. data/ext/pack/internal/loadpath.h +17 -0
  83. data/ext/pack/internal/math.h +24 -0
  84. data/ext/pack/internal/missing.h +19 -0
  85. data/ext/pack/internal/mjit.h +29 -0
  86. data/ext/pack/internal/numeric.h +249 -0
  87. data/ext/pack/internal/object.h +60 -0
  88. data/ext/pack/internal/parse.h +23 -0
  89. data/ext/pack/internal/proc.h +32 -0
  90. data/ext/pack/internal/process.h +130 -0
  91. data/ext/pack/internal/random.h +17 -0
  92. data/ext/pack/internal/range.h +37 -0
  93. data/ext/pack/internal/rational.h +68 -0
  94. data/ext/pack/internal/re.h +29 -0
  95. data/ext/pack/internal/sanitizers.h +191 -0
  96. data/ext/pack/internal/serial.h +24 -0
  97. data/ext/pack/internal/signal.h +22 -0
  98. data/ext/pack/internal/static_assert.h +17 -0
  99. data/ext/pack/internal/string.h +135 -0
  100. data/ext/pack/internal/struct.h +154 -0
  101. data/ext/pack/internal/symbol.h +41 -0
  102. data/ext/pack/internal/thread.h +52 -0
  103. data/ext/pack/internal/time.h +35 -0
  104. data/ext/pack/internal/transcode.h +21 -0
  105. data/ext/pack/internal/util.h +31 -0
  106. data/ext/pack/internal/variable.h +92 -0
  107. data/ext/pack/internal/vm.h +127 -0
  108. data/ext/pack/internal/warnings.h +17 -0
  109. data/ext/pack/pack-26.c +2 -109
  110. data/ext/pack/pack-27.c +1022 -0
  111. data/ext/pack/pack.c +57 -1047
  112. data/lib/zscan.rb +1 -1
  113. data/zscan.gemspec +1 -1
  114. metadata +109 -3
@@ -0,0 +1,28 @@
1
+ #ifndef INTERNAL_ENCODING_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_ENCODING_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
+ * @brief Internal header for Encoding.
11
+ */
12
+ #include "ruby/ruby.h" /* for ID */
13
+ #include "ruby/encoding.h" /* for rb_encoding */
14
+
15
+ /* encoding.c */
16
+ ID rb_id_encoding(void);
17
+ rb_encoding *rb_enc_get_from_index(int index);
18
+ rb_encoding *rb_enc_check_str(VALUE str1, VALUE str2);
19
+ int rb_encdb_replicate(const char *alias, const char *orig);
20
+ int rb_encdb_alias(const char *alias, const char *orig);
21
+ int rb_encdb_dummy(const char *name);
22
+ void rb_encdb_declare(const char *name);
23
+ void rb_enc_set_base(const char *name, const char *orig);
24
+ int rb_enc_set_dummy(int index);
25
+ void rb_encdb_set_unicode(int index);
26
+ PUREFUNC(int rb_data_is_encoding(VALUE obj));
27
+
28
+ #endif /* INTERNAL_ENCODING_H */
@@ -0,0 +1,19 @@
1
+ #ifndef INTERNAL_ENUM_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_ENUM_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
+ * @brief Internal header for Enumerable.
11
+ */
12
+ #include "ruby/ruby.h" /* for VALUE */
13
+
14
+ /* enum.c */
15
+ extern VALUE rb_cArithSeq;
16
+ VALUE rb_f_send(int argc, VALUE *argv, VALUE recv);
17
+ VALUE rb_nmin_run(VALUE obj, VALUE num, int by, int rev, int ary);
18
+
19
+ #endif /* INTERNAL_ENUM_H */
@@ -0,0 +1,22 @@
1
+ #ifndef INTERNAL_ENUMERATOR_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_ENUMERATOR_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
+ * @brief Internal header for Enumerator.
11
+ */
12
+ #include "ruby/ruby.h" /* for VALUE */
13
+ #include "ruby/intern.h" /* for rb_enumerator_size_func */
14
+
15
+ RUBY_SYMBOL_EXPORT_BEGIN
16
+ /* enumerator.c (export) */
17
+ VALUE rb_arith_seq_new(VALUE obj, VALUE meth, int argc, VALUE const *argv,
18
+ rb_enumerator_size_func *size_fn,
19
+ VALUE beg, VALUE end, VALUE step, int excl);
20
+ RUBY_SYMBOL_EXPORT_END
21
+
22
+ #endif /* INTERNAL_ENUMERATOR_H */
@@ -0,0 +1,129 @@
1
+ #ifndef INTERNAL_ERROR_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_ERROR_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
+ * @brief Internal header for Exception.
11
+ */
12
+ #include "ruby/internal/config.h"
13
+ #include <stdarg.h> /* for va_list */
14
+ #include "internal/string.h" /* for rb_fstring_cstr */
15
+ #include "ruby/internal/stdbool.h" /* for bool */
16
+ #include "ruby/encoding.h" /* for rb_encoding */
17
+ #include "ruby/intern.h" /* for rb_exc_raise */
18
+ #include "ruby/ruby.h" /* for enum ruby_value_type */
19
+
20
+ #ifdef Check_Type
21
+ # undef Check_Type /* in ruby/ruby.h */
22
+ #endif
23
+
24
+ #ifdef rb_raise_static
25
+ # undef rb_raise_static
26
+ # undef rb_sys_fail_path
27
+ # undef rb_syserr_fail_path
28
+ #endif
29
+
30
+ #define rb_raise_static(e, m) \
31
+ rb_raise_cstr_i((e), rb_str_new_static((m), rb_strlen_lit(m)))
32
+ #ifdef RUBY_FUNCTION_NAME_STRING
33
+ # define rb_sys_fail_path(path) rb_sys_fail_path_in(RUBY_FUNCTION_NAME_STRING, path)
34
+ # define rb_syserr_fail_path(err, path) rb_syserr_fail_path_in(RUBY_FUNCTION_NAME_STRING, (err), (path))
35
+ # define rb_syserr_new_path(err, path) rb_syserr_new_path_in(RUBY_FUNCTION_NAME_STRING, (err), (path))
36
+ #else
37
+ # define rb_sys_fail_path(path) rb_sys_fail_str(path)
38
+ # define rb_syserr_fail_path(err, path) rb_syserr_fail_str((err), (path))
39
+ # define rb_syserr_new_path(err, path) rb_syserr_new_str((err), (path))
40
+ #endif
41
+
42
+ /* error.c */
43
+ typedef enum {
44
+ RB_WARN_CATEGORY_NONE,
45
+ RB_WARN_CATEGORY_DEPRECATED,
46
+ RB_WARN_CATEGORY_EXPERIMENTAL,
47
+ } rb_warning_category_t;
48
+
49
+ extern VALUE rb_eEAGAIN;
50
+ extern VALUE rb_eEWOULDBLOCK;
51
+ extern VALUE rb_eEINPROGRESS;
52
+ void rb_report_bug_valist(VALUE file, int line, const char *fmt, va_list args);
53
+ NORETURN(void rb_async_bug_errno(const char *,int));
54
+ const char *rb_builtin_type_name(int t);
55
+ const char *rb_builtin_class_name(VALUE x);
56
+ PRINTF_ARGS(void rb_warn_deprecated(const char *fmt, const char *suggest, ...), 1, 3);
57
+ PRINTF_ARGS(void rb_warn_deprecated_to_remove(const char *fmt, const char *removal, ...), 1, 3);
58
+ VALUE rb_syntax_error_append(VALUE, VALUE, int, int, rb_encoding*, const char*, va_list);
59
+ PRINTF_ARGS(void rb_enc_warn(rb_encoding *enc, const char *fmt, ...), 2, 3);
60
+ PRINTF_ARGS(void rb_sys_enc_warning(rb_encoding *enc, const char *fmt, ...), 2, 3);
61
+ PRINTF_ARGS(void rb_syserr_enc_warning(int err, rb_encoding *enc, const char *fmt, ...), 3, 4);
62
+ rb_warning_category_t rb_warning_category_from_name(VALUE category);
63
+ bool rb_warning_category_enabled_p(rb_warning_category_t category);
64
+ VALUE rb_name_err_new(VALUE mesg, VALUE recv, VALUE method);
65
+ VALUE rb_nomethod_err_new(VALUE mesg, VALUE recv, VALUE method, VALUE args, int priv);
66
+ VALUE rb_key_err_new(VALUE mesg, VALUE recv, VALUE name);
67
+ PRINTF_ARGS(VALUE rb_warning_string(const char *fmt, ...), 1, 2);
68
+ NORETURN(void rb_vraise(VALUE, const char *, va_list));
69
+ NORETURN(static inline void rb_raise_cstr(VALUE etype, const char *mesg));
70
+ NORETURN(static inline void rb_raise_cstr_i(VALUE etype, VALUE mesg));
71
+ NORETURN(static inline void rb_name_err_raise_str(VALUE mesg, VALUE recv, VALUE name));
72
+ NORETURN(static inline void rb_name_err_raise(const char *mesg, VALUE recv, VALUE name));
73
+ NORETURN(static inline void rb_key_err_raise(VALUE mesg, VALUE recv, VALUE name));
74
+ static inline void Check_Type(VALUE v, enum ruby_value_type t);
75
+ static inline bool rb_typeddata_is_instance_of_inline(VALUE obj, const rb_data_type_t *data_type);
76
+ #define rb_typeddata_is_instance_of rb_typeddata_is_instance_of_inline
77
+
78
+ RUBY_SYMBOL_EXPORT_BEGIN
79
+ /* error.c (export) */
80
+ int rb_bug_reporter_add(void (*func)(FILE *, void *), void *data);
81
+ #ifdef RUBY_FUNCTION_NAME_STRING
82
+ NORETURN(void rb_sys_fail_path_in(const char *func_name, VALUE path));
83
+ NORETURN(void rb_syserr_fail_path_in(const char *func_name, int err, VALUE path));
84
+ VALUE rb_syserr_new_path_in(const char *func_name, int n, VALUE path);
85
+ #endif
86
+ RUBY_SYMBOL_EXPORT_END
87
+
88
+ static inline void
89
+ rb_raise_cstr_i(VALUE etype, VALUE mesg)
90
+ {
91
+ VALUE exc = rb_exc_new_str(etype, mesg);
92
+ rb_exc_raise(exc);
93
+ }
94
+
95
+ static inline void
96
+ rb_raise_cstr(VALUE etype, const char *mesg)
97
+ {
98
+ VALUE str = rb_str_new_cstr(mesg);
99
+ rb_raise_cstr_i(etype, str);
100
+ }
101
+
102
+ static inline void
103
+ rb_name_err_raise_str(VALUE mesg, VALUE recv, VALUE name)
104
+ {
105
+ VALUE exc = rb_name_err_new(mesg, recv, name);
106
+ rb_exc_raise(exc);
107
+ }
108
+
109
+ static inline void
110
+ rb_name_err_raise(const char *mesg, VALUE recv, VALUE name)
111
+ {
112
+ VALUE str = rb_fstring_cstr(mesg);
113
+ rb_name_err_raise_str(str, recv, name);
114
+ }
115
+
116
+ static inline void
117
+ rb_key_err_raise(VALUE mesg, VALUE recv, VALUE name)
118
+ {
119
+ VALUE exc = rb_key_err_new(mesg, recv, name);
120
+ rb_exc_raise(exc);
121
+ }
122
+
123
+ static inline bool
124
+ rb_typeddata_is_instance_of_inline(VALUE obj, const rb_data_type_t *data_type)
125
+ {
126
+ return RB_TYPE_P(obj, T_DATA) && RTYPEDDATA_P(obj) && (RTYPEDDATA_TYPE(obj) == data_type);
127
+ }
128
+
129
+ #endif /* INTERNAL_ERROR_H */
@@ -0,0 +1,33 @@
1
+ #ifndef INTERNAL_EVAL_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_EVAL_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
+ * @brief Internal header for the evaluator.
11
+ * @note There also is eval_intern.h, which is evaluator's internal
12
+ * header (related to this file, but not the same role).
13
+ */
14
+ #include "ruby/ruby.h" /* for ID */
15
+
16
+ #define id_signo ruby_static_id_signo
17
+ #define id_status ruby_static_id_status
18
+
19
+ /* eval.c */
20
+ extern ID ruby_static_id_signo;
21
+ extern ID ruby_static_id_status;
22
+ VALUE rb_refinement_module_get_refined_class(VALUE module);
23
+ void rb_class_modify_check(VALUE);
24
+ NORETURN(VALUE rb_f_raise(int argc, VALUE *argv));
25
+
26
+ /* eval_error.c */
27
+ VALUE rb_get_backtrace(VALUE info);
28
+
29
+ /* eval_jump.c */
30
+ void rb_call_end_proc(VALUE data);
31
+ void rb_mark_end_proc(void);
32
+
33
+ #endif /* INTERNAL_EVAL_H */
@@ -0,0 +1,39 @@
1
+ #ifndef INTERNAL_FILE_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_FILE_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
+ * @brief Internal header for File.
11
+ */
12
+ #include "ruby/ruby.h" /* for VALUE */
13
+ #include "ruby/encoding.h" /* for rb_encodinng */
14
+
15
+ /* file.c */
16
+ extern const char ruby_null_device[];
17
+ VALUE rb_home_dir_of(VALUE user, VALUE result);
18
+ VALUE rb_default_home_dir(VALUE result);
19
+ VALUE rb_realpath_internal(VALUE basedir, VALUE path, int strict);
20
+ VALUE rb_check_realpath(VALUE basedir, VALUE path, rb_encoding *origenc);
21
+ void rb_file_const(const char*, VALUE);
22
+ int rb_file_load_ok(const char *);
23
+ VALUE rb_file_expand_path_fast(VALUE, VALUE);
24
+ VALUE rb_file_expand_path_internal(VALUE, VALUE, int, int, VALUE);
25
+ VALUE rb_get_path_check_to_string(VALUE);
26
+ VALUE rb_get_path_check_convert(VALUE);
27
+ int ruby_is_fd_loadable(int fd);
28
+
29
+ RUBY_SYMBOL_EXPORT_BEGIN
30
+ /* file.c (export) */
31
+ #ifdef HAVE_READLINK
32
+ VALUE rb_readlink(VALUE path, rb_encoding *enc);
33
+ #endif
34
+ #ifdef __APPLE__
35
+ VALUE rb_str_normalize_ospath(const char *ptr, long len);
36
+ #endif
37
+ RUBY_SYMBOL_EXPORT_END
38
+
39
+ #endif /* INTERNAL_FILE_H */
@@ -0,0 +1,185 @@
1
+ #ifndef INTERNAL_FIXNUM_H /*-*-C-*-vi:se ft=c:*/
2
+ #define INTERNAL_FIXNUM_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
+ * @brief Internal header for Fixnums.
11
+ */
12
+ #include "ruby/internal/config.h" /* for HAVE_LONG_LONG */
13
+ #include <limits.h> /* for CHAR_BIT */
14
+ #include "internal/compilers.h" /* for __has_builtin */
15
+ #include "ruby/internal/stdbool.h" /* for bool */
16
+ #include "ruby/intern.h" /* for rb_big_mul */
17
+ #include "ruby/ruby.h" /* for RB_FIXABLE */
18
+
19
+ #if HAVE_LONG_LONG && SIZEOF_LONG * 2 <= SIZEOF_LONG_LONG
20
+ # define DLONG LONG_LONG
21
+ # define DL2NUM(x) LL2NUM(x)
22
+ #elif defined(HAVE_INT128_T)
23
+ # define DLONG int128_t
24
+ # define DL2NUM(x) (RB_FIXABLE(x) ? LONG2FIX(x) : rb_int128t2big(x))
25
+ VALUE rb_int128t2big(int128_t n); /* in bignum.c */
26
+ #endif
27
+
28
+ static inline long rb_overflowed_fix_to_int(long x);
29
+ static inline VALUE rb_fix_plus_fix(VALUE x, VALUE y);
30
+ static inline VALUE rb_fix_minus_fix(VALUE x, VALUE y);
31
+ static inline VALUE rb_fix_mul_fix(VALUE x, VALUE y);
32
+ static inline void rb_fix_divmod_fix(VALUE x, VALUE y, VALUE *divp, VALUE *modp);
33
+ static inline VALUE rb_fix_div_fix(VALUE x, VALUE y);
34
+ static inline VALUE rb_fix_mod_fix(VALUE x, VALUE y);
35
+ static inline bool FIXNUM_POSITIVE_P(VALUE num);
36
+ static inline bool FIXNUM_NEGATIVE_P(VALUE num);
37
+ static inline bool FIXNUM_ZERO_P(VALUE num);
38
+
39
+ static inline long
40
+ rb_overflowed_fix_to_int(long x)
41
+ {
42
+ return (long)((unsigned long)(x >> 1) ^ (1LU << (SIZEOF_LONG * CHAR_BIT - 1)));
43
+ }
44
+
45
+ static inline VALUE
46
+ rb_fix_plus_fix(VALUE x, VALUE y)
47
+ {
48
+ #if !__has_builtin(__builtin_add_overflow)
49
+ long lz = FIX2LONG(x) + FIX2LONG(y);
50
+ return LONG2NUM(lz);
51
+ #else
52
+ long lz;
53
+ /* NOTE
54
+ * (1) `LONG2FIX(FIX2LONG(x)+FIX2LONG(y))`
55
+ + = `((lx*2+1)/2 + (ly*2+1)/2)*2+1`
56
+ + = `lx*2 + ly*2 + 1`
57
+ + = `(lx*2+1) + (ly*2+1) - 1`
58
+ + = `x + y - 1`
59
+ * (2) Fixnum's LSB is always 1.
60
+ * It means you can always run `x - 1` without overflow.
61
+ * (3) Of course `z = x + (y-1)` may overflow.
62
+ * At that time true value is
63
+ * * positive: 0b0 1xxx...1, and z = 0b1xxx...1
64
+ * * nevative: 0b1 0xxx...1, and z = 0b0xxx...1
65
+ * To convert this true value to long,
66
+ * (a) Use arithmetic shift
67
+ * * positive: 0b11xxx...
68
+ * * negative: 0b00xxx...
69
+ * (b) invert MSB
70
+ * * positive: 0b01xxx...
71
+ * * negative: 0b10xxx...
72
+ */
73
+ if (__builtin_add_overflow((long)x, (long)y-1, &lz)) {
74
+ return rb_int2big(rb_overflowed_fix_to_int(lz));
75
+ }
76
+ else {
77
+ return (VALUE)lz;
78
+ }
79
+ #endif
80
+ }
81
+
82
+ static inline VALUE
83
+ rb_fix_minus_fix(VALUE x, VALUE y)
84
+ {
85
+ #if !__has_builtin(__builtin_sub_overflow)
86
+ long lz = FIX2LONG(x) - FIX2LONG(y);
87
+ return LONG2NUM(lz);
88
+ #else
89
+ long lz;
90
+ if (__builtin_sub_overflow((long)x, (long)y-1, &lz)) {
91
+ return rb_int2big(rb_overflowed_fix_to_int(lz));
92
+ }
93
+ else {
94
+ return (VALUE)lz;
95
+ }
96
+ #endif
97
+ }
98
+
99
+ /* arguments must be Fixnum */
100
+ static inline VALUE
101
+ rb_fix_mul_fix(VALUE x, VALUE y)
102
+ {
103
+ long lx = FIX2LONG(x);
104
+ long ly = FIX2LONG(y);
105
+ #ifdef DLONG
106
+ return DL2NUM((DLONG)lx * (DLONG)ly);
107
+ #else
108
+ if (MUL_OVERFLOW_FIXNUM_P(lx, ly)) {
109
+ return rb_big_mul(rb_int2big(lx), rb_int2big(ly));
110
+ }
111
+ else {
112
+ return LONG2FIX(lx * ly);
113
+ }
114
+ #endif
115
+ }
116
+
117
+ /*
118
+ * This behaves different from C99 for negative arguments.
119
+ * Note that div may overflow fixnum.
120
+ */
121
+ static inline void
122
+ rb_fix_divmod_fix(VALUE a, VALUE b, VALUE *divp, VALUE *modp)
123
+ {
124
+ /* assume / and % comply C99.
125
+ * ldiv(3) won't be inlined by GCC and clang.
126
+ * I expect / and % are compiled as single idiv.
127
+ */
128
+ long x = FIX2LONG(a);
129
+ long y = FIX2LONG(b);
130
+ long div, mod;
131
+ if (x == FIXNUM_MIN && y == -1) {
132
+ if (divp) *divp = LONG2NUM(-FIXNUM_MIN);
133
+ if (modp) *modp = LONG2FIX(0);
134
+ return;
135
+ }
136
+ div = x / y;
137
+ mod = x % y;
138
+ if (y > 0 ? mod < 0 : mod > 0) {
139
+ mod += y;
140
+ div -= 1;
141
+ }
142
+ if (divp) *divp = LONG2FIX(div);
143
+ if (modp) *modp = LONG2FIX(mod);
144
+ }
145
+
146
+ /* div() for Ruby
147
+ * This behaves different from C99 for negative arguments.
148
+ */
149
+ static inline VALUE
150
+ rb_fix_div_fix(VALUE x, VALUE y)
151
+ {
152
+ VALUE div;
153
+ rb_fix_divmod_fix(x, y, &div, NULL);
154
+ return div;
155
+ }
156
+
157
+ /* mod() for Ruby
158
+ * This behaves different from C99 for negative arguments.
159
+ */
160
+ static inline VALUE
161
+ rb_fix_mod_fix(VALUE x, VALUE y)
162
+ {
163
+ VALUE mod;
164
+ rb_fix_divmod_fix(x, y, NULL, &mod);
165
+ return mod;
166
+ }
167
+
168
+ static inline bool
169
+ FIXNUM_POSITIVE_P(VALUE num)
170
+ {
171
+ return (SIGNED_VALUE)num > (SIGNED_VALUE)INT2FIX(0);
172
+ }
173
+
174
+ static inline bool
175
+ FIXNUM_NEGATIVE_P(VALUE num)
176
+ {
177
+ return (SIGNED_VALUE)num < 0;
178
+ }
179
+
180
+ static inline bool
181
+ FIXNUM_ZERO_P(VALUE num)
182
+ {
183
+ return num == INT2FIX(0);
184
+ }
185
+ #endif /* INTERNAL_FIXNUM_H */