diff options
Diffstat (limited to 'include/ruby/internal/arithmetic')
| -rw-r--r-- | include/ruby/internal/arithmetic/char.h | 81 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/double.h | 72 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/fixnum.h | 60 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/gid_t.h | 41 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/int.h | 264 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/intptr_t.h | 74 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/long.h | 356 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/long_long.h | 135 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/mode_t.h | 41 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/off_t.h | 62 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/pid_t.h | 41 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/short.h | 113 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/size_t.h | 66 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/st_data_t.h | 75 | ||||
| -rw-r--r-- | include/ruby/internal/arithmetic/uid_t.h | 41 |
15 files changed, 0 insertions, 1522 deletions
diff --git a/include/ruby/internal/arithmetic/char.h b/include/ruby/internal/arithmetic/char.h deleted file mode 100644 index 920fdc0c9d..0000000000 --- a/include/ruby/internal/arithmetic/char.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_CHAR_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_CHAR_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `char` and Ruby's. - */ -#include "ruby/internal/arithmetic/int.h" /* NUM2INT is here, but */ -#include "ruby/internal/arithmetic/long.h" /* INT2FIX is here.*/ -#include "ruby/internal/attr/artificial.h" -#include "ruby/internal/attr/const.h" -#include "ruby/internal/attr/constexpr.h" -#include "ruby/internal/cast.h" -#include "ruby/internal/core/rstring.h" -#include "ruby/internal/value_type.h" - -#define RB_NUM2CHR rb_num2char_inline /**< @alias{rb_num2char_inline} */ -#define NUM2CHR RB_NUM2CHR /**< @old{RB_NUM2CHR} */ -#define CHR2FIX RB_CHR2FIX /**< @old{RB_CHR2FIX} */ - -/** @cond INTERNAL_MACRO */ -#define RB_CHR2FIX RB_CHR2FIX -/** @endcond */ - -RBIMPL_ATTR_CONST_UNLESS_DEBUG() -RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) -RBIMPL_ATTR_ARTIFICIAL() -/** - * Converts a C's `unsigned char` into an instance of ::rb_cInteger. - * - * @param[in] c Arbitrary `unsigned char` value. - * @return An instance of ::rb_cInteger. - * - * @internal - * - * Nobody explicitly states this but in Ruby, a char means an unsigned integer - * value of range 0..255. This is a general principle. AFAIK there is no - * single line of code where char is signed. - */ -static inline VALUE -RB_CHR2FIX(unsigned char c) -{ - return RB_INT2FIX(c); -} - -/** - * Converts an instance of ::rb_cNumeric into C's `char`. At the same time it - * accepts a String of more than one character, and returns its first byte. In - * the early days there was a Ruby level "character" literal `?c`, which - * roughly worked this way. - * - * @param[in] x Either a string or a numeric. - * @exception rb_eTypeError `x` is not a numeric. - * @exception rb_eRangeError `x` is out of range of `unsigned int`. - * @return The passed value converted into C's `char`. - */ -static inline char -rb_num2char_inline(VALUE x) -{ - if (RB_TYPE_P(x, RUBY_T_STRING) && (RSTRING_LEN(x)>=1)) - return RSTRING_PTR(x)[0]; - else - return RBIMPL_CAST((char)RB_NUM2INT(x)); -} - -#endif /* RBIMPL_ARITHMETIC_CHAR_H */ diff --git a/include/ruby/internal/arithmetic/double.h b/include/ruby/internal/arithmetic/double.h deleted file mode 100644 index 229de47aef..0000000000 --- a/include/ruby/internal/arithmetic/double.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_DOUBLE_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_DOUBLE_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `double` and Ruby's. - */ -#include "ruby/internal/attr/pure.h" -#include "ruby/internal/dllexport.h" -#include "ruby/internal/value.h" - -#define NUM2DBL rb_num2dbl /**< @old{rb_num2dbl} */ -#define RFLOAT_VALUE rb_float_value /**< @old{rb_float_value} */ -#define DBL2NUM rb_float_new /**< @old{rb_float_new} */ - -RBIMPL_SYMBOL_EXPORT_BEGIN() -/** - * Converts an instance of ::rb_cNumeric into C's `double`. - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @return The passed value converted into C's `double`. - */ -double rb_num2dbl(VALUE num); - -RBIMPL_ATTR_PURE() -/** - * Extracts its double value from an instance of ::rb_cFloat. - * - * @param[in] num An instance of ::rb_cFloat. - * @pre Must not pass anything other than a Fixnum. - * @return The passed value converted into C's `double`. - */ -double rb_float_value(VALUE num); - -/** - * Converts a C's `double` into an instance of ::rb_cFloat. - * - * @param[in] d Arbitrary `double` value. - * @return An instance of ::rb_cFloat. - */ -VALUE rb_float_new(double d); - -/** - * Identical to rb_float_new(), except it does not generate Flonums. - * - * @param[in] d Arbitrary `double` value. - * @return An instance of ::rb_cFloat. - * - * @internal - * - * @shyouhei has no idea why it is here. - */ -VALUE rb_float_new_in_heap(double d); -RBIMPL_SYMBOL_EXPORT_END() - -#endif /* RBIMPL_ARITHMETIC_DOUBLE_H */ diff --git a/include/ruby/internal/arithmetic/fixnum.h b/include/ruby/internal/arithmetic/fixnum.h deleted file mode 100644 index c8927ac824..0000000000 --- a/include/ruby/internal/arithmetic/fixnum.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_FIXNUM_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_FIXNUM_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Handling of integers formerly known as Fixnums. - */ -#include "ruby/backward/2/limits.h" - -#define FIXABLE RB_FIXABLE /**< @old{RB_FIXABLE} */ -#define FIXNUM_MAX RUBY_FIXNUM_MAX /**< @old{RUBY_FIXNUM_MAX} */ -#define FIXNUM_MIN RUBY_FIXNUM_MIN /**< @old{RUBY_FIXNUM_MIN} */ -#define NEGFIXABLE RB_NEGFIXABLE /**< @old{RB_NEGFIXABLE} */ -#define POSFIXABLE RB_POSFIXABLE /**< @old{RB_POSFIXABLE} */ - -/** - * Checks if the passed value is in range of fixnum, assuming it is a positive - * number. Can sometimes be useful for C's unsigned integer types. - * - * @internal - * - * FIXABLE can be applied to anything, from double to intmax_t. The problem is - * double. On a 64bit system RUBY_FIXNUM_MAX is 4,611,686,018,427,387,903, - * which is not representable by a double. The nearest value that a double can - * represent is 4,611,686,018,427,387,904, which is not fixable. The - * seemingly-strange "< FIXNUM_MAX + 1" expression below is due to this. - */ -#define RB_POSFIXABLE(_) ((_) < RUBY_FIXNUM_MAX + 1) - -/** - * Checks if the passed value is in range of fixnum, assuming it is a negative - * number. This is an implementation of #RB_FIXABLE. Rarely used stand alone. - */ -#define RB_NEGFIXABLE(_) ((_) >= RUBY_FIXNUM_MIN) - -/** Checks if the passed value is in range of fixnum */ -#define RB_FIXABLE(_) (RB_POSFIXABLE(_) && RB_NEGFIXABLE(_)) - -/** Maximum possible value that a fixnum can represent. */ -#define RUBY_FIXNUM_MAX (LONG_MAX / 2) - -/** Minimum possible value that a fixnum can represent. */ -#define RUBY_FIXNUM_MIN (LONG_MIN / 2) - -#endif /* RBIMPL_ARITHMETIC_FIXNUM_H */ diff --git a/include/ruby/internal/arithmetic/gid_t.h b/include/ruby/internal/arithmetic/gid_t.h deleted file mode 100644 index 361220bfab..0000000000 --- a/include/ruby/internal/arithmetic/gid_t.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_GID_T_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_GID_T_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `gid_t` and Ruby's. - */ -#include "ruby/internal/config.h" -#include "ruby/internal/arithmetic/long.h" - -/** Converts a C's `gid_t` into an instance of ::rb_cInteger. */ -#ifndef GIDT2NUM -# define GIDT2NUM RB_LONG2NUM -#endif - -/** Converts an instance of ::rb_cNumeric into C's `gid_t`. */ -#ifndef NUM2GIDT -# define NUM2GIDT RB_NUM2LONG -#endif - -/** A rb_sprintf() format prefix to be used for a `gid_t` parameter. */ -#ifndef PRI_GIDT_PREFIX -# define PRI_GIDT_PREFIX PRI_LONG_PREFIX -#endif - -#endif /* RBIMPL_ARITHMETIC_GID_T_H */ diff --git a/include/ruby/internal/arithmetic/int.h b/include/ruby/internal/arithmetic/int.h deleted file mode 100644 index 7b24d16887..0000000000 --- a/include/ruby/internal/arithmetic/int.h +++ /dev/null @@ -1,264 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_INT_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_INT_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `int` and Ruby's. - */ -#include "ruby/internal/config.h" -#include "ruby/internal/arithmetic/fixnum.h" -#include "ruby/internal/arithmetic/intptr_t.h" -#include "ruby/internal/arithmetic/long.h" -#include "ruby/internal/attr/artificial.h" -#include "ruby/internal/attr/const.h" -#include "ruby/internal/attr/constexpr.h" -#include "ruby/internal/compiler_is.h" -#include "ruby/internal/dllexport.h" -#include "ruby/internal/special_consts.h" -#include "ruby/internal/value.h" -#include "ruby/internal/warning_push.h" -#include "ruby/assert.h" - -#define RB_INT2NUM rb_int2num_inline /**< @alias{rb_int2num_inline} */ -#define RB_NUM2INT rb_num2int_inline /**< @alias{rb_num2int_inline} */ -#define RB_UINT2NUM rb_uint2num_inline /**< @alias{rb_uint2num_inline} */ - -#define FIX2INT RB_FIX2INT /**< @old{RB_FIX2INT} */ -#define FIX2UINT RB_FIX2UINT /**< @old{RB_FIX2UINT} */ -#define INT2NUM RB_INT2NUM /**< @old{RB_INT2NUM} */ -#define NUM2INT RB_NUM2INT /**< @old{RB_NUM2INT} */ -#define NUM2UINT RB_NUM2UINT /**< @old{RB_NUM2UINT} */ -#define UINT2NUM RB_UINT2NUM /**< @old{RB_UINT2NUM} */ - -/** @cond INTERNAL_MACRO */ -#define RB_FIX2INT RB_FIX2INT -#define RB_NUM2UINT RB_NUM2UINT -#define RB_FIX2UINT RB_FIX2UINT -/** @endcond */ - -RBIMPL_SYMBOL_EXPORT_BEGIN() - -/** - * Converts an instance of ::rb_cNumeric into C's `long`. - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `int`. - * @return The passed value converted into C's `long`. - * - * @internal - * - * Yes, the API is really strange. It returns `long`, but raises when the - * value is out of `int`. This seems to be due to the fact that Matz favoured - * K&R before, and his machine at that moment was an ILP32 architecture. - */ -long rb_num2int(VALUE num); - -/** - * Identical to rb_num2int(). - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `int`. - * @return The passed value converted into C's `long`. - * - * @internal - * - * This function seems to be a complete waste of disk space. @shyouhei has no - * idea why this is a different thing from rb_num2short(). - */ -long rb_fix2int(VALUE num); - -/** - * Converts an instance of ::rb_cNumeric into C's `unsigned long`. - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `unsigned int`. - * @return The passed value converted into C's `unsigned long`. - * - * @internal - * - * Yes, the API is really strange. It returns `unsigned long`, but raises when - * the value is out of `unsigned int`. This seems to be due to the fact that - * Matz favoured K&R before, and his machine at that moment was an ILP32 - * architecture. - */ -unsigned long rb_num2uint(VALUE num); - -/** - * Identical to rb_num2uint(). - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `unsigned int`. - * @return The passed value converted into C's `unsigned long`. - * - * @internal - * - * This function seems to be a complete waste of disk space. @shyouhei has no - * idea why this is a different thing from rb_num2short(). - */ -unsigned long rb_fix2uint(VALUE num); -RBIMPL_SYMBOL_EXPORT_END() - -RBIMPL_ATTR_ARTIFICIAL() -/** - * Converts a Fixnum into C's `int`. - * - * @param[in] x Some Fixnum. - * @pre Must not pass anything other than a Fixnum. - * @return The passed value converted into C's `int`. - */ -static inline int -RB_FIX2INT(VALUE x) -{ - /* "FIX2INT raises a TypeError if passed nil", says rubyspec. Not sure if - * that is a desired behaviour but just preserve backwards compatilibily. - */ -#if 0 - RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(x)); -#endif - long ret; - - if /* constexpr */ (sizeof(int) < sizeof(long)) { - ret = rb_fix2int(x); - } - else { - ret = RB_FIX2LONG(x); - } - - return RBIMPL_CAST((int)ret); -} - -/** - * Converts an instance of ::rb_cNumeric into C's `int`. - * - * @param[in] x Something numeric. - * @exception rb_eTypeError `x` is not a numeric. - * @exception rb_eRangeError `x` is out of range of `int`. - * @return The passed value converted into C's `int`. - */ -static inline int -rb_num2int_inline(VALUE x) -{ - long ret; - - if /* constexpr */ (sizeof(int) == sizeof(long)) { - ret = RB_NUM2LONG(x); - } - else if (RB_FIXNUM_P(x)) { - ret = rb_fix2int(x); - } - else { - ret = rb_num2int(x); - } - - return RBIMPL_CAST((int)ret); -} - -/** - * Converts an instance of ::rb_cNumeric into C's `unsigned int`. - * - * @param[in] x Something numeric. - * @exception rb_eTypeError `x` is not a numeric. - * @exception rb_eRangeError `x` is out of range of `unsigned int`. - * @return The passed value converted into C's `unsigned int`. - */ -RBIMPL_ATTR_ARTIFICIAL() -static inline unsigned int -RB_NUM2UINT(VALUE x) -{ - unsigned long ret; - - if /* constexpr */ (sizeof(int) < sizeof(long)) { - ret = rb_num2uint(x); - } - else { - ret = RB_NUM2ULONG(x); - } - - return RBIMPL_CAST((unsigned int)ret); -} - -RBIMPL_ATTR_ARTIFICIAL() -/** - * Converts a Fixnum into C's `int`. - * - * @param[in] x Some Fixnum. - * @pre Must not pass anything other than a Fixnum. - * @return The passed value converted into C's `int`. - */ -static inline unsigned int -RB_FIX2UINT(VALUE x) -{ -#if 0 /* Ditto for RB_FIX2INT. */ - RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(x)); -#endif - unsigned long ret; - - if /* constexpr */ (sizeof(int) < sizeof(long)) { - ret = rb_fix2uint(x); - } - else { - ret = RB_FIX2ULONG(x); - } - - return RBIMPL_CAST((unsigned int)ret); -} - -RBIMPL_WARNING_PUSH() -#if RBIMPL_COMPILER_IS(GCC) -RBIMPL_WARNING_IGNORED(-Wtype-limits) /* We can ignore them here. */ -#elif RBIMPL_HAS_WARNING("-Wtautological-constant-out-of-range-compare") -RBIMPL_WARNING_IGNORED(-Wtautological-constant-out-of-range-compare) -#endif - -/** - * Converts a C's `int` into an instance of ::rb_cInteger. - * - * @param[in] v Arbitrary `int` value. - * @return An instance of ::rb_cInteger. - */ -static inline VALUE -rb_int2num_inline(int v) -{ - if (RB_FIXABLE(v)) - return RB_INT2FIX(v); - else - return rb_int2big(v); -} - -/** - * Converts a C's `unsigned int` into an instance of ::rb_cInteger. - * - * @param[in] v Arbitrary `unsigned int` value. - * @return An instance of ::rb_cInteger. - */ -static inline VALUE -rb_uint2num_inline(unsigned int v) -{ - if (RB_POSFIXABLE(v)) - return RB_LONG2FIX(RBIMPL_CAST((long)v)); - else - return rb_uint2big(v); -} - -RBIMPL_WARNING_POP() - -#endif /* RBIMPL_ARITHMETIC_INT_H */ diff --git a/include/ruby/internal/arithmetic/intptr_t.h b/include/ruby/internal/arithmetic/intptr_t.h deleted file mode 100644 index a354f4469c..0000000000 --- a/include/ruby/internal/arithmetic/intptr_t.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_INTPTR_T_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_INTPTR_T_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `intptr_t` and Ruby's. - */ -#include "ruby/internal/config.h" - -#ifdef HAVE_STDINT_H -# include <stdint.h> -#endif - -#include "ruby/internal/value.h" -#include "ruby/internal/dllexport.h" - -#define rb_int_new rb_int2inum /**< @alias{rb_int2inum} */ -#define rb_uint_new rb_uint2inum /**< @alias{rb_uint2inum} */ - -RBIMPL_SYMBOL_EXPORT_BEGIN() - -/** - * Converts a C's `intptr_t` into an instance of ::rb_cInteger. - * - * @param[in] i Arbitrary `intptr_t` value. - * @return An instance of ::rb_cInteger. - * @note This function always allocates Bignums, even if the given number - * is small enough to fit into a Fixnum. - */ -VALUE rb_int2big(intptr_t i); - -/** - * Converts a C's `intptr_t` into an instance of ::rb_cInteger. - * - * @param[in] i Arbitrary `intptr_t` value. - * @return An instance of ::rb_cInteger. - */ -VALUE rb_int2inum(intptr_t i); - -/** - * Converts a C's `intptr_t` into an instance of ::rb_cInteger. - * - * @param[in] i Arbitrary `intptr_t` value. - * @return An instance of ::rb_cInteger. - * @note This function always allocates Bignums, even if the given number - * is small enough to fit into a Fixnum. - */ -VALUE rb_uint2big(uintptr_t i); - -/** - * Converts a C's `uintptr_t` into an instance of ::rb_cInteger. - * - * @param[in] i Arbitrary `uintptr_t` value. - * @return An instance of ::rb_cInteger. - */ -VALUE rb_uint2inum(uintptr_t i); -RBIMPL_SYMBOL_EXPORT_END() - -#endif /* RBIMPL_ARITHMETIC_INTPTR_T_H */ diff --git a/include/ruby/internal/arithmetic/long.h b/include/ruby/internal/arithmetic/long.h deleted file mode 100644 index 6c00dbceb7..0000000000 --- a/include/ruby/internal/arithmetic/long.h +++ /dev/null @@ -1,356 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_LONG_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_LONG_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `long` and Ruby's. - * - * ### Q&A ### - * - * - Q: Why are INT2FIX etc. here, not in `int.h`? - * - * - A: Because they are in fact handling `long`. It seems someone did not - * understand the difference of `int` and `long` when they designed those - * macros. - */ -#include "ruby/internal/config.h" -#include "ruby/internal/arithmetic/fixnum.h" /* FIXABLE */ -#include "ruby/internal/arithmetic/intptr_t.h" /* rb_int2big etc.*/ -#include "ruby/internal/assume.h" -#include "ruby/internal/attr/artificial.h" -#include "ruby/internal/attr/cold.h" -#include "ruby/internal/attr/const.h" -#include "ruby/internal/attr/constexpr.h" -#include "ruby/internal/attr/noreturn.h" -#include "ruby/internal/cast.h" -#include "ruby/internal/dllexport.h" -#include "ruby/internal/special_consts.h" /* FIXNUM_FLAG */ -#include "ruby/internal/value.h" -#include "ruby/assert.h" - -#define FIX2LONG RB_FIX2LONG /**< @old{RB_FIX2LONG} */ -#define FIX2ULONG RB_FIX2ULONG /**< @old{RB_FIX2ULONG} */ -#define INT2FIX RB_INT2FIX /**< @old{RB_INT2FIX} */ -#define LONG2FIX RB_INT2FIX /**< @old{RB_INT2FIX} */ -#define LONG2NUM RB_LONG2NUM /**< @old{RB_LONG2NUM} */ -#define NUM2LONG RB_NUM2LONG /**< @old{RB_NUM2LONG} */ -#define NUM2ULONG RB_NUM2ULONG /**< @old{RB_NUM2ULONG} */ -#define RB_FIX2LONG rb_fix2long /**< @alias{rb_fix2long} */ -#define RB_FIX2ULONG rb_fix2ulong /**< @alias{rb_fix2ulong} */ -#define RB_LONG2FIX RB_INT2FIX /**< @alias{RB_INT2FIX} */ -#define RB_LONG2NUM rb_long2num_inline /**< @alias{rb_long2num_inline} */ -#define RB_NUM2LONG rb_num2long_inline /**< @alias{rb_num2long_inline} */ -#define RB_NUM2ULONG rb_num2ulong_inline /**< @alias{rb_num2ulong_inline} */ -#define RB_ULONG2NUM rb_ulong2num_inline /**< @alias{rb_ulong2num_inline} */ -#define ULONG2NUM RB_ULONG2NUM /**< @old{RB_ULONG2NUM} */ -#define rb_fix_new RB_INT2FIX /**< @alias{RB_INT2FIX} */ -#define rb_long2int rb_long2int_inline /**< @alias{rb_long2int_inline} */ - -/** @cond INTERNAL_MACRO */ -#define RB_INT2FIX RB_INT2FIX -/** @endcond */ - -RBIMPL_SYMBOL_EXPORT_BEGIN() - -RBIMPL_ATTR_NORETURN() -RBIMPL_ATTR_COLD() -/** - * This is an utility function to raise an ::rb_eRangeError. - * - * @param[in] num A signed value about to overflow. - * @exception rb_eRangeError `num` is out of range of `int`. - */ -void rb_out_of_int(SIGNED_VALUE num); - -/** - * Converts an instance of ::rb_cNumeric into C's `long`. - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `long`. - * @return The passed value converted into C's `long`. - */ -long rb_num2long(VALUE num); - -/** - * Converts an instance of ::rb_cNumeric into C's `unsigned long`. - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `unsigned long`. - * @return The passed value converted into C's `unsigned long`. - */ -unsigned long rb_num2ulong(VALUE num); -RBIMPL_SYMBOL_EXPORT_END() - -RBIMPL_ATTR_CONST_UNLESS_DEBUG() -RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) -RBIMPL_ATTR_ARTIFICIAL() -/** - * Converts a C's `long` into an instance of ::rb_cInteger. - * - * @param[in] i Arbitrary `long` value. - * @return An instance of ::rb_cInteger. - */ -static inline VALUE -RB_INT2FIX(long i) -{ - RBIMPL_ASSERT_OR_ASSUME(RB_FIXABLE(i)); - - /* :NOTE: VALUE can be wider than long. As j being unsigned, 2j+1 is fully - * defined. Also it can be compiled into a single LEA instruction. */ - const unsigned long j = RBIMPL_CAST((unsigned long)i); - const unsigned long k = (j << 1) + RUBY_FIXNUM_FLAG; - const long l = RBIMPL_CAST((long)k); - const SIGNED_VALUE m = l; /* Sign extend */ - const VALUE n = RBIMPL_CAST((VALUE)m); - - RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(n)); - return n; -} - -/** - * Checks if `int` can hold the given integer. - * - * @param[in] n Arbitrary `long` value. - * @exception rb_eRangeError `n` is out of range of `int`. - * @return Identical value of type `int` - */ -static inline int -rb_long2int_inline(long n) -{ - int i = RBIMPL_CAST((int)n); - - if /* constexpr */ (sizeof(long) <= sizeof(int)) { - RBIMPL_ASSUME(i == n); - } - - if (i != n) - rb_out_of_int(n); - - return i; -} - -RBIMPL_ATTR_CONST_UNLESS_DEBUG() -RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) -/** - * @private - * - * This is an implementation detail of rb_fix2long(). People don't use it - * directly. - * - * @param[in] x A Fixnum. - * @return Identical value of type `long` - * @pre Must not pass anything other than a Fixnum. - */ -static inline long -rbimpl_fix2long_by_idiv(VALUE x) -{ - RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(x)); - - /* :NOTE: VALUE can be wider than long. (x-1)/2 never overflows because - * RB_FIXNUM_P(x) holds. Also it has no portability issue like y>>1 - * below. */ - const SIGNED_VALUE y = RBIMPL_CAST((SIGNED_VALUE)(x - RUBY_FIXNUM_FLAG)); - const SIGNED_VALUE z = y / 2; - const long w = RBIMPL_CAST((long)z); - - RBIMPL_ASSERT_OR_ASSUME(RB_FIXABLE(w)); - return w; -} - -RBIMPL_ATTR_CONST_UNLESS_DEBUG() -RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) -/** - * @private - * - * This is an implementation detail of rb_fix2long(). People don't use it - * directly. - * - * @param[in] x A Fixnum. - * @return Identical value of type `long` - * @pre Must not pass anything other than a Fixnum. - */ -static inline long -rbimpl_fix2long_by_shift(VALUE x) -{ - RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(x)); - - /* :NOTE: VALUE can be wider than long. If right shift is arithmetic, this - * is noticeably faster than above. */ - const SIGNED_VALUE y = RBIMPL_CAST((SIGNED_VALUE)x); - const SIGNED_VALUE z = y >> 1; - const long w = RBIMPL_CAST((long)z); - - RBIMPL_ASSERT_OR_ASSUME(RB_FIXABLE(w)); - return w; -} - -RBIMPL_ATTR_CONST() -RBIMPL_ATTR_CONSTEXPR(CXX11) -/** - * @private - * - * This is an implementation detail of rb_fix2long(). People don't use it - * directly. - * - * @retval true This C compiler's right shift operator is arithmetic. - * @retval false This C compiler's right shift operator is logical. - */ -static inline bool -rbimpl_right_shift_is_arithmetic_p(void) -{ - return (-1 >> 1) == -1; -} - -RBIMPL_ATTR_CONST_UNLESS_DEBUG() -RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) -/** - * Converts a Fixnum into C's `long`. - * - * @param[in] x Some Fixnum. - * @pre Must not pass anything other than a Fixnum. - * @return The passed value converted into C's `long`. - */ -static inline long -rb_fix2long(VALUE x) -{ - if /* constexpr */ (rbimpl_right_shift_is_arithmetic_p()) { - return rbimpl_fix2long_by_shift(x); - } - else { - return rbimpl_fix2long_by_idiv(x); - } -} - -RBIMPL_ATTR_CONST_UNLESS_DEBUG() -RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) -/** - * Converts a Fixnum into C's `unsigned long`. - * - * @param[in] x Some Fixnum. - * @pre Must not pass anything other than a Fixnum. - * @return The passed value converted into C's `unsigned long`. - * @note Negative fixnums will be converted into large unsigned longs. - */ -static inline unsigned long -rb_fix2ulong(VALUE x) -{ - RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(x)); - return RBIMPL_CAST((unsigned long)rb_fix2long(x)); -} - -/** - * Converts an instance of ::rb_cNumeric into C's `long`. - * - * @param[in] x Something numeric. - * @exception rb_eTypeError `x` is not a numeric. - * @exception rb_eRangeError `x` is out of range of `long`. - * @return The passed value converted into C's `long`. - */ -static inline long -rb_num2long_inline(VALUE x) -{ - if (RB_FIXNUM_P(x)) - return RB_FIX2LONG(x); - else - return rb_num2long(x); -} - -/** - * Converts an instance of ::rb_cNumeric into C's `unsigned long`. - * - * @param[in] x Something numeric. - * @exception rb_eTypeError `x` is not a numeric. - * @exception rb_eRangeError `x` is out of range of `unsigned long`. - * @return The passed value converted into C's `unsigned long`. - * - * @internal - * - * This (negative fixnum would become a large unsigned long while negative - * bignum is an exception) has been THE behaviour of NUM2ULONG since the - * beginning. It is strange, but we can no longer change how it works at this - * moment. We have to get by with it. - * - * @see https://bugs.ruby-lang.org/issues/9089 - */ -static inline unsigned long -rb_num2ulong_inline(VALUE x) -{ - if (RB_FIXNUM_P(x)) - return RB_FIX2ULONG(x); - else - return rb_num2ulong(x); -} - -/** - * Converts a C's `long` into an instance of ::rb_cInteger. - * - * @param[in] v Arbitrary `long` value. - * @return An instance of ::rb_cInteger. - */ -static inline VALUE -rb_long2num_inline(long v) -{ - if (RB_FIXABLE(v)) - return RB_LONG2FIX(v); - else - return rb_int2big(v); -} - -/** - * Converts a C's `unsigned long` into an instance of ::rb_cInteger. - * - * @param[in] v Arbitrary `unsigned long` value. - * @return An instance of ::rb_cInteger. - */ -static inline VALUE -rb_ulong2num_inline(unsigned long v) -{ - if (RB_POSFIXABLE(v)) - return RB_LONG2FIX(RBIMPL_CAST((long)v)); - else - return rb_uint2big(v); -} - -/** - * @cond INTERNAL_MACRO - * - * Following overload is necessary because sometimes INT2FIX is used as a enum - * value (e.g. `enum { FOO = INT2FIX(0) };`). THIS IS NG in theory because a - * VALUE does not fit into an enum (which must be a signed int). But we cannot - * break existing codes. - */ -#if RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 -# /* C++ can write constexpr as enum values. */ - -#elif ! defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) -# undef INT2FIX -# define INT2FIX(i) (RBIMPL_CAST((VALUE)(i)) << 1 | RUBY_FIXNUM_FLAG) - -#else -# undef INT2FIX -# define INT2FIX(i) \ - __builtin_choose_expr( \ - __builtin_constant_p(i), \ - RBIMPL_CAST((VALUE)(i)) << 1 | RUBY_FIXNUM_FLAG, \ - RB_INT2FIX(i)) -#endif -/** @endcond */ - -#endif /* RBIMPL_ARITHMETIC_LONG_H */ diff --git a/include/ruby/internal/arithmetic/long_long.h b/include/ruby/internal/arithmetic/long_long.h deleted file mode 100644 index aab455c830..0000000000 --- a/include/ruby/internal/arithmetic/long_long.h +++ /dev/null @@ -1,135 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_LONG_LONG_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_LONG_LONG_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `long long` and Ruby's. - */ -#include "ruby/internal/value.h" -#include "ruby/internal/dllexport.h" -#include "ruby/internal/special_consts.h" -#include "ruby/backward/2/long_long.h" - -#define RB_LL2NUM rb_ll2num_inline /**< @alias{rb_ll2num_inline} */ -#define RB_ULL2NUM rb_ull2num_inline /**< @alias{rb_ull2num_inline} */ -#define LL2NUM RB_LL2NUM /**< @old{RB_LL2NUM} */ -#define ULL2NUM RB_ULL2NUM /**< @old{RB_ULL2NUM} */ -#define RB_NUM2LL rb_num2ll_inline /**< @alias{rb_num2ll_inline} */ -#define RB_NUM2ULL rb_num2ull_inline /**< @alias{rb_num2ull_inline} */ -#define NUM2LL RB_NUM2LL /**< @old{RB_NUM2LL} */ -#define NUM2ULL RB_NUM2ULL /**< @old{RB_NUM2ULL} */ - -RBIMPL_SYMBOL_EXPORT_BEGIN() -/** - * Converts a C's `long long` into an instance of ::rb_cInteger. - * - * @param[in] num Arbitrary `long long` value. - * @return An instance of ::rb_cInteger. - */ -VALUE rb_ll2inum(LONG_LONG num); - -/** - * Converts a C's `unsigned long long` into an instance of ::rb_cInteger. - * - * @param[in] num Arbitrary `unsigned long long` value. - * @return An instance of ::rb_cInteger. - */ -VALUE rb_ull2inum(unsigned LONG_LONG num); - -/** - * Converts an instance of ::rb_cNumeric into C's `long long`. - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `long long`. - * @return The passed value converted into C's `long long`. - */ -LONG_LONG rb_num2ll(VALUE num); - -/** - * Converts an instance of ::rb_cNumeric into C's `unsigned long long`. - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `unsigned long long`. - * @return The passed value converted into C's `unsigned long long`. - */ -unsigned LONG_LONG rb_num2ull(VALUE num); -RBIMPL_SYMBOL_EXPORT_END() - -/** - * Converts a C's `long long` into an instance of ::rb_cInteger. - * - * @param[in] n Arbitrary `long long` value. - * @return An instance of ::rb_cInteger - */ -static inline VALUE -rb_ll2num_inline(LONG_LONG n) -{ - if (FIXABLE(n)) return LONG2FIX((long)n); - return rb_ll2inum(n); -} - -/** - * Converts a C's `unsigned long long` into an instance of ::rb_cInteger. - * - * @param[in] n Arbitrary `unsigned long long` value. - * @return An instance of ::rb_cInteger - */ -static inline VALUE -rb_ull2num_inline(unsigned LONG_LONG n) -{ - if (POSFIXABLE(n)) return LONG2FIX((long)n); - return rb_ull2inum(n); -} - -/** - * Converts an instance of ::rb_cNumeric into C's `long long`. - * - * @param[in] x Something numeric. - * @exception rb_eTypeError `x` is not a numeric. - * @exception rb_eRangeError `x` is out of range of `long long`. - * @return The passed value converted into C's `long long`. - */ -static inline LONG_LONG -rb_num2ll_inline(VALUE x) -{ - if (RB_FIXNUM_P(x)) - return RB_FIX2LONG(x); - else - return rb_num2ll(x); -} - -/** - * Converts an instance of ::rb_cNumeric into C's `unsigned long long`. - * - * @param[in] x Something numeric. - * @exception rb_eTypeError `x` is not a numeric. - * @exception rb_eRangeError `x` is out of range of `unsigned long long`. - * @return The passed value converted into C's `unsigned long long`. - */ -static inline unsigned LONG_LONG -rb_num2ull_inline(VALUE x) -{ - if (RB_FIXNUM_P(x)) - return RBIMPL_CAST((unsigned LONG_LONG)RB_FIX2LONG(x)); - else - return rb_num2ull(x); -} - -#endif /* RBIMPL_ARITHMETIC_LONG_LONG_H */ diff --git a/include/ruby/internal/arithmetic/mode_t.h b/include/ruby/internal/arithmetic/mode_t.h deleted file mode 100644 index 5b7ad35fbc..0000000000 --- a/include/ruby/internal/arithmetic/mode_t.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_MODE_T_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_MODE_T_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `mode_t` and Ruby's. - */ -#include "ruby/internal/config.h" -#include "ruby/internal/arithmetic/int.h" - -/** Converts a C's `mode_t` into an instance of ::rb_cInteger. */ -#ifndef NUM2MODET -# define NUM2MODET RB_NUM2INT -#endif - -/** Converts an instance of ::rb_cNumeric into C's `mode_t`. */ -#ifndef MODET2NUM -# define MODET2NUM RB_INT2NUM -#endif - -/** A rb_sprintf() format prefix to be used for a `mode_t` parameter. */ -#ifndef PRI_MODET_PREFIX -# define PRI_MODET_PREFIX PRI_INT_PREFIX -#endif - -#endif /* RBIMPL_ARITHMETIC_MODE_T_H */ diff --git a/include/ruby/internal/arithmetic/off_t.h b/include/ruby/internal/arithmetic/off_t.h deleted file mode 100644 index 0ec9362cc9..0000000000 --- a/include/ruby/internal/arithmetic/off_t.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_OFF_T_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_OFF_T_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `off_t` and Ruby's. - */ -#include "ruby/internal/config.h" -#include "ruby/internal/arithmetic/int.h" -#include "ruby/internal/arithmetic/long.h" -#include "ruby/internal/arithmetic/long_long.h" -#include "ruby/backward/2/long_long.h" - -/** Converts a C's `off_t` into an instance of ::rb_cInteger. */ -#ifdef OFFT2NUM -# /* take that. */ -#elif SIZEOF_OFF_T == SIZEOF_LONG_LONG -# define OFFT2NUM RB_LL2NUM -#elif SIZEOF_OFF_T == SIZEOF_LONG -# define OFFT2NUM RB_LONG2NUM -#else -# define OFFT2NUM RB_INT2NUM -#endif - -/** Converts an instance of ::rb_cNumeric into C's `off_t`. */ -#ifdef NUM2OFFT -# /* take that. */ -#elif SIZEOF_OFF_T == SIZEOF_LONG_LONG -# define NUM2OFFT RB_NUM2LL -#elif SIZEOF_OFF_T == SIZEOF_LONG -# define NUM2OFFT RB_NUM2LONG -#else -# define NUM2OFFT RB_NUM2INT -#endif - -/** A rb_sprintf() format prefix to be used for an `off_t` parameter. */ -#ifdef PRI_OFFT_PREFIX -# /* take that. */ -#elif SIZEOF_OFF_T == SIZEOF_LONG_LONG -# define PRI_OFFT_PREFIX PRI_LL_PREFIX -#elif SIZEOF_OFF_T == SIZEOF_LONG -# define PRI_OFFT_PREFIX PRI_LONG_PREFIX -#else -# define PRI_OFFT_PREFIX PRI_INT_PREFIX -#endif - -#endif /* RBIMPL_ARITHMETIC_OFF_T_H */ diff --git a/include/ruby/internal/arithmetic/pid_t.h b/include/ruby/internal/arithmetic/pid_t.h deleted file mode 100644 index df9704e8f5..0000000000 --- a/include/ruby/internal/arithmetic/pid_t.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_PID_T_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_PID_T_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `pid_t` and Ruby's. - */ -#include "ruby/internal/config.h" -#include "ruby/internal/arithmetic/long.h" - -/** Converts a C's `pid_t` into an instance of ::rb_cInteger. */ -#ifndef PIDT2NUM -# define PIDT2NUM RB_LONG2NUM -#endif - -/** Converts an instance of ::rb_cNumeric into C's `pid_t`. */ -#ifndef NUM2PIDT -# define NUM2PIDT RB_NUM2LONG -#endif - -/** A rb_sprintf() format prefix to be used for a `pid_t` parameter. */ -#ifndef PRI_PIDT_PREFIX -# define PRI_PIDT_PREFIX PRI_LONG_PREFIX -#endif - -#endif /* RBIMPL_ARITHMETIC_PID_T_H */ diff --git a/include/ruby/internal/arithmetic/short.h b/include/ruby/internal/arithmetic/short.h deleted file mode 100644 index 7a324d945b..0000000000 --- a/include/ruby/internal/arithmetic/short.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_SHORT_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_SHORT_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `short` and Ruby's. - * - * Shyouhei wonders: why there is no SHORT2NUM, given there are both - * #USHORT2NUM and #CHR2FIX? - */ -#include "ruby/internal/value.h" -#include "ruby/internal/dllexport.h" -#include "ruby/internal/special_consts.h" - -#define RB_NUM2SHORT rb_num2short_inline /**< @alias{rb_num2short_inline} */ -#define RB_NUM2USHORT rb_num2ushort /**< @alias{rb_num2ushort} */ -#define NUM2SHORT RB_NUM2SHORT /**< @old{RB_NUM2SHORT} */ -#define NUM2USHORT RB_NUM2USHORT /**< @old{RB_NUM2USHORT} */ -#define USHORT2NUM RB_INT2FIX /**< @old{RB_INT2FIX} */ -#define RB_FIX2SHORT rb_fix2short /**< @alias{rb_fix2ushort} */ -#define FIX2SHORT RB_FIX2SHORT /**< @old{RB_FIX2SHORT} */ - -RBIMPL_SYMBOL_EXPORT_BEGIN() - -/** - * Converts an instance of ::rb_cNumeric into C's `short`. - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `short`. - * @return The passed value converted into C's `short`. - */ -short rb_num2short(VALUE num); - -/** - * Converts an instance of ::rb_cNumeric into C's `unsigned short`. - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `unsigned short`. - * @return The passed value converted into C's `unsigned short`. - */ -unsigned short rb_num2ushort(VALUE num); - -/** - * Identical to rb_num2short(). - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `short`. - * @return The passed value converted into C's `short`. - * - * @internal - * - * This function seems to be a complete waste of disk space. @shyouhei has no - * idea why this is a different thing from rb_num2short(). - */ -short rb_fix2short(VALUE num); - -/** - * Identical to rb_num2ushort(). - * - * @param[in] num Something numeric. - * @exception rb_eTypeError `num` is not a numeric. - * @exception rb_eRangeError `num` is out of range of `unsigned short`. - * @return The passed value converted into C's `unsigned short`. - * - * @internal - * - * This function seems to be a complete waste of disk space. @shyouhei has no - * idea why this is a different thing from rb_num2ushort(). - */ -unsigned short rb_fix2ushort(VALUE num); -RBIMPL_SYMBOL_EXPORT_END() - -/** - * Identical to rb_num2short(). - * - * @param[in] x Something numeric. - * @exception rb_eTypeError `x` is not a numeric. - * @exception rb_eRangeError `x` is out of range of `short`. - * @return The passed value converted into C's `short`. - * - * @internal - * - * This function seems to be a complete waste of time. @shyouhei has no idea - * why this is a different thing from rb_num2short(). - */ -static inline short -rb_num2short_inline(VALUE x) -{ - if (RB_FIXNUM_P(x)) - return rb_fix2short(x); - else - return rb_num2short(x); -} - -#endif /* RBIMPL_ARITHMETIC_SHORT_H */ diff --git a/include/ruby/internal/arithmetic/size_t.h b/include/ruby/internal/arithmetic/size_t.h deleted file mode 100644 index 1082160b8e..0000000000 --- a/include/ruby/internal/arithmetic/size_t.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_SIZE_T_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_SIZE_T_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `size_t` and Ruby's. - */ -#include "ruby/internal/config.h" -#include "ruby/internal/arithmetic/int.h" -#include "ruby/internal/arithmetic/long.h" -#include "ruby/internal/arithmetic/long_long.h" -#include "ruby/backward/2/long_long.h" - -#if defined(__DOXYGEN__) -# /** Converts a C's `size_t` into an instance of ::rb_cInteger. */ -# define RB_SIZE2NUM RB_ULONG2NUM -# /** Converts a C's `ssize_t` into an instance of ::rb_cInteger. */ -# define RB_SSIZE2NUM RB_LONG2NUM -#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG -# define RB_SIZE2NUM RB_ULL2NUM -# define RB_SSIZE2NUM RB_LL2NUM -#elif SIZEOF_SIZE_T == SIZEOF_LONG -# define RB_SIZE2NUM RB_ULONG2NUM -# define RB_SSIZE2NUM RB_LONG2NUM -#else -# define RB_SIZE2NUM RB_UINT2NUM -# define RB_SSIZE2NUM RB_INT2NUM -#endif - -#if defined(__DOXYGEN__) -# /** Converts an instance of ::rb_cInteger into C's `size_t`. */ -# define RB_NUM2SIZE RB_NUM2ULONG -# /** Converts an instance of ::rb_cInteger into C's `ssize_t`. */ -# define RB_NUM2SSIZE RB_NUM2LONG -#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG -# define RB_NUM2SIZE RB_NUM2ULL -# define RB_NUM2SSIZE RB_NUM2LL -#elif SIZEOF_SIZE_T == SIZEOF_LONG -# define RB_NUM2SIZE RB_NUM2ULONG -# define RB_NUM2SSIZE RB_NUM2LONG -#else -# define RB_NUM2SIZE RB_NUM2UINT -# define RB_NUM2SSIZE RB_NUM2INT -#endif - -#define NUM2SIZET RB_NUM2SIZE /**< @old{RB_NUM2SIZE} */ -#define SIZET2NUM RB_SIZE2NUM /**< @old{RB_SIZE2NUM} */ -#define NUM2SSIZET RB_NUM2SSIZE /**< @old{RB_NUM2SSIZE} */ -#define SSIZET2NUM RB_SSIZE2NUM /**< @old{RB_SSIZE2NUM} */ - -#endif /* RBIMPL_ARITHMETIC_SIZE_T_H */ diff --git a/include/ruby/internal/arithmetic/st_data_t.h b/include/ruby/internal/arithmetic/st_data_t.h deleted file mode 100644 index 91776b3fce..0000000000 --- a/include/ruby/internal/arithmetic/st_data_t.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef RBIMPL_ARITHMERIC_ST_DATA_T_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMERIC_ST_DATA_T_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `st_data_t` and Ruby's. - */ -#include "ruby/internal/arithmetic/fixnum.h" -#include "ruby/internal/arithmetic/long.h" -#include "ruby/internal/attr/artificial.h" -#include "ruby/internal/attr/const.h" -#include "ruby/internal/attr/constexpr.h" -#include "ruby/internal/cast.h" -#include "ruby/internal/value.h" -#include "ruby/assert.h" -#include "ruby/st.h" - -#define ST2FIX RB_ST2FIX /**< @old{RB_ST2FIX} */ -/** @cond INTERNAL_MACRO */ -#define RB_ST2FIX RB_ST2FIX -/** @endcond */ - -RBIMPL_ATTR_CONST_UNLESS_DEBUG() -RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) -RBIMPL_ATTR_ARTIFICIAL() -/** - * Converts a C's `st_data_t` into an instance of ::rb_cInteger. - * - * @param[in] i The data in question. - * @return A converted result - * @warning THIS CONVERSION LOSES DATA! Be warned. - * @see https://bugs.ruby-lang.org/issues/13877 - * @see https://bugs.ruby-lang.org/issues/14218 - * - * @internal - * - * This is needed because of hash functions. Hash functions return - * `st_data_t`, which could theoretically be bigger than Fixnums. However - * allocating Bignums for them every time we calculate hash values is just too - * heavy. To avoid penalty we need to ignore some upper bit(s) and stick to - * Fixnums. This function is used for that purpose. - */ -static inline VALUE -RB_ST2FIX(st_data_t i) -{ - SIGNED_VALUE x = RBIMPL_CAST((SIGNED_VALUE)i); - - if (x >= 0) { - x &= RUBY_FIXNUM_MAX; - } - else { - x |= RUBY_FIXNUM_MIN; - } - - RBIMPL_ASSERT_OR_ASSUME(RB_FIXABLE(x)); - unsigned long y = RBIMPL_CAST((unsigned long)x); - return RB_LONG2FIX(RBIMPL_CAST((long)y)); -} - -#endif /* RBIMPL_ARITHMETIC_ST_DATA_T_H */ diff --git a/include/ruby/internal/arithmetic/uid_t.h b/include/ruby/internal/arithmetic/uid_t.h deleted file mode 100644 index 12cde2a9c8..0000000000 --- a/include/ruby/internal/arithmetic/uid_t.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef RBIMPL_ARITHMETIC_UID_T_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_ARITHMETIC_UID_T_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @copyright This file is a part of the programming language Ruby. - * Permission is hereby granted, to either redistribute and/or - * modify this file, provided that the conditions mentioned in the - * file COPYING are met. Consult the file for details. - * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are - * implementation details. Don't take them as canon. They could - * rapidly appear then vanish. The name (path) of this header file - * is also an implementation detail. Do not expect it to persist - * at the place it is now. Developers are free to move it anywhere - * anytime at will. - * @note To ruby-core: remember that this header can be possibly - * recursively included from extension libraries written in C++. - * Do not expect for instance `__VA_ARGS__` is always available. - * We assume C99 for ruby itself but we don't assume languages of - * extension libraries. They could be written in C++98. - * @brief Arithmetic conversion between C's `uid_t` and Ruby's. - */ -#include "ruby/internal/config.h" -#include "ruby/internal/arithmetic/long.h" - -/** Converts a C's `uid_t` into an instance of ::rb_cInteger. */ -#ifndef UIDT2NUM -# define UIDT2NUM RB_LONG2NUM -#endif - -/** Converts an instance of ::rb_cNumeric into C's `uid_t`. */ -#ifndef NUM2UIDT -# define NUM2UIDT RB_NUM2LONG -#endif - -/** A rb_sprintf() format prefix to be used for a `uid_t` parameter. */ -#ifndef PRI_UIDT_PREFIX -# define PRI_UIDT_PREFIX PRI_LONG_PREFIX -#endif - -#endif /* RBIMPL_ARITHMETIC_UID_T_H */ |
