-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathglobals.h
209 lines (192 loc) · 9.77 KB
/
globals.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#ifndef RBIMPL_GLOBALS_H /*-*-C++-*-vi:se ft=cpp:*/
#define RBIMPL_GLOBALS_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 Ruby-level global variables / constants, visible from C.
*/
#include "ruby/internal/attr/pure.h"
#include "ruby/internal/dllexport.h"
#include "ruby/internal/fl_type.h"
#include "ruby/internal/special_consts.h"
#include "ruby/internal/value.h"
#include "ruby/internal/value_type.h"
/**
* @defgroup object Core objects and their operations
*
* @internal
*
* There are several questionable constants listed in this header file. They
* are intentionally left untouched for purely academic backwards compatibility
* concerns. But for instance do any one of 3rd party extension libraries even
* need to know that there is NameError::Message?
*
* @endinternal
*
* @{
*/
RBIMPL_SYMBOL_EXPORT_BEGIN()
/**
* @private
*
* @deprecated This macro once was a thing in the old days, but makes no sense
* any longer today. Exists here for backwards compatibility
* only. You can safely forget about it.
*/
#define RUBY_INTEGER_UNIFICATION 1
RUBY_EXTERN VALUE rb_mKernel; /**< `Kernel` module. */
RUBY_EXTERN VALUE rb_mComparable; /**< `Comparable` module. */
RUBY_EXTERN VALUE rb_mEnumerable; /**< `Enumerable` module. */
RUBY_EXTERN VALUE rb_mErrno; /**< `Errno` module. */
RUBY_EXTERN VALUE rb_mFileTest; /**< `FileTest` module. */
RUBY_EXTERN VALUE rb_mGC; /**< `GC` module. */
RUBY_EXTERN VALUE rb_mMath; /**< `Math` module. */
RUBY_EXTERN VALUE rb_mProcess; /**< `Process` module. */
RUBY_EXTERN VALUE rb_mWaitReadable; /**< `IO::WaitReadable` module. */
RUBY_EXTERN VALUE rb_mWaitWritable; /**< `IO::WaitReadable` module. */
RUBY_EXTERN VALUE rb_cBasicObject; /**< `BasicObject` class. */
RUBY_EXTERN VALUE rb_cObject; /**< `Object` class. */
RUBY_EXTERN VALUE rb_cArray; /**< `Array` class. */
RUBY_EXTERN VALUE rb_cBinding; /**< `Binding` class. */
RUBY_EXTERN VALUE rb_cClass; /**< `Class` class. */
RUBY_EXTERN VALUE rb_cDir; /**< `Dir` class. */
RUBY_EXTERN VALUE rb_cEncoding; /**< `Encoding` class. */
RUBY_EXTERN VALUE rb_cEnumerator; /**< `Enumerator` class. */
RUBY_EXTERN VALUE rb_cFalseClass; /**< `FalseClass` class. */
RUBY_EXTERN VALUE rb_cFile; /**< `File` class. */
RUBY_EXTERN VALUE rb_cComplex; /**< `Complex` class. */
RUBY_EXTERN VALUE rb_cFloat; /**< `Float` class. */
RUBY_EXTERN VALUE rb_cHash; /**< `Hash` class. */
RUBY_EXTERN VALUE rb_cIO; /**< `IO` class. */
RUBY_EXTERN VALUE rb_cInteger; /**< `Module` class. */
RUBY_EXTERN VALUE rb_cMatch; /**< `MatchData` class. */
RUBY_EXTERN VALUE rb_cMethod; /**< `Method` class. */
RUBY_EXTERN VALUE rb_cModule; /**< `Module` class. */
RUBY_EXTERN VALUE rb_cRefinement; /**< `Refinement` class. */
RUBY_EXTERN VALUE rb_cNameErrorMesg; /**< `NameError::Message` class. */
RUBY_EXTERN VALUE rb_cNilClass; /**< `NilClass` class. */
RUBY_EXTERN VALUE rb_cNumeric; /**< `Numeric` class. */
RUBY_EXTERN VALUE rb_cProc; /**< `Proc` class. */
RUBY_EXTERN VALUE rb_cRandom; /**< `Random` class. */
RUBY_EXTERN VALUE rb_cRange; /**< `Range` class. */
RUBY_EXTERN VALUE rb_cRational; /**< `Rational` class. */
RUBY_EXTERN VALUE rb_cRegexp; /**< `Regexp` class. */
RUBY_EXTERN VALUE rb_cStat; /**< `File::Stat` class. */
RUBY_EXTERN VALUE rb_cString; /**< `String` class. */
RUBY_EXTERN VALUE rb_cStruct; /**< `Struct` class. */
RUBY_EXTERN VALUE rb_cSymbol; /**< `Symbol` class. */
RUBY_EXTERN VALUE rb_cThread; /**< `Thread` class. */
RUBY_EXTERN VALUE rb_cTime; /**< `Time` class. */
RUBY_EXTERN VALUE rb_cTrueClass; /**< `TrueClass` class. */
RUBY_EXTERN VALUE rb_cUnboundMethod; /**< `UnboundMethod` class. */
/**
* @}
* @addtogroup exception
* @{
*/
RUBY_EXTERN VALUE rb_eException; /**< Mother of all exceptions. */
RUBY_EXTERN VALUE rb_eStandardError; /**< `StandardError` exception. */
RUBY_EXTERN VALUE rb_eSystemExit; /**< `SystemExit` exception. */
RUBY_EXTERN VALUE rb_eInterrupt; /**< `Interrupt` exception. */
RUBY_EXTERN VALUE rb_eSignal; /**< `SignalException` exception. */
RUBY_EXTERN VALUE rb_eFatal; /**< `fatal` exception. */
RUBY_EXTERN VALUE rb_eArgError; /**< `ArgumentError` exception. */
RUBY_EXTERN VALUE rb_eEOFError; /**< `EOFError` exception. */
RUBY_EXTERN VALUE rb_eIndexError; /**< `IndexError` exception. */
RUBY_EXTERN VALUE rb_eStopIteration; /**< `StopIteration` exception. */
RUBY_EXTERN VALUE rb_eKeyError; /**< `KeyError` exception. */
RUBY_EXTERN VALUE rb_eRangeError; /**< `RangeError` exception. */
RUBY_EXTERN VALUE rb_eIOError; /**< `IOError` exception. */
RUBY_EXTERN VALUE rb_eRuntimeError; /**< `RuntimeError` exception. */
RUBY_EXTERN VALUE rb_eFrozenError; /**< `FrozenError` exception. */
RUBY_EXTERN VALUE rb_eSecurityError; /**< `SecurityError` exception. */
RUBY_EXTERN VALUE rb_eSystemCallError; /**< `SystemCallError` exception. */
RUBY_EXTERN VALUE rb_eThreadError; /**< `ThreadError` exception. */
RUBY_EXTERN VALUE rb_eTypeError; /**< `TypeError` exception. */
RUBY_EXTERN VALUE rb_eZeroDivError; /**< `ZeroDivisionError` exception. */
RUBY_EXTERN VALUE rb_eNotImpError; /**< `NotImplementedError` exception. */
RUBY_EXTERN VALUE rb_eNoMemError; /**< `NoMemoryError` exception. */
RUBY_EXTERN VALUE rb_eNoMethodError; /**< `NoMethodError` exception. */
RUBY_EXTERN VALUE rb_eFloatDomainError; /**< `FloatDomainError` exception. */
RUBY_EXTERN VALUE rb_eLocalJumpError; /**< `LocalJumpError` exception. */
RUBY_EXTERN VALUE rb_eSysStackError; /**< `SystemStackError` exception. */
RUBY_EXTERN VALUE rb_eRegexpError; /**< `RegexpError` exception. */
RUBY_EXTERN VALUE rb_eEncodingError; /**< `EncodingError` exception. */
RUBY_EXTERN VALUE rb_eEncCompatError; /**< `Encoding::CompatibilityError` exception. */
RUBY_EXTERN VALUE rb_eNoMatchingPatternError; /**< `NoMatchingPatternError` exception. */
RUBY_EXTERN VALUE rb_eNoMatchingPatternKeyError; /**< `NoMatchingPatternKeyError` exception. */
RUBY_EXTERN VALUE rb_eScriptError; /**< `ScriptError` exception. */
RUBY_EXTERN VALUE rb_eNameError; /**< `NameError` exception. */
RUBY_EXTERN VALUE rb_eSyntaxError; /**< `SyntaxError` exception. */
RUBY_EXTERN VALUE rb_eLoadError; /**< `LoadError` exception. */
RUBY_EXTERN VALUE rb_eMathDomainError; /**< `Math::DomainError` exception. */
/**
* @}
* @addtogroup object
* @{
*/
RUBY_EXTERN VALUE rb_stdin; /**< `STDIN` constant. */
RUBY_EXTERN VALUE rb_stdout; /**< `STDOUT` constant. */
RUBY_EXTERN VALUE rb_stderr; /**< `STDERR` constant. */
RBIMPL_ATTR_PURE()
/**
* Object to class mapping function. Every object have its class. This
* function obtains that.
*
* @param[in] obj Target object to query.
* @return The class of the given object.
*
* @internal
*
* This function is a super-duper hot path. Optimised targeting modern C
* compilers and x86_64 architecture.
*/
static inline VALUE
rb_class_of(VALUE obj)
{
if (! RB_SPECIAL_CONST_P(obj)) {
return RBASIC_CLASS(obj);
}
else if (obj == RUBY_Qfalse) {
return rb_cFalseClass;
}
else if (obj == RUBY_Qnil) {
return rb_cNilClass;
}
else if (obj == RUBY_Qtrue) {
return rb_cTrueClass;
}
else if (RB_FIXNUM_P(obj)) {
return rb_cInteger;
}
else if (RB_STATIC_SYM_P(obj)) {
return rb_cSymbol;
}
else if (RB_FLONUM_P(obj)) {
return rb_cFloat;
}
#if !RUBY_DEBUG
RBIMPL_UNREACHABLE_RETURN(Qfalse);
#else
RUBY_ASSERT_FAIL("unexpected type");
#endif
}
#define CLASS_OF rb_class_of /**< @old{rb_class_of} */
RBIMPL_SYMBOL_EXPORT_END()
/** @} */
#endif /* RBIMPL_GLOBALS_H */