1#ifndef RBIMPL_ARITHMETIC_LONG_H
2#define RBIMPL_ARITHMETIC_LONG_H
46#define FIX2LONG RB_FIX2LONG
47#define FIX2ULONG RB_FIX2ULONG
48#define INT2FIX RB_INT2FIX
49#define LONG2FIX RB_INT2FIX
50#define LONG2NUM RB_LONG2NUM
51#define NUM2LONG RB_NUM2LONG
52#define NUM2ULONG RB_NUM2ULONG
53#define RB_FIX2LONG rb_fix2long
54#define RB_FIX2ULONG rb_fix2ulong
55#define RB_LONG2FIX RB_INT2FIX
56#define RB_LONG2NUM rb_long2num_inline
57#define RB_NUM2LONG rb_num2long_inline
58#define RB_NUM2ULONG rb_num2ulong_inline
59#define RB_ULONG2NUM rb_ulong2num_inline
60#define ULONG2NUM RB_ULONG2NUM
61#define rb_fix_new RB_INT2FIX
62#define rb_long2int rb_long2int_inline
65#define RB_INT2FIX RB_INT2FIX
88 const unsigned long j = i;
99rb_long2int_inline(
long n)
101 int i = RBIMPL_CAST((
int)n);
103 if (
sizeof(
long) <=
sizeof(
int)) {
116rbimpl_fix2long_by_idiv(
VALUE x)
125 const long w = RBIMPL_CAST((
long)z);
134rbimpl_fix2long_by_shift(
VALUE x)
142 const long w = RBIMPL_CAST((
long)z);
151rbimpl_right_shift_is_arithmetic_p(
void)
153 return (-1 >> 1) == -1;
161 if (rbimpl_right_shift_is_arithmetic_p()) {
162 return rbimpl_fix2long_by_shift(x);
165 return rbimpl_fix2long_by_idiv(x);
171static inline
unsigned long
175 return rb_fix2long(x);
179rb_num2long_inline(
VALUE x)
187static inline unsigned long
188rb_num2ulong_inline(
VALUE x)
202rb_long2num_inline(
long v)
211rb_ulong2num_inline(
unsigned long v)
227#if RBIMPL_HAS_ATTR_CONSTEXPR_CXX14
230#elif ! defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P)
232# define INT2FIX(i) (RBIMPL_CAST((VALUE)(i)) << 1 | RUBY_FIXNUM_FLAG)
237 __builtin_choose_expr( \
238 __builtin_constant_p(i), \
239 RBIMPL_CAST((VALUE)(i)) << 1 | RUBY_FIXNUM_FLAG, \
Defines RBIMPL_ATTR_ARTIFICIAL.
#define RBIMPL_ATTR_ARTIFICIAL()
Wraps (or simulates) __attribute__((artificial))
#define RBIMPL_ASSERT_OR_ASSUME(expr)
This is either RUBY_ASSERT or RBIMPL_ASSUME, depending on RUBY_DEBUG.
VALUE rb_int2big(intptr_t n)
VALUE rb_uint2big(uintptr_t n)
Defines RBIMPL_ATTR_COLD.
#define RBIMPL_ATTR_COLD()
Wraps (or simulates) __attribute__((cold))
Defines RBIMPL_ATTR_CONST.
#define RBIMPL_ATTR_CONST()
Wraps (or simulates) __attribute__((const))
#define RBIMPL_ATTR_CONST_UNLESS_DEBUG()
Enables RBIMPL_ATTR_CONST iff.
#define RBIMPL_ATTR_CONSTEXPR(_)
Wraps (or simulates) C++11 constexpr.
#define RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(_)
Enables RBIMPL_ATTR_CONSTEXPR iff.
Tewaking visibility of C variables/functions.
#define RBIMPL_SYMBOL_EXPORT_END()
Counterpart of RBIMPL_SYMBOL_EXPORT_BEGIN.
#define RBIMPL_SYMBOL_EXPORT_BEGIN()
Shortcut macro equivalent to RUBY_SYMBOL_EXPORT_BEGIN extern "C" {.
Handling of integers formerly known as Fixnums.
Thin wrapper to ruby/config.h.
Defines RBIMPL_ASSUME / RBIMPL_UNREACHABLE.
#define RBIMPL_ASSUME(_)
Wraps (or simulates) __builtin_unreachable.
Arithmetic conversion between C's intptr_t and Ruby's.
typedef long(ZCALLBACK *tell_file_func) OF((voidpf opaque
void rb_out_of_int(SIGNED_VALUE num)
long rb_num2long(VALUE num)
unsigned long rb_num2ulong(VALUE num)
Defines RBIMPL_ATTR_NORETURN.
#define RBIMPL_ATTR_NORETURN()
Wraps (or simulates) [[noreturn]]
Defines enum ruby_special_consts.