1#ifndef RBIMPL_VALUE_TYPE_H
2#define RBIMPL_VALUE_TYPE_H
52# error Bail out due to conflicting definition of T_DATA.
55#define T_ARRAY RUBY_T_ARRAY
56#define T_BIGNUM RUBY_T_BIGNUM
57#define T_CLASS RUBY_T_CLASS
58#define T_COMPLEX RUBY_T_COMPLEX
59#define T_DATA RUBY_T_DATA
60#define T_FALSE RUBY_T_FALSE
61#define T_FILE RUBY_T_FILE
62#define T_FIXNUM RUBY_T_FIXNUM
63#define T_FLOAT RUBY_T_FLOAT
64#define T_HASH RUBY_T_HASH
65#define T_ICLASS RUBY_T_ICLASS
66#define T_IMEMO RUBY_T_IMEMO
67#define T_MASK RUBY_T_MASK
68#define T_MATCH RUBY_T_MATCH
69#define T_MODULE RUBY_T_MODULE
70#define T_MOVED RUBY_T_MOVED
71#define T_NIL RUBY_T_NIL
72#define T_NODE RUBY_T_NODE
73#define T_NONE RUBY_T_NONE
74#define T_OBJECT RUBY_T_OBJECT
75#define T_RATIONAL RUBY_T_RATIONAL
76#define T_REGEXP RUBY_T_REGEXP
77#define T_STRING RUBY_T_STRING
78#define T_STRUCT RUBY_T_STRUCT
79#define T_SYMBOL RUBY_T_SYMBOL
80#define T_TRUE RUBY_T_TRUE
81#define T_UNDEF RUBY_T_UNDEF
82#define T_ZOMBIE RUBY_T_ZOMBIE
84#define BUILTIN_TYPE RB_BUILTIN_TYPE
85#define DYNAMIC_SYM_P RB_DYNAMIC_SYM_P
86#define RB_INTEGER_TYPE_P rb_integer_type_p
87#define SYMBOL_P RB_SYMBOL_P
88#define rb_type_p RB_TYPE_P
91#define RB_BUILTIN_TYPE RB_BUILTIN_TYPE
92#define RB_DYNAMIC_SYM_P RB_DYNAMIC_SYM_P
93#define RB_FLOAT_TYPE_P RB_FLOAT_TYPE_P
94#define RB_SYMBOL_P RB_SYMBOL_P
95#define RB_TYPE_P RB_TYPE_P
96#define Check_Type Check_Type
99# define RBIMPL_ASSERT_TYPE(v, t) RBIMPL_ASSERT_OR_ASSUME(RB_TYPE_P((v), (t)))
101# define RBIMPL_ASSERT_TYPE Check_Type
105#define TYPE(_) RBIMPL_CAST((int)rb_type(_))
153RB_BUILTIN_TYPE(
VALUE obj)
163rb_integer_type_p(
VALUE obj)
165 if (RB_FIXNUM_P(obj)) {
168 else if (RB_SPECIAL_CONST_P(obj)) {
180 if (! RB_SPECIAL_CONST_P(obj)) {
181 return RB_BUILTIN_TYPE(obj);
195 else if (RB_FIXNUM_P(obj)) {
198 else if (RB_STATIC_SYM_P(obj)) {
210RB_FLOAT_TYPE_P(
VALUE obj)
212 if (RB_FLONUM_P(obj)) {
215 else if (RB_SPECIAL_CONST_P(obj)) {
226RB_DYNAMIC_SYM_P(
VALUE obj)
228 if (RB_SPECIAL_CONST_P(obj)) {
239RB_SYMBOL_P(
VALUE obj)
241 return RB_STATIC_SYM_P(obj) || RB_DYNAMIC_SYM_P(obj);
263 return RB_FIXNUM_P(obj);
266 return RB_SYMBOL_P(obj);
269 return RB_FLOAT_TYPE_P(obj);
271 else if (RB_SPECIAL_CONST_P(obj)) {
274 else if (
t == RB_BUILTIN_TYPE(obj)) {
288 return rbimpl_RB_TYPE_P_fastpath(obj,
t);
291 return t == rb_type(obj);
298#if defined(__clang__)
300# define RB_TYPE_P(obj, t) \
301 (RBIMPL_CONSTANT_P(t) ? \
302 rbimpl_RB_TYPE_P_fastpath((obj), (t)) : \
303 (RB_TYPE_P)((obj), (t)))
310#if RBIMPL_COMPILER_BEFORE(Clang, 4, 0, 0)
311# undef rb_integer_type_p
312# define rb_integer_type_p(obj) \
314 const VALUE integer_type_obj = (obj); \
315 (RB_FIXNUM_P(integer_type_obj) || \
316 (!RB_SPECIAL_CONST_P(integer_type_obj) && \
317 RB_BUILTIN_TYPE(integer_type_obj) == RUBY_T_BIGNUM)); \
325static inline
bool rbimpl_rtypeddata_p(
VALUE obj);
337 else if (rbimpl_rtypeddata_p(v)) {
Defines RBIMPL_ATTR_ARTIFICIAL.
#define RBIMPL_ATTR_ARTIFICIAL()
Wraps (or simulates) __attribute__((artificial))
#define RBIMPL_ASSERT_OR_ASSUME(expr)
This is either RUBY_ASSERT or RBIMPL_ASSUME, depending on RUBY_DEBUG.
Defines RBIMPL_ATTR_COLD.
#define RBIMPL_ATTR_COLD()
Wraps (or simulates) __attribute__((cold))
Defines RBIMPL_CONSTANT_P.
#define RBIMPL_CONSTANT_P(expr)
Tewaking visibility of C variables/functions.
#define RBIMPL_SYMBOL_EXPORT_END()
Counterpart of RBIMPL_SYMBOL_EXPORT_BEGIN.
#define RBIMPL_SYMBOL_EXPORT_BEGIN()
Shortcut macro equivalent to RUBY_SYMBOL_EXPORT_BEGIN extern "C" {.
RBIMPL_ATTR_ENUM_EXTENSIBILITY.
#define RBIMPL_ATTR_ENUM_EXTENSIBILITY(_)
Wraps (or simulates) __attribute__((enum_extensibility))
Defines RBIMPL_ATTR_FORCEINLINE.
#define RBIMPL_ATTR_FORCEINLINE()
Wraps (or simulates) __forceinline.
void rb_check_type(VALUE obj, int t)
Defines RBIMPL_HAS_BUILTIN.
Defines RBIMPL_ASSUME / RBIMPL_UNREACHABLE.
#define RBIMPL_ASSUME(_)
Wraps (or simulates) __builtin_unreachable.
Defines RBIMPL_ATTR_PURE.
#define RBIMPL_ATTR_PURE()
Wraps (or simulates) __attribute__((pure))
#define RBIMPL_ATTR_PURE_UNLESS_DEBUG()
Enables RBIMPL_ATTR_PURE iff.
Defines enum ruby_special_consts.
ruby_value_type
C-level type of an object.
@ RUBY_T_ICLASS
Hidden classes known as IClasses.
@ RUBY_T_FIXNUM
Integers formerly known as Fixnums.
@ RUBY_T_NONE
Non-object (sweeped etc.)