1 | /**********************************************************************
|
---|
2 |
|
---|
3 | ruby.h -
|
---|
4 |
|
---|
5 | $Author: knu $
|
---|
6 | created at: Thu Jun 10 14:26:32 JST 1993
|
---|
7 |
|
---|
8 | Copyright (C) 1993-2003 Yukihiro Matsumoto
|
---|
9 | Copyright (C) 2000 Network Applied Communication Laboratory, Inc.
|
---|
10 | Copyright (C) 2000 Information-technology Promotion Agency, Japan
|
---|
11 |
|
---|
12 | **********************************************************************/
|
---|
13 |
|
---|
14 | #ifndef RUBY_H
|
---|
15 | #define RUBY_H
|
---|
16 |
|
---|
17 | #if defined(__cplusplus)
|
---|
18 | extern "C" {
|
---|
19 | #if 0
|
---|
20 | } /* satisfy cc-mode */
|
---|
21 | #endif
|
---|
22 | #endif
|
---|
23 |
|
---|
24 | #include "config.h"
|
---|
25 | #ifdef RUBY_EXTCONF_H
|
---|
26 | #include RUBY_EXTCONF_H
|
---|
27 | #endif
|
---|
28 |
|
---|
29 | #define NORETURN_STYLE_NEW 1
|
---|
30 | #ifndef NORETURN
|
---|
31 | # define NORETURN(x) x
|
---|
32 | #endif
|
---|
33 | #ifndef NOINLINE
|
---|
34 | # define NOINLINE(x) x
|
---|
35 | #endif
|
---|
36 |
|
---|
37 | #include "defines.h"
|
---|
38 |
|
---|
39 | #ifdef HAVE_STDLIB_H
|
---|
40 | # include <stdlib.h>
|
---|
41 | #endif
|
---|
42 |
|
---|
43 | #ifdef HAVE_STRING_H
|
---|
44 | # include <string.h>
|
---|
45 | #else
|
---|
46 | # include <strings.h>
|
---|
47 | #endif
|
---|
48 |
|
---|
49 | #ifdef HAVE_INTRINSICS_H
|
---|
50 | # include <intrinsics.h>
|
---|
51 | #endif
|
---|
52 |
|
---|
53 | #include <stddef.h>
|
---|
54 | #include <stdio.h>
|
---|
55 |
|
---|
56 | /* need to include <ctype.h> to use these macros */
|
---|
57 | #ifndef ISPRINT
|
---|
58 | #define ISASCII(c) isascii((int)(unsigned char)(c))
|
---|
59 | #undef ISPRINT
|
---|
60 | #define ISPRINT(c) (ISASCII(c) && isprint((int)(unsigned char)(c)))
|
---|
61 | #define ISSPACE(c) (ISASCII(c) && isspace((int)(unsigned char)(c)))
|
---|
62 | #define ISUPPER(c) (ISASCII(c) && isupper((int)(unsigned char)(c)))
|
---|
63 | #define ISLOWER(c) (ISASCII(c) && islower((int)(unsigned char)(c)))
|
---|
64 | #define ISALNUM(c) (ISASCII(c) && isalnum((int)(unsigned char)(c)))
|
---|
65 | #define ISALPHA(c) (ISASCII(c) && isalpha((int)(unsigned char)(c)))
|
---|
66 | #define ISDIGIT(c) (ISASCII(c) && isdigit((int)(unsigned char)(c)))
|
---|
67 | #define ISXDIGIT(c) (ISASCII(c) && isxdigit((int)(unsigned char)(c)))
|
---|
68 | #endif
|
---|
69 |
|
---|
70 | #if defined(HAVE_ALLOCA_H)
|
---|
71 | #include <alloca.h>
|
---|
72 | #else
|
---|
73 | # ifdef _AIX
|
---|
74 | #pragma alloca
|
---|
75 | # endif
|
---|
76 | #endif
|
---|
77 |
|
---|
78 | #if defined(__VMS)
|
---|
79 | # pragma builtins
|
---|
80 | # define alloca __alloca
|
---|
81 | #endif
|
---|
82 |
|
---|
83 | #if SIZEOF_LONG != SIZEOF_VOIDP
|
---|
84 | # error ---->> ruby requires sizeof(void*) == sizeof(long) to be compiled. <<----
|
---|
85 | #else
|
---|
86 | typedef unsigned long VALUE;
|
---|
87 | typedef unsigned long ID;
|
---|
88 | #endif
|
---|
89 |
|
---|
90 | #ifdef __STDC__
|
---|
91 | # include <limits.h>
|
---|
92 | #else
|
---|
93 | # ifndef LONG_MAX
|
---|
94 | # ifdef HAVE_LIMITS_H
|
---|
95 | # include <limits.h>
|
---|
96 | # else
|
---|
97 | /* assuming 32bit(2's compliment) long */
|
---|
98 | # define LONG_MAX 2147483647
|
---|
99 | # endif
|
---|
100 | # endif
|
---|
101 | # ifndef LONG_MIN
|
---|
102 | # define LONG_MIN (-LONG_MAX-1)
|
---|
103 | # endif
|
---|
104 | # ifndef CHAR_BIT
|
---|
105 | # define CHAR_BIT 8
|
---|
106 | # endif
|
---|
107 | #endif
|
---|
108 |
|
---|
109 | #ifdef HAVE_LONG_LONG
|
---|
110 | # ifndef LLONG_MAX
|
---|
111 | # ifdef LONG_LONG_MAX
|
---|
112 | # define LLONG_MAX LONG_LONG_MAX
|
---|
113 | # else
|
---|
114 | # ifdef _I64_MAX
|
---|
115 | # define LLONG_MAX _I64_MAX
|
---|
116 | # else
|
---|
117 | /* assuming 64bit(2's complement) long long */
|
---|
118 | # define LLONG_MAX 9223372036854775807LL
|
---|
119 | # endif
|
---|
120 | # endif
|
---|
121 | # endif
|
---|
122 | # ifndef LLONG_MIN
|
---|
123 | # ifdef LONG_LONG_MIN
|
---|
124 | # define LLONG_MIN LONG_LONG_MIN
|
---|
125 | # else
|
---|
126 | # ifdef _I64_MIN
|
---|
127 | # define LLONG_MIN _I64_MIN
|
---|
128 | # else
|
---|
129 | # define LLONG_MIN (-LLONG_MAX-1)
|
---|
130 | # endif
|
---|
131 | # endif
|
---|
132 | # endif
|
---|
133 | #endif
|
---|
134 |
|
---|
135 | #define FIXNUM_MAX (LONG_MAX>>1)
|
---|
136 | #define FIXNUM_MIN RSHIFT((long)LONG_MIN,1)
|
---|
137 |
|
---|
138 | #define FIXNUM_FLAG 0x01
|
---|
139 | #define INT2FIX(i) ((VALUE)(((long)(i))<<1 | FIXNUM_FLAG))
|
---|
140 | #define LONG2FIX(i) INT2FIX(i)
|
---|
141 | #define rb_fix_new(v) INT2FIX(v)
|
---|
142 | VALUE rb_int2inum _((long));
|
---|
143 | #define INT2NUM(v) rb_int2inum(v)
|
---|
144 | #define LONG2NUM(v) INT2NUM(v)
|
---|
145 | #define rb_int_new(v) rb_int2inum(v)
|
---|
146 | VALUE rb_uint2inum _((unsigned long));
|
---|
147 | #define UINT2NUM(v) rb_uint2inum(v)
|
---|
148 | #define ULONG2NUM(v) UINT2NUM(v)
|
---|
149 | #define rb_uint_new(v) rb_uint2inum(v)
|
---|
150 |
|
---|
151 | #ifdef HAVE_LONG_LONG
|
---|
152 | VALUE rb_ll2inum _((LONG_LONG));
|
---|
153 | #define LL2NUM(v) rb_ll2inum(v)
|
---|
154 | VALUE rb_ull2inum _((unsigned LONG_LONG));
|
---|
155 | #define ULL2NUM(v) rb_ull2inum(v)
|
---|
156 | #endif
|
---|
157 |
|
---|
158 | #if SIZEOF_OFF_T > SIZEOF_LONG && defined(HAVE_LONG_LONG)
|
---|
159 | # define OFFT2NUM(v) LL2NUM(v)
|
---|
160 | #elif SIZEOF_OFF_T == SIZEOF_LONG
|
---|
161 | # define OFFT2NUM(v) LONG2NUM(v)
|
---|
162 | #else
|
---|
163 | # define OFFT2NUM(v) INT2NUM(v)
|
---|
164 | #endif
|
---|
165 |
|
---|
166 | #define FIX2LONG(x) RSHIFT((long)x,1)
|
---|
167 | #define FIX2ULONG(x) (((unsigned long)(x))>>1)
|
---|
168 | #define FIXNUM_P(f) (((long)(f))&FIXNUM_FLAG)
|
---|
169 | #define POSFIXABLE(f) ((f) <= FIXNUM_MAX)
|
---|
170 | #define NEGFIXABLE(f) ((f) >= FIXNUM_MIN)
|
---|
171 | #define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f))
|
---|
172 |
|
---|
173 | #define IMMEDIATE_MASK 0x03
|
---|
174 | #define IMMEDIATE_P(x) ((VALUE)(x) & IMMEDIATE_MASK)
|
---|
175 |
|
---|
176 | #define SYMBOL_FLAG 0x0e
|
---|
177 | #define SYMBOL_P(x) (((VALUE)(x)&0xff)==SYMBOL_FLAG)
|
---|
178 | #define ID2SYM(x) ((VALUE)(((long)(x))<<8|SYMBOL_FLAG))
|
---|
179 | #define SYM2ID(x) RSHIFT((unsigned long)x,8)
|
---|
180 |
|
---|
181 | /* special contants - i.e. non-zero and non-fixnum constants */
|
---|
182 | #define Qfalse ((VALUE)0)
|
---|
183 | #define Qtrue ((VALUE)2)
|
---|
184 | #define Qnil ((VALUE)4)
|
---|
185 | #define Qundef ((VALUE)6) /* undefined value for placeholder */
|
---|
186 |
|
---|
187 | #define RTEST(v) (((VALUE)(v) & ~Qnil) != 0)
|
---|
188 | #define NIL_P(v) ((VALUE)(v) == Qnil)
|
---|
189 |
|
---|
190 | #define CLASS_OF(v) rb_class_of((VALUE)(v))
|
---|
191 |
|
---|
192 | #define T_NONE 0x00
|
---|
193 |
|
---|
194 | #define T_NIL 0x01
|
---|
195 | #define T_OBJECT 0x02
|
---|
196 | #define T_CLASS 0x03
|
---|
197 | #define T_ICLASS 0x04
|
---|
198 | #define T_MODULE 0x05
|
---|
199 | #define T_FLOAT 0x06
|
---|
200 | #define T_STRING 0x07
|
---|
201 | #define T_REGEXP 0x08
|
---|
202 | #define T_ARRAY 0x09
|
---|
203 | #define T_FIXNUM 0x0a
|
---|
204 | #define T_HASH 0x0b
|
---|
205 | #define T_STRUCT 0x0c
|
---|
206 | #define T_BIGNUM 0x0d
|
---|
207 | #define T_FILE 0x0e
|
---|
208 |
|
---|
209 | #define T_TRUE 0x20
|
---|
210 | #define T_FALSE 0x21
|
---|
211 | #define T_DATA 0x22
|
---|
212 | #define T_MATCH 0x23
|
---|
213 | #define T_SYMBOL 0x24
|
---|
214 |
|
---|
215 | #define T_BLKTAG 0x3b
|
---|
216 | #define T_UNDEF 0x3c
|
---|
217 | #define T_VARMAP 0x3d
|
---|
218 | #define T_SCOPE 0x3e
|
---|
219 | #define T_NODE 0x3f
|
---|
220 |
|
---|
221 | #define T_MASK 0x3f
|
---|
222 |
|
---|
223 | #define BUILTIN_TYPE(x) (((struct RBasic*)(x))->flags & T_MASK)
|
---|
224 |
|
---|
225 | #define TYPE(x) rb_type((VALUE)(x))
|
---|
226 |
|
---|
227 | void rb_check_type _((VALUE,int));
|
---|
228 | #define Check_Type(v,t) rb_check_type((VALUE)(v),t)
|
---|
229 |
|
---|
230 | VALUE rb_str_to_str _((VALUE));
|
---|
231 | VALUE rb_string_value _((volatile VALUE*));
|
---|
232 | char *rb_string_value_ptr _((volatile VALUE*));
|
---|
233 | char *rb_string_value_cstr _((volatile VALUE*));
|
---|
234 |
|
---|
235 | #define StringValue(v) rb_string_value(&(v))
|
---|
236 | #define StringValuePtr(v) rb_string_value_ptr(&(v))
|
---|
237 | #define StringValueCStr(v) rb_string_value_cstr(&(v))
|
---|
238 |
|
---|
239 | void rb_check_safe_obj _((VALUE));
|
---|
240 | void rb_check_safe_str _((VALUE));
|
---|
241 | #define SafeStringValue(v) do {\
|
---|
242 | StringValue(v);\
|
---|
243 | rb_check_safe_obj(v);\
|
---|
244 | } while (0)
|
---|
245 | /* obsolete macro - use SafeStringValue(v) */
|
---|
246 | #define Check_SafeStr(v) rb_check_safe_str((VALUE)(v))
|
---|
247 |
|
---|
248 | void rb_secure _((int));
|
---|
249 | RUBY_EXTERN int ruby_safe_level;
|
---|
250 | #define rb_safe_level() (ruby_safe_level)
|
---|
251 | void rb_set_safe_level _((int));
|
---|
252 | void rb_secure_update _((VALUE));
|
---|
253 |
|
---|
254 | long rb_num2long _((VALUE));
|
---|
255 | unsigned long rb_num2ulong _((VALUE));
|
---|
256 | #define NUM2LONG(x) (FIXNUM_P(x)?FIX2LONG(x):rb_num2long((VALUE)x))
|
---|
257 | #define NUM2ULONG(x) rb_num2ulong((VALUE)x)
|
---|
258 | #if SIZEOF_INT < SIZEOF_LONG
|
---|
259 | long rb_num2int _((VALUE));
|
---|
260 | #define NUM2INT(x) (FIXNUM_P(x)?FIX2INT(x):rb_num2int((VALUE)x))
|
---|
261 | long rb_fix2int _((VALUE));
|
---|
262 | #define FIX2INT(x) rb_fix2int((VALUE)x)
|
---|
263 | unsigned long rb_num2uint _((VALUE));
|
---|
264 | #define NUM2UINT(x) rb_num2uint(x)
|
---|
265 | unsigned long rb_fix2uint _((VALUE));
|
---|
266 | #define FIX2UINT(x) rb_fix2uint(x)
|
---|
267 | #else
|
---|
268 | #define NUM2INT(x) ((int)NUM2LONG(x))
|
---|
269 | #define NUM2UINT(x) ((unsigned int)NUM2ULONG(x))
|
---|
270 | #define FIX2INT(x) ((int)FIX2LONG(x))
|
---|
271 | #define FIX2UINT(x) ((unsigned int)FIX2ULONG(x))
|
---|
272 | #endif
|
---|
273 |
|
---|
274 | #ifdef HAVE_LONG_LONG
|
---|
275 | LONG_LONG rb_num2ll _((VALUE));
|
---|
276 | unsigned LONG_LONG rb_num2ull _((VALUE));
|
---|
277 | # define NUM2LL(x) (FIXNUM_P(x)?FIX2LONG(x):rb_num2ll((VALUE)x))
|
---|
278 | # define NUM2ULL(x) rb_num2ull((VALUE)x)
|
---|
279 | #endif
|
---|
280 |
|
---|
281 | #if defined(HAVE_LONG_LONG) && SIZEOF_OFF_T > SIZEOF_LONG
|
---|
282 | # define NUM2OFFT(x) ((off_t)NUM2LL(x))
|
---|
283 | #else
|
---|
284 | # define NUM2OFFT(x) NUM2LONG(x)
|
---|
285 | #endif
|
---|
286 |
|
---|
287 | double rb_num2dbl _((VALUE));
|
---|
288 | #define NUM2DBL(x) rb_num2dbl((VALUE)(x))
|
---|
289 |
|
---|
290 | /* obsolete API - use StringValue() */
|
---|
291 | char *rb_str2cstr _((VALUE,long*));
|
---|
292 | /* obsolete API - use StringValuePtr() */
|
---|
293 | #define STR2CSTR(x) rb_str2cstr((VALUE)(x),0)
|
---|
294 |
|
---|
295 | #define NUM2CHR(x) (((TYPE(x) == T_STRING)&&(RSTRING(x)->len>=1))?\
|
---|
296 | RSTRING(x)->ptr[0]:(char)(NUM2INT(x)&0xff))
|
---|
297 | #define CHR2FIX(x) INT2FIX((long)((x)&0xff))
|
---|
298 |
|
---|
299 | VALUE rb_newobj _((void));
|
---|
300 | #define NEWOBJ(obj,type) type *obj = (type*)rb_newobj()
|
---|
301 | #define OBJSETUP(obj,c,t) do {\
|
---|
302 | RBASIC(obj)->flags = (t);\
|
---|
303 | RBASIC(obj)->klass = (c);\
|
---|
304 | if (rb_safe_level() >= 3) FL_SET(obj, FL_TAINT);\
|
---|
305 | } while (0)
|
---|
306 | #define CLONESETUP(clone,obj) do {\
|
---|
307 | OBJSETUP(clone,rb_singleton_class_clone((VALUE)obj),RBASIC(obj)->flags);\
|
---|
308 | rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);\
|
---|
309 | if (FL_TEST(obj, FL_EXIVAR)) rb_copy_generic_ivar((VALUE)clone,(VALUE)obj);\
|
---|
310 | } while (0)
|
---|
311 | #define DUPSETUP(dup,obj) do {\
|
---|
312 | OBJSETUP(dup,rb_obj_class(obj),(RBASIC(obj)->flags)&(T_MASK|FL_EXIVAR|FL_TAINT));\
|
---|
313 | if (FL_TEST(obj, FL_EXIVAR)) rb_copy_generic_ivar((VALUE)dup,(VALUE)obj);\
|
---|
314 | } while (0)
|
---|
315 |
|
---|
316 | struct RBasic {
|
---|
317 | unsigned long flags;
|
---|
318 | VALUE klass;
|
---|
319 | };
|
---|
320 |
|
---|
321 | struct RObject {
|
---|
322 | struct RBasic basic;
|
---|
323 | struct st_table *iv_tbl;
|
---|
324 | };
|
---|
325 |
|
---|
326 | struct RClass {
|
---|
327 | struct RBasic basic;
|
---|
328 | struct st_table *iv_tbl;
|
---|
329 | struct st_table *m_tbl;
|
---|
330 | VALUE super;
|
---|
331 | };
|
---|
332 |
|
---|
333 | struct RFloat {
|
---|
334 | struct RBasic basic;
|
---|
335 | double value;
|
---|
336 | };
|
---|
337 |
|
---|
338 | #define ELTS_SHARED FL_USER2
|
---|
339 |
|
---|
340 | struct RString {
|
---|
341 | struct RBasic basic;
|
---|
342 | long len;
|
---|
343 | char *ptr;
|
---|
344 | union {
|
---|
345 | long capa;
|
---|
346 | VALUE shared;
|
---|
347 | } aux;
|
---|
348 | };
|
---|
349 | #define RSTRING_PTR(s) (RSTRING(s)->ptr)
|
---|
350 | #define RSTRING_LEN(s) (RSTRING(s)->len)
|
---|
351 |
|
---|
352 | struct RArray {
|
---|
353 | struct RBasic basic;
|
---|
354 | long len;
|
---|
355 | union {
|
---|
356 | long capa;
|
---|
357 | VALUE shared;
|
---|
358 | } aux;
|
---|
359 | VALUE *ptr;
|
---|
360 | };
|
---|
361 | #define RARRAY_PTR(s) (RARRAY(s)->ptr)
|
---|
362 | #define RARRAY_LEN(s) (RARRAY(s)->len)
|
---|
363 |
|
---|
364 | struct RRegexp {
|
---|
365 | struct RBasic basic;
|
---|
366 | struct re_pattern_buffer *ptr;
|
---|
367 | long len;
|
---|
368 | char *str;
|
---|
369 | };
|
---|
370 |
|
---|
371 | struct RHash {
|
---|
372 | struct RBasic basic;
|
---|
373 | struct st_table *tbl;
|
---|
374 | int iter_lev;
|
---|
375 | VALUE ifnone;
|
---|
376 | };
|
---|
377 |
|
---|
378 | struct RFile {
|
---|
379 | struct RBasic basic;
|
---|
380 | struct OpenFile *fptr;
|
---|
381 | };
|
---|
382 |
|
---|
383 | struct RData {
|
---|
384 | struct RBasic basic;
|
---|
385 | void (*dmark) _((void*));
|
---|
386 | void (*dfree) _((void*));
|
---|
387 | void *data;
|
---|
388 | };
|
---|
389 |
|
---|
390 | #define DATA_PTR(dta) (RDATA(dta)->data)
|
---|
391 |
|
---|
392 | /*
|
---|
393 | #define RUBY_DATA_FUNC(func) ((void (*)_((void*)))func)
|
---|
394 | */
|
---|
395 | typedef void (*RUBY_DATA_FUNC) _((void*));
|
---|
396 |
|
---|
397 | VALUE rb_data_object_alloc _((VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC));
|
---|
398 |
|
---|
399 | #define Data_Wrap_Struct(klass,mark,free,sval)\
|
---|
400 | rb_data_object_alloc(klass,sval,(RUBY_DATA_FUNC)mark,(RUBY_DATA_FUNC)free)
|
---|
401 |
|
---|
402 | #define Data_Make_Struct(klass,type,mark,free,sval) (\
|
---|
403 | sval = ALLOC(type),\
|
---|
404 | memset(sval, 0, sizeof(type)),\
|
---|
405 | Data_Wrap_Struct(klass,mark,free,sval)\
|
---|
406 | )
|
---|
407 |
|
---|
408 | #define Data_Get_Struct(obj,type,sval) do {\
|
---|
409 | Check_Type(obj, T_DATA); \
|
---|
410 | sval = (type*)DATA_PTR(obj);\
|
---|
411 | } while (0)
|
---|
412 |
|
---|
413 | struct RStruct {
|
---|
414 | struct RBasic basic;
|
---|
415 | long len;
|
---|
416 | VALUE *ptr;
|
---|
417 | };
|
---|
418 | #define RSTRUCT_LEN(st) (RSTRUCT(st)->len)
|
---|
419 | #define RSTRUCT_PTR(st) (RSTRUCT(st)->ptr)
|
---|
420 |
|
---|
421 | struct RBignum {
|
---|
422 | struct RBasic basic;
|
---|
423 | char sign;
|
---|
424 | long len;
|
---|
425 | void *digits;
|
---|
426 | };
|
---|
427 |
|
---|
428 | #define R_CAST(st) (struct st*)
|
---|
429 | #define RBASIC(obj) (R_CAST(RBasic)(obj))
|
---|
430 | #define ROBJECT(obj) (R_CAST(RObject)(obj))
|
---|
431 | #define RCLASS(obj) (R_CAST(RClass)(obj))
|
---|
432 | #define RMODULE(obj) RCLASS(obj)
|
---|
433 | #define RFLOAT(obj) (R_CAST(RFloat)(obj))
|
---|
434 | #define RSTRING(obj) (R_CAST(RString)(obj))
|
---|
435 | #define RREGEXP(obj) (R_CAST(RRegexp)(obj))
|
---|
436 | #define RARRAY(obj) (R_CAST(RArray)(obj))
|
---|
437 | #define RHASH(obj) (R_CAST(RHash)(obj))
|
---|
438 | #define RDATA(obj) (R_CAST(RData)(obj))
|
---|
439 | #define RSTRUCT(obj) (R_CAST(RStruct)(obj))
|
---|
440 | #define RBIGNUM(obj) (R_CAST(RBignum)(obj))
|
---|
441 | #define RFILE(obj) (R_CAST(RFile)(obj))
|
---|
442 |
|
---|
443 | #define FL_SINGLETON FL_USER0
|
---|
444 | #define FL_MARK (1<<6)
|
---|
445 | #define FL_FINALIZE (1<<7)
|
---|
446 | #define FL_TAINT (1<<8)
|
---|
447 | #define FL_EXIVAR (1<<9)
|
---|
448 | #define FL_FREEZE (1<<10)
|
---|
449 |
|
---|
450 | #define FL_USHIFT 11
|
---|
451 |
|
---|
452 | #define FL_USER0 (1<<(FL_USHIFT+0))
|
---|
453 | #define FL_USER1 (1<<(FL_USHIFT+1))
|
---|
454 | #define FL_USER2 (1<<(FL_USHIFT+2))
|
---|
455 | #define FL_USER3 (1<<(FL_USHIFT+3))
|
---|
456 | #define FL_USER4 (1<<(FL_USHIFT+4))
|
---|
457 | #define FL_USER5 (1<<(FL_USHIFT+5))
|
---|
458 | #define FL_USER6 (1<<(FL_USHIFT+6))
|
---|
459 | #define FL_USER7 (1<<(FL_USHIFT+7))
|
---|
460 |
|
---|
461 | #define FL_UMASK (0xff<<FL_USHIFT)
|
---|
462 |
|
---|
463 | #define SPECIAL_CONST_P(x) (IMMEDIATE_P(x) || !RTEST(x))
|
---|
464 |
|
---|
465 | #define FL_ABLE(x) (!SPECIAL_CONST_P(x))
|
---|
466 | #define FL_TEST(x,f) (FL_ABLE(x)?(RBASIC(x)->flags&(f)):0)
|
---|
467 | #define FL_SET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags |= (f);} while (0)
|
---|
468 | #define FL_UNSET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags &= ~(f);} while (0)
|
---|
469 | #define FL_REVERSE(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags ^= (f);} while (0)
|
---|
470 |
|
---|
471 | #define OBJ_TAINTED(x) FL_TEST((x), FL_TAINT)
|
---|
472 | #define OBJ_TAINT(x) FL_SET((x), FL_TAINT)
|
---|
473 | #define OBJ_INFECT(x,s) do {if (FL_ABLE(x) && FL_ABLE(s)) RBASIC(x)->flags |= RBASIC(s)->flags & FL_TAINT;} while (0)
|
---|
474 |
|
---|
475 | #define OBJ_FROZEN(x) FL_TEST((x), FL_FREEZE)
|
---|
476 | #define OBJ_FREEZE(x) FL_SET((x), FL_FREEZE)
|
---|
477 |
|
---|
478 | #define ALLOC_N(type,n) (type*)xmalloc(sizeof(type)*(n))
|
---|
479 | #define ALLOC(type) (type*)xmalloc(sizeof(type))
|
---|
480 | #define REALLOC_N(var,type,n) (var)=(type*)xrealloc((char*)(var),sizeof(type)*(n))
|
---|
481 |
|
---|
482 | #define ALLOCA_N(type,n) (type*)alloca(sizeof(type)*(n))
|
---|
483 |
|
---|
484 | #define MEMZERO(p,type,n) memset((p), 0, sizeof(type)*(n))
|
---|
485 | #define MEMCPY(p1,p2,type,n) memcpy((p1), (p2), sizeof(type)*(n))
|
---|
486 | #define MEMMOVE(p1,p2,type,n) memmove((p1), (p2), sizeof(type)*(n))
|
---|
487 | #define MEMCMP(p1,p2,type,n) memcmp((p1), (p2), sizeof(type)*(n))
|
---|
488 |
|
---|
489 | void rb_obj_infect _((VALUE,VALUE));
|
---|
490 |
|
---|
491 | typedef int ruby_glob_func(const char*,VALUE);
|
---|
492 | void rb_glob _((const char*,void(*)(const char*,VALUE),VALUE));
|
---|
493 | void rb_globi _((const char*,void(*)(const char*,VALUE),VALUE));
|
---|
494 | int ruby_brace_expand _((const char*,int,ruby_glob_func*,VALUE));
|
---|
495 | int ruby_brace_glob _((const char*,int,ruby_glob_func*,VALUE));
|
---|
496 |
|
---|
497 | VALUE rb_define_class _((const char*,VALUE));
|
---|
498 | VALUE rb_define_module _((const char*));
|
---|
499 | VALUE rb_define_class_under _((VALUE, const char*, VALUE));
|
---|
500 | VALUE rb_define_module_under _((VALUE, const char*));
|
---|
501 |
|
---|
502 | void rb_include_module _((VALUE,VALUE));
|
---|
503 | void rb_extend_object _((VALUE,VALUE));
|
---|
504 |
|
---|
505 | void rb_define_variable _((const char*,VALUE*));
|
---|
506 | void rb_define_virtual_variable _((const char*,VALUE(*)(ANYARGS),void(*)(ANYARGS)));
|
---|
507 | void rb_define_hooked_variable _((const char*,VALUE*,VALUE(*)(ANYARGS),void(*)(ANYARGS)));
|
---|
508 | int ruby_glob _((const char*,int,int(*)(const char*,VALUE),VALUE));
|
---|
509 | int ruby_globi _((const char*,int,int(*)(const char*,VALUE),VALUE));
|
---|
510 | void rb_define_readonly_variable _((const char*,VALUE*));
|
---|
511 | void rb_define_const _((VALUE,const char*,VALUE));
|
---|
512 | void rb_define_global_const _((const char*,VALUE));
|
---|
513 |
|
---|
514 | #define RUBY_METHOD_FUNC(func) ((VALUE (*)(ANYARGS))func)
|
---|
515 | void rb_define_method _((VALUE,const char*,VALUE(*)(ANYARGS),int));
|
---|
516 | void rb_define_module_function _((VALUE,const char*,VALUE(*)(ANYARGS),int));
|
---|
517 | void rb_define_global_function _((const char*,VALUE(*)(ANYARGS),int));
|
---|
518 |
|
---|
519 | void rb_undef_method _((VALUE,const char*));
|
---|
520 | void rb_define_alias _((VALUE,const char*,const char*));
|
---|
521 | void rb_define_attr _((VALUE,const char*,int,int));
|
---|
522 |
|
---|
523 | void rb_global_variable _((VALUE*));
|
---|
524 | void rb_gc_register_address _((VALUE*));
|
---|
525 | void rb_gc_unregister_address _((VALUE*));
|
---|
526 |
|
---|
527 | ID rb_intern _((const char*));
|
---|
528 | char *rb_id2name _((ID));
|
---|
529 | ID rb_to_id _((VALUE));
|
---|
530 |
|
---|
531 | char *rb_class2name _((VALUE));
|
---|
532 | char *rb_obj_classname _((VALUE));
|
---|
533 |
|
---|
534 | void rb_p _((VALUE));
|
---|
535 |
|
---|
536 | VALUE rb_eval_string _((const char*));
|
---|
537 | VALUE rb_eval_string_protect _((const char*, int*));
|
---|
538 | VALUE rb_eval_string_wrap _((const char*, int*));
|
---|
539 | VALUE rb_funcall __((VALUE, ID, int, ...));
|
---|
540 | VALUE rb_funcall2 _((VALUE, ID, int, const VALUE*));
|
---|
541 | VALUE rb_funcall3 _((VALUE, ID, int, const VALUE*));
|
---|
542 | int rb_scan_args __((int, const VALUE*, const char*, ...));
|
---|
543 | VALUE rb_call_super _((int, const VALUE*));
|
---|
544 |
|
---|
545 | VALUE rb_gv_set _((const char*, VALUE));
|
---|
546 | VALUE rb_gv_get _((const char*));
|
---|
547 | VALUE rb_iv_get _((VALUE, const char*));
|
---|
548 | VALUE rb_iv_set _((VALUE, const char*, VALUE));
|
---|
549 |
|
---|
550 | VALUE rb_equal _((VALUE,VALUE));
|
---|
551 |
|
---|
552 | RUBY_EXTERN VALUE ruby_verbose, ruby_debug;
|
---|
553 |
|
---|
554 | NORETURN(void rb_raise __((VALUE, const char*, ...)));
|
---|
555 | NORETURN(void rb_fatal __((const char*, ...)));
|
---|
556 | NORETURN(void rb_bug __((const char*, ...)));
|
---|
557 | NORETURN(void rb_sys_fail _((const char*)));
|
---|
558 | NORETURN(void rb_iter_break _((void)));
|
---|
559 | NORETURN(void rb_exit _((int)));
|
---|
560 | NORETURN(void rb_notimplement _((void)));
|
---|
561 |
|
---|
562 | void rb_warning __((const char*, ...)); /* reports if `-w' specified */
|
---|
563 | void rb_sys_warning __((const char*, ...)); /* reports if `-w' specified */
|
---|
564 | void rb_warn __((const char*, ...)); /* reports always */
|
---|
565 |
|
---|
566 | VALUE rb_each _((VALUE));
|
---|
567 | VALUE rb_yield _((VALUE));
|
---|
568 | VALUE rb_yield_values __((int n, ...));
|
---|
569 | VALUE rb_yield_splat _((VALUE));
|
---|
570 | int rb_block_given_p _((void));
|
---|
571 | void rb_need_block _((void));
|
---|
572 | VALUE rb_iterate _((VALUE(*)(VALUE),VALUE,VALUE(*)(ANYARGS),VALUE));
|
---|
573 | VALUE rb_rescue _((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE));
|
---|
574 | VALUE rb_rescue2 __((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE,...));
|
---|
575 | VALUE rb_ensure _((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE));
|
---|
576 | VALUE rb_catch _((const char*,VALUE(*)(ANYARGS),VALUE));
|
---|
577 | NORETURN(void rb_throw _((const char*,VALUE)));
|
---|
578 |
|
---|
579 | VALUE rb_require _((const char*));
|
---|
580 |
|
---|
581 | #ifdef __ia64
|
---|
582 | void ruby_init_stack(VALUE*, void*);
|
---|
583 | #define RUBY_INIT_STACK \
|
---|
584 | VALUE variable_in_this_stack_frame; \
|
---|
585 | ruby_init_stack(&variable_in_this_stack_frame, rb_ia64_bsp());
|
---|
586 | #else
|
---|
587 | void ruby_init_stack(VALUE*);
|
---|
588 | #define RUBY_INIT_STACK \
|
---|
589 | VALUE variable_in_this_stack_frame; \
|
---|
590 | ruby_init_stack(&variable_in_this_stack_frame);
|
---|
591 | #endif
|
---|
592 | void ruby_init _((void));
|
---|
593 | void ruby_options _((int, char**));
|
---|
594 | NORETURN(void ruby_run _((void)));
|
---|
595 |
|
---|
596 | RUBY_EXTERN VALUE rb_mKernel;
|
---|
597 | RUBY_EXTERN VALUE rb_mComparable;
|
---|
598 | RUBY_EXTERN VALUE rb_mEnumerable;
|
---|
599 | RUBY_EXTERN VALUE rb_mPrecision;
|
---|
600 | RUBY_EXTERN VALUE rb_mErrno;
|
---|
601 | RUBY_EXTERN VALUE rb_mFileTest;
|
---|
602 | RUBY_EXTERN VALUE rb_mGC;
|
---|
603 | RUBY_EXTERN VALUE rb_mMath;
|
---|
604 | RUBY_EXTERN VALUE rb_mProcess;
|
---|
605 |
|
---|
606 | RUBY_EXTERN VALUE rb_cObject;
|
---|
607 | RUBY_EXTERN VALUE rb_cArray;
|
---|
608 | RUBY_EXTERN VALUE rb_cBignum;
|
---|
609 | RUBY_EXTERN VALUE rb_cBinding;
|
---|
610 | RUBY_EXTERN VALUE rb_cClass;
|
---|
611 | RUBY_EXTERN VALUE rb_cCont;
|
---|
612 | RUBY_EXTERN VALUE rb_cDir;
|
---|
613 | RUBY_EXTERN VALUE rb_cData;
|
---|
614 | RUBY_EXTERN VALUE rb_cFalseClass;
|
---|
615 | RUBY_EXTERN VALUE rb_cFile;
|
---|
616 | RUBY_EXTERN VALUE rb_cFixnum;
|
---|
617 | RUBY_EXTERN VALUE rb_cFloat;
|
---|
618 | RUBY_EXTERN VALUE rb_cHash;
|
---|
619 | RUBY_EXTERN VALUE rb_cInteger;
|
---|
620 | RUBY_EXTERN VALUE rb_cIO;
|
---|
621 | RUBY_EXTERN VALUE rb_cMatch;
|
---|
622 | RUBY_EXTERN VALUE rb_cMethod;
|
---|
623 | RUBY_EXTERN VALUE rb_cModule;
|
---|
624 | RUBY_EXTERN VALUE rb_cNameErrorMesg;
|
---|
625 | RUBY_EXTERN VALUE rb_cNilClass;
|
---|
626 | RUBY_EXTERN VALUE rb_cNumeric;
|
---|
627 | RUBY_EXTERN VALUE rb_cProc;
|
---|
628 | RUBY_EXTERN VALUE rb_cRange;
|
---|
629 | RUBY_EXTERN VALUE rb_cRegexp;
|
---|
630 | RUBY_EXTERN VALUE rb_cStat;
|
---|
631 | RUBY_EXTERN VALUE rb_cString;
|
---|
632 | RUBY_EXTERN VALUE rb_cStruct;
|
---|
633 | RUBY_EXTERN VALUE rb_cSymbol;
|
---|
634 | RUBY_EXTERN VALUE rb_cThread;
|
---|
635 | RUBY_EXTERN VALUE rb_cTime;
|
---|
636 | RUBY_EXTERN VALUE rb_cTrueClass;
|
---|
637 | RUBY_EXTERN VALUE rb_cUnboundMethod;
|
---|
638 |
|
---|
639 | RUBY_EXTERN VALUE rb_eException;
|
---|
640 | RUBY_EXTERN VALUE rb_eStandardError;
|
---|
641 | RUBY_EXTERN VALUE rb_eSystemExit;
|
---|
642 | RUBY_EXTERN VALUE rb_eInterrupt;
|
---|
643 | RUBY_EXTERN VALUE rb_eSignal;
|
---|
644 | RUBY_EXTERN VALUE rb_eFatal;
|
---|
645 | RUBY_EXTERN VALUE rb_eArgError;
|
---|
646 | RUBY_EXTERN VALUE rb_eEOFError;
|
---|
647 | RUBY_EXTERN VALUE rb_eIndexError;
|
---|
648 | RUBY_EXTERN VALUE rb_eRangeError;
|
---|
649 | RUBY_EXTERN VALUE rb_eIOError;
|
---|
650 | RUBY_EXTERN VALUE rb_eRuntimeError;
|
---|
651 | RUBY_EXTERN VALUE rb_eSecurityError;
|
---|
652 | RUBY_EXTERN VALUE rb_eSystemCallError;
|
---|
653 | RUBY_EXTERN VALUE rb_eThreadError;
|
---|
654 | RUBY_EXTERN VALUE rb_eTypeError;
|
---|
655 | RUBY_EXTERN VALUE rb_eZeroDivError;
|
---|
656 | RUBY_EXTERN VALUE rb_eNotImpError;
|
---|
657 | RUBY_EXTERN VALUE rb_eNoMemError;
|
---|
658 | RUBY_EXTERN VALUE rb_eNoMethodError;
|
---|
659 | RUBY_EXTERN VALUE rb_eFloatDomainError;
|
---|
660 | RUBY_EXTERN VALUE rb_eLocalJumpError;
|
---|
661 | RUBY_EXTERN VALUE rb_eSysStackError;
|
---|
662 | RUBY_EXTERN VALUE rb_eRegexpError;
|
---|
663 |
|
---|
664 | RUBY_EXTERN VALUE rb_eScriptError;
|
---|
665 | RUBY_EXTERN VALUE rb_eNameError;
|
---|
666 | RUBY_EXTERN VALUE rb_eSyntaxError;
|
---|
667 | RUBY_EXTERN VALUE rb_eLoadError;
|
---|
668 |
|
---|
669 | RUBY_EXTERN VALUE rb_stdin, rb_stdout, rb_stderr;
|
---|
670 | RUBY_EXTERN VALUE ruby_errinfo;
|
---|
671 |
|
---|
672 | static inline VALUE
|
---|
673 | #if defined(HAVE_PROTOTYPES)
|
---|
674 | rb_class_of(VALUE obj)
|
---|
675 | #else
|
---|
676 | rb_class_of(obj)
|
---|
677 | VALUE obj;
|
---|
678 | #endif
|
---|
679 | {
|
---|
680 | if (FIXNUM_P(obj)) return rb_cFixnum;
|
---|
681 | if (obj == Qnil) return rb_cNilClass;
|
---|
682 | if (obj == Qfalse) return rb_cFalseClass;
|
---|
683 | if (obj == Qtrue) return rb_cTrueClass;
|
---|
684 | if (SYMBOL_P(obj)) return rb_cSymbol;
|
---|
685 |
|
---|
686 | return RBASIC(obj)->klass;
|
---|
687 | }
|
---|
688 |
|
---|
689 | static inline int
|
---|
690 | #if defined(HAVE_PROTOTYPES)
|
---|
691 | rb_type(VALUE obj)
|
---|
692 | #else
|
---|
693 | rb_type(obj)
|
---|
694 | VALUE obj;
|
---|
695 | #endif
|
---|
696 | {
|
---|
697 | if (FIXNUM_P(obj)) return T_FIXNUM;
|
---|
698 | if (obj == Qnil) return T_NIL;
|
---|
699 | if (obj == Qfalse) return T_FALSE;
|
---|
700 | if (obj == Qtrue) return T_TRUE;
|
---|
701 | if (obj == Qundef) return T_UNDEF;
|
---|
702 | if (SYMBOL_P(obj)) return T_SYMBOL;
|
---|
703 | return BUILTIN_TYPE(obj);
|
---|
704 | }
|
---|
705 |
|
---|
706 | static inline int
|
---|
707 | #if defined(HAVE_PROTOTYPES)
|
---|
708 | rb_special_const_p(VALUE obj)
|
---|
709 | #else
|
---|
710 | rb_special_const_p(obj)
|
---|
711 | VALUE obj;
|
---|
712 | #endif
|
---|
713 | {
|
---|
714 | if (SPECIAL_CONST_P(obj)) return Qtrue;
|
---|
715 | return Qfalse;
|
---|
716 | }
|
---|
717 |
|
---|
718 | #include "missing.h"
|
---|
719 | #include "intern.h"
|
---|
720 |
|
---|
721 | #if defined(EXTLIB) && defined(USE_DLN_A_OUT)
|
---|
722 | /* hook for external modules */
|
---|
723 | static char *dln_libs_to_be_linked[] = { EXTLIB, 0 };
|
---|
724 | #endif
|
---|
725 |
|
---|
726 | #if defined(HAVE_LIBPTHREAD)
|
---|
727 | #ifdef HAVE_PTHREAD_H
|
---|
728 | #include <pthread.h>
|
---|
729 | #endif
|
---|
730 | typedef pthread_t rb_nativethread_t;
|
---|
731 | # define NATIVETHREAD_CURRENT() pthread_self()
|
---|
732 | # define NATIVETHREAD_EQUAL(t1,t2) pthread_equal((t1),(t2))
|
---|
733 | # define HAVE_NATIVETHREAD
|
---|
734 |
|
---|
735 | # define NATIVETHREAD_KILL(th,sig) pthread_kill((th),(sig))
|
---|
736 | # define HAVE_NATIVETHREAD_KILL
|
---|
737 | #elif defined(_WIN32) || defined(_WIN32_WCE)
|
---|
738 | typedef DWORD rb_nativethread_t;
|
---|
739 | # define NATIVETHREAD_CURRENT() GetCurrentThreadId()
|
---|
740 | # define NATIVETHREAD_EQUAL(t1,t2) ((t1) == (t2))
|
---|
741 | # define HAVE_NATIVETHREAD
|
---|
742 | #endif
|
---|
743 | #ifdef HAVE_NATIVETHREAD
|
---|
744 | int is_ruby_native_thread _((void));
|
---|
745 | #else
|
---|
746 | #define is_ruby_native_thread() (1)
|
---|
747 | #endif
|
---|
748 | #ifdef HAVE_NATIVETHREAD_KILL
|
---|
749 | void ruby_native_thread_kill _((int));
|
---|
750 | #endif
|
---|
751 |
|
---|
752 | #if defined(__cplusplus)
|
---|
753 | #if 0
|
---|
754 | { /* satisfy cc-mode */
|
---|
755 | #endif
|
---|
756 | } /* extern "C" { */
|
---|
757 | #endif
|
---|
758 |
|
---|
759 | #endif /* ifndef RUBY_H */
|
---|