Allow ruby versions 3.2 and 3.4 for installation
This commit is contained in:
81
libs/libruby/ruby/internal/arithmetic/char.h
vendored
Normal file
81
libs/libruby/ruby/internal/arithmetic/char.h
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
#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 */
|
||||
72
libs/libruby/ruby/internal/arithmetic/double.h
vendored
Normal file
72
libs/libruby/ruby/internal/arithmetic/double.h
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
#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 */
|
||||
60
libs/libruby/ruby/internal/arithmetic/fixnum.h
vendored
Normal file
60
libs/libruby/ruby/internal/arithmetic/fixnum.h
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
#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 */
|
||||
41
libs/libruby/ruby/internal/arithmetic/gid_t.h
vendored
Normal file
41
libs/libruby/ruby/internal/arithmetic/gid_t.h
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
#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 */
|
||||
264
libs/libruby/ruby/internal/arithmetic/int.h
vendored
Normal file
264
libs/libruby/ruby/internal/arithmetic/int.h
vendored
Normal file
@@ -0,0 +1,264 @@
|
||||
#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(v);
|
||||
else
|
||||
return rb_uint2big(v);
|
||||
}
|
||||
|
||||
RBIMPL_WARNING_POP()
|
||||
|
||||
#endif /* RBIMPL_ARITHMETIC_INT_H */
|
||||
74
libs/libruby/ruby/internal/arithmetic/intptr_t.h
vendored
Normal file
74
libs/libruby/ruby/internal/arithmetic/intptr_t.h
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
#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 */
|
||||
356
libs/libruby/ruby/internal/arithmetic/long.h
vendored
Normal file
356
libs/libruby/ruby/internal/arithmetic/long.h
vendored
Normal file
@@ -0,0 +1,356 @@
|
||||
#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 = i;
|
||||
const unsigned long k = (j << 1) + RUBY_FIXNUM_FLAG;
|
||||
const long l = k;
|
||||
const SIGNED_VALUE m = l; /* Sign extend */
|
||||
const VALUE n = 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 = 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 = 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 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(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 */
|
||||
135
libs/libruby/ruby/internal/arithmetic/long_long.h
vendored
Normal file
135
libs/libruby/ruby/internal/arithmetic/long_long.h
vendored
Normal file
@@ -0,0 +1,135 @@
|
||||
#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 RB_FIX2LONG(x);
|
||||
else
|
||||
return rb_num2ull(x);
|
||||
}
|
||||
|
||||
#endif /* RBIMPL_ARITHMETIC_LONG_LONG_H */
|
||||
41
libs/libruby/ruby/internal/arithmetic/mode_t.h
vendored
Normal file
41
libs/libruby/ruby/internal/arithmetic/mode_t.h
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
#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 */
|
||||
62
libs/libruby/ruby/internal/arithmetic/off_t.h
vendored
Normal file
62
libs/libruby/ruby/internal/arithmetic/off_t.h
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
#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 */
|
||||
41
libs/libruby/ruby/internal/arithmetic/pid_t.h
vendored
Normal file
41
libs/libruby/ruby/internal/arithmetic/pid_t.h
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
#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 */
|
||||
113
libs/libruby/ruby/internal/arithmetic/short.h
vendored
Normal file
113
libs/libruby/ruby/internal/arithmetic/short.h
vendored
Normal file
@@ -0,0 +1,113 @@
|
||||
#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 */
|
||||
66
libs/libruby/ruby/internal/arithmetic/size_t.h
vendored
Normal file
66
libs/libruby/ruby/internal/arithmetic/size_t.h
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
#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 */
|
||||
75
libs/libruby/ruby/internal/arithmetic/st_data_t.h
vendored
Normal file
75
libs/libruby/ruby/internal/arithmetic/st_data_t.h
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
#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 = 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(y);
|
||||
}
|
||||
|
||||
#endif /* RBIMPL_ARITHMETIC_ST_DATA_T_H */
|
||||
41
libs/libruby/ruby/internal/arithmetic/uid_t.h
vendored
Normal file
41
libs/libruby/ruby/internal/arithmetic/uid_t.h
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
#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 */
|
||||
Reference in New Issue
Block a user