Ruby  2.1.3p242(2014-09-19revision47630)
internal.h
Go to the documentation of this file.
1 /**********************************************************************
2 
3  internal.h -
4 
5  $Author$
6  created at: Tue May 17 11:42:20 JST 2011
7 
8  Copyright (C) 2011 Yukihiro Matsumoto
9 
10 **********************************************************************/
11 
12 #ifndef RUBY_INTERNAL_H
13 #define RUBY_INTERNAL_H 1
14 
15 #if defined(__cplusplus)
16 extern "C" {
17 #if 0
18 } /* satisfy cc-mode */
19 #endif
20 #endif
21 
22 #ifdef HAVE_VALGRIND_MEMCHECK_H
23 # include <valgrind/memcheck.h>
24 # ifndef VALGRIND_MAKE_MEM_DEFINED
25 # define VALGRIND_MAKE_MEM_DEFINED(p, n) VALGRIND_MAKE_READABLE((p), (n))
26 # endif
27 # ifndef VALGRIND_MAKE_MEM_UNDEFINED
28 # define VALGRIND_MAKE_MEM_UNDEFINED(p, n) VALGRIND_MAKE_WRITABLE((p), (n))
29 # endif
30 #else
31 # define VALGRIND_MAKE_MEM_DEFINED(p, n) 0
32 # define VALGRIND_MAKE_MEM_UNDEFINED(p, n) 0
33 #endif
34 
35 #define numberof(array) ((int)(sizeof(array) / sizeof((array)[0])))
36 
37 #define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[1 - 2*!(expr)]
38 
39 #define GCC_VERSION_SINCE(major, minor, patchlevel) \
40  (defined(__GNUC__) && !defined(__INTEL_COMPILER) && \
41  ((__GNUC__ > (major)) || \
42  (__GNUC__ == (major) && __GNUC_MINOR__ > (minor)) || \
43  (__GNUC__ == (major) && __GNUC_MINOR__ == (minor) && __GNUC_PATCHLEVEL__ >= (patchlevel))))
44 
45 #define SIGNED_INTEGER_TYPE_P(int_type) (0 > ((int_type)0)-1)
46 #define SIGNED_INTEGER_MAX(sint_type) \
47  (sint_type) \
48  ((((sint_type)1) << (sizeof(sint_type) * CHAR_BIT - 2)) | \
49  ((((sint_type)1) << (sizeof(sint_type) * CHAR_BIT - 2)) - 1))
50 #define SIGNED_INTEGER_MIN(sint_type) (-SIGNED_INTEGER_MAX(sint_type)-1)
51 #define UNSIGNED_INTEGER_MAX(uint_type) (~(uint_type)0)
52 
53 #if SIGNEDNESS_OF_TIME_T < 0 /* signed */
54 # define TIMET_MAX SIGNED_INTEGER_MAX(time_t)
55 # define TIMET_MIN SIGNED_INTEGER_MIN(time_t)
56 #elif SIGNEDNESS_OF_TIME_T > 0 /* unsigned */
57 # define TIMET_MAX UNSIGNED_INTEGER_MAX(time_t)
58 # define TIMET_MIN ((time_t)0)
59 #endif
60 #define TIMET_MAX_PLUS_ONE (2*(double)(TIMET_MAX/2+1))
61 
62 #define MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, min, max) ( \
63  (a) == 0 ? 0 : \
64  (a) == -1 ? (b) < -(max) : \
65  (a) > 0 ? \
66  ((b) > 0 ? (max) / (a) < (b) : (min) / (a) > (b)) : \
67  ((b) > 0 ? (min) / (a) < (b) : (max) / (a) > (b)))
68 #define MUL_OVERFLOW_FIXNUM_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX)
69 #define MUL_OVERFLOW_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX)
70 #define MUL_OVERFLOW_INT_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX)
71 
72 #ifndef swap16
73 # ifdef HAVE_BUILTIN___BUILTIN_BSWAP16
74 # define swap16(x) __builtin_bswap16(x)
75 # endif
76 #endif
77 
78 #ifndef swap16
79 # define swap16(x) ((uint16_t)((((x)&0xFF)<<8) | (((x)>>8)&0xFF)))
80 #endif
81 
82 #ifndef swap32
83 # ifdef HAVE_BUILTIN___BUILTIN_BSWAP32
84 # define swap32(x) __builtin_bswap32(x)
85 # endif
86 #endif
87 
88 #ifndef swap32
89 # define swap32(x) ((uint32_t)((((x)&0xFF)<<24) \
90  |(((x)>>24)&0xFF) \
91  |(((x)&0x0000FF00)<<8) \
92  |(((x)&0x00FF0000)>>8) ))
93 #endif
94 
95 #ifndef swap64
96 # ifdef HAVE_BUILTIN___BUILTIN_BSWAP64
97 # define swap64(x) __builtin_bswap64(x)
98 # endif
99 #endif
100 
101 #ifndef swap64
102 # ifdef HAVE_INT64_T
103 # define byte_in_64bit(n) ((uint64_t)0xff << (n))
104 # define swap64(x) ((uint64_t)((((x)&byte_in_64bit(0))<<56) \
105  |(((x)>>56)&0xFF) \
106  |(((x)&byte_in_64bit(8))<<40) \
107  |(((x)&byte_in_64bit(48))>>40) \
108  |(((x)&byte_in_64bit(16))<<24) \
109  |(((x)&byte_in_64bit(40))>>24) \
110  |(((x)&byte_in_64bit(24))<<8) \
111  |(((x)&byte_in_64bit(32))>>8)))
112 # endif
113 #endif
114 
115 static inline int
116 nlz_int(unsigned int x)
117 {
118 #if defined(HAVE_BUILTIN___BUILTIN_CLZ)
119  if (x == 0) return SIZEOF_INT * CHAR_BIT;
120  return __builtin_clz(x);
121 #else
122  unsigned int y;
123 # if 64 < SIZEOF_INT * CHAR_BIT
124  int n = 128;
125 # elif 32 < SIZEOF_INT * CHAR_BIT
126  int n = 64;
127 # else
128  int n = 32;
129 # endif
130 # if 64 < SIZEOF_INT * CHAR_BIT
131  y = x >> 64; if (y) {n -= 64; x = y;}
132 # endif
133 # if 32 < SIZEOF_INT * CHAR_BIT
134  y = x >> 32; if (y) {n -= 32; x = y;}
135 # endif
136  y = x >> 16; if (y) {n -= 16; x = y;}
137  y = x >> 8; if (y) {n -= 8; x = y;}
138  y = x >> 4; if (y) {n -= 4; x = y;}
139  y = x >> 2; if (y) {n -= 2; x = y;}
140  y = x >> 1; if (y) {return n - 2;}
141  return (int)(n - x);
142 #endif
143 }
144 
145 static inline int
146 nlz_long(unsigned long x)
147 {
148 #if defined(HAVE_BUILTIN___BUILTIN_CLZL)
149  if (x == 0) return SIZEOF_LONG * CHAR_BIT;
150  return __builtin_clzl(x);
151 #else
152  unsigned long y;
153 # if 64 < SIZEOF_LONG * CHAR_BIT
154  int n = 128;
155 # elif 32 < SIZEOF_LONG * CHAR_BIT
156  int n = 64;
157 # else
158  int n = 32;
159 # endif
160 # if 64 < SIZEOF_LONG * CHAR_BIT
161  y = x >> 64; if (y) {n -= 64; x = y;}
162 # endif
163 # if 32 < SIZEOF_LONG * CHAR_BIT
164  y = x >> 32; if (y) {n -= 32; x = y;}
165 # endif
166  y = x >> 16; if (y) {n -= 16; x = y;}
167  y = x >> 8; if (y) {n -= 8; x = y;}
168  y = x >> 4; if (y) {n -= 4; x = y;}
169  y = x >> 2; if (y) {n -= 2; x = y;}
170  y = x >> 1; if (y) {return n - 2;}
171  return (int)(n - x);
172 #endif
173 }
174 
175 #ifdef HAVE_LONG_LONG
176 static inline int
177 nlz_long_long(unsigned LONG_LONG x)
178 {
179 #if defined(HAVE_BUILTIN___BUILTIN_CLZLL)
180  if (x == 0) return SIZEOF_LONG_LONG * CHAR_BIT;
181  return __builtin_clzll(x);
182 #else
183  unsigned LONG_LONG y;
184 # if 64 < SIZEOF_LONG_LONG * CHAR_BIT
185  int n = 128;
186 # elif 32 < SIZEOF_LONG_LONG * CHAR_BIT
187  int n = 64;
188 # else
189  int n = 32;
190 # endif
191 # if 64 < SIZEOF_LONG_LONG * CHAR_BIT
192  y = x >> 64; if (y) {n -= 64; x = y;}
193 # endif
194 # if 32 < SIZEOF_LONG_LONG * CHAR_BIT
195  y = x >> 32; if (y) {n -= 32; x = y;}
196 # endif
197  y = x >> 16; if (y) {n -= 16; x = y;}
198  y = x >> 8; if (y) {n -= 8; x = y;}
199  y = x >> 4; if (y) {n -= 4; x = y;}
200  y = x >> 2; if (y) {n -= 2; x = y;}
201  y = x >> 1; if (y) {return n - 2;}
202  return (int)(n - x);
203 #endif
204 }
205 #endif
206 
207 #ifdef HAVE_UINT128_T
208 static inline int
209 nlz_int128(uint128_t x)
210 {
211  uint128_t y;
212  int n = 128;
213  y = x >> 64; if (y) {n -= 64; x = y;}
214  y = x >> 32; if (y) {n -= 32; x = y;}
215  y = x >> 16; if (y) {n -= 16; x = y;}
216  y = x >> 8; if (y) {n -= 8; x = y;}
217  y = x >> 4; if (y) {n -= 4; x = y;}
218  y = x >> 2; if (y) {n -= 2; x = y;}
219  y = x >> 1; if (y) {return n - 2;}
220  return (int)(n - x);
221 }
222 #endif
223 
224 #if defined(HAVE_UINT128_T)
225 # define bit_length(x) \
226  (sizeof(x) <= SIZEOF_INT ? SIZEOF_INT * CHAR_BIT - nlz_int((unsigned int)(x)) : \
227  sizeof(x) <= SIZEOF_LONG ? SIZEOF_LONG * CHAR_BIT - nlz_long((unsigned long)(x)) : \
228  sizeof(x) <= SIZEOF_LONG_LONG ? SIZEOF_LONG_LONG * CHAR_BIT - nlz_long_long((unsigned LONG_LONG)(x)) : \
229  SIZEOF_INT128_T * CHAR_BIT - nlz_int128((uint128_t)(x)))
230 #elif defined(HAVE_LONG_LONG)
231 # define bit_length(x) \
232  (sizeof(x) <= SIZEOF_INT ? SIZEOF_INT * CHAR_BIT - nlz_int((unsigned int)(x)) : \
233  sizeof(x) <= SIZEOF_LONG ? SIZEOF_LONG * CHAR_BIT - nlz_long((unsigned long)(x)) : \
234  SIZEOF_LONG_LONG * CHAR_BIT - nlz_long_long((unsigned LONG_LONG)(x)))
235 #else
236 # define bit_length(x) \
237  (sizeof(x) <= SIZEOF_INT ? SIZEOF_INT * CHAR_BIT - nlz_int((unsigned int)(x)) : \
238  SIZEOF_LONG * CHAR_BIT - nlz_long((unsigned long)(x)))
239 #endif
240 
242  char conflict[sizeof(VALUE) * 3];
243 };
244 
245 struct rb_subclass_entry;
247 
248 struct rb_subclass_entry {
249  VALUE klass;
251 };
252 
253 #if defined(HAVE_LONG_LONG)
254 typedef unsigned LONG_LONG rb_serial_t;
255 #define SERIALT2NUM ULL2NUM
256 #elif defined(HAVE_UINT64_T)
257 typedef uint64_t rb_serial_t;
258 #define SERIALT2NUM SIZET2NUM
259 #else
260 typedef unsigned long rb_serial_t;
261 #define SERIALT2NUM ULONG2NUM
262 #endif
263 
264 struct rb_classext_struct {
265  struct st_table *iv_index_tbl;
266  struct st_table *iv_tbl;
267  struct st_table *const_tbl;
276  rb_serial_t class_serial;
277  VALUE origin;
280 };
281 
282 struct method_table_wrapper {
283  st_table *tbl;
284  size_t serial;
285 };
286 
287 /* class.c */
288 void rb_class_subclass_add(VALUE super, VALUE klass);
290 
291 #define RCLASS_EXT(c) (RCLASS(c)->ptr)
292 #define RCLASS_IV_TBL(c) (RCLASS_EXT(c)->iv_tbl)
293 #define RCLASS_CONST_TBL(c) (RCLASS_EXT(c)->const_tbl)
294 #define RCLASS_M_TBL_WRAPPER(c) (RCLASS(c)->m_tbl_wrapper)
295 #define RCLASS_M_TBL(c) (RCLASS_M_TBL_WRAPPER(c) ? RCLASS_M_TBL_WRAPPER(c)->tbl : 0)
296 #define RCLASS_IV_INDEX_TBL(c) (RCLASS_EXT(c)->iv_index_tbl)
297 #define RCLASS_ORIGIN(c) (RCLASS_EXT(c)->origin)
298 #define RCLASS_REFINED_CLASS(c) (RCLASS_EXT(c)->refined_class)
299 #define RCLASS_SERIAL(c) (RCLASS_EXT(c)->class_serial)
300 
301 static inline void
303 {
304  struct method_table_wrapper *wrapper;
305  wrapper = ALLOC(struct method_table_wrapper);
306  wrapper->tbl = st_init_numtable();
307  wrapper->serial = 0;
308  RCLASS_M_TBL_WRAPPER(c) = wrapper;
309 }
310 
311 #undef RCLASS_SUPER
312 static inline VALUE
314 {
315  return RCLASS(klass)->super;
316 }
317 
318 static inline VALUE
320 {
321  if (super) {
323  rb_class_subclass_add(super, klass);
324  }
325  RB_OBJ_WRITE(klass, &RCLASS(klass)->super, super);
326  return super;
327 }
328 
329 struct vtm; /* defined by timev.h */
330 
331 /* array.c */
332 VALUE rb_ary_last(int, VALUE *, VALUE);
333 void rb_ary_set_len(VALUE, long);
335 
336 /* bignum.c */
341 
342 /* class.c */
343 void rb_class_foreach_subclass(VALUE klass, void(*f)(VALUE));
355 void Init_class_hierarchy(void);
356 
357 /* compar.c */
359 
360 /* compile.c */
361 int rb_dvar_defined(ID);
362 int rb_local_defined(ID);
363 int rb_parse_in_eval(void);
364 int rb_parse_in_main(void);
365 const char * rb_insns_name(int i);
367 
368 /* cont.c */
371 void ruby_register_rollback_func_for_ensure(VALUE (*ensure_func)(ANYARGS), VALUE (*rollback_func)(ANYARGS));
372 
373 /* debug.c */
374 PRINTF_ARGS(void ruby_debug_printf(const char*, ...), 1, 2);
375 
376 /* dmyext.c */
377 void Init_ext(void);
378 
379 /* encoding.c */
380 #ifdef RUBY_ENCODING_H
381 enum ruby_preserved_encindex {
382  ENCINDEX_ASCII,
383  ENCINDEX_UTF_8,
384  ENCINDEX_US_ASCII,
385 
386  /* preserved indexes */
387  ENCINDEX_UTF_16BE,
388  ENCINDEX_UTF_16LE,
389  ENCINDEX_UTF_32BE,
390  ENCINDEX_UTF_32LE,
391  ENCINDEX_UTF_16,
392  ENCINDEX_UTF_32,
393  ENCINDEX_UTF8_MAC,
394 
395  /* for old options of regexp */
396  ENCINDEX_EUC_JP,
397  ENCINDEX_Windows_31J,
398 
399  ENCINDEX_BUILTIN_MAX
400 };
401 #endif
402 #define rb_ascii8bit_encindex() ENCINDEX_ASCII
403 #define rb_utf8_encindex() ENCINDEX_UTF_8
404 #define rb_usascii_encindex() ENCINDEX_US_ASCII
405 ID rb_id_encoding(void);
406 void rb_gc_mark_encodings(void);
407 
408 /* error.c */
409 NORETURN(PRINTF_ARGS(void rb_compile_bug(const char*, int, const char*, ...), 3, 4));
411 NORETURN(void rb_async_bug_errno(const char *,int));
412 const char *rb_builtin_type_name(int t);
413 const char *rb_builtin_class_name(VALUE x);
414 
415 /* eval.c */
417 
418 /* eval_error.c */
419 void ruby_error_print(void);
421 
422 /* eval_jump.c */
423 void rb_call_end_proc(VALUE data);
424 void rb_mark_end_proc(void);
425 
426 /* file.c */
429 VALUE rb_realpath_internal(VALUE basedir, VALUE path, int strict);
430 void rb_file_const(const char*, VALUE);
431 int rb_file_load_ok(const char *);
436 void Init_File(void);
437 
438 #ifdef RUBY_FUNCTION_NAME_STRING
439 # if defined __GNUC__ && __GNUC__ >= 4
440 # pragma GCC visibility push(default)
441 # endif
442 NORETURN(void rb_sys_fail_path_in(const char *func_name, VALUE path));
443 NORETURN(void rb_syserr_fail_path_in(const char *func_name, int err, VALUE path));
444 # if defined __GNUC__ && __GNUC__ >= 4
445 # pragma GCC visibility pop
446 # endif
447 # define rb_sys_fail_path(path) rb_sys_fail_path_in(RUBY_FUNCTION_NAME_STRING, path)
448 # define rb_syserr_fail_path(err, path) rb_syserr_fail_path_in(RUBY_FUNCTION_NAME_STRING, (err), (path))
449 #else
450 # define rb_sys_fail_path(path) rb_sys_fail_str(path)
451 # define rb_syserr_fail_path(err, path) rb_syserr_fail_str((err), (path))
452 #endif
453 
454 /* gc.c */
455 void Init_heap(void);
456 void *ruby_mimmalloc(size_t size);
457 void ruby_mimfree(void *ptr);
460 void ruby_gc_set_params(int safe_level);
461 
462 #if defined(HAVE_MALLOC_USABLE_SIZE) || defined(HAVE_MALLOC_SIZE) || defined(_WIN32)
463 #define ruby_sized_xrealloc(ptr, new_size, old_size) ruby_xrealloc(ptr, new_size)
464 #define ruby_sized_xrealloc2(ptr, new_count, element_size, old_count) ruby_xrealloc(ptr, new_count, element_size)
465 #define ruby_sized_xfree(ptr, size) ruby_xfree(ptr)
466 #define SIZED_REALLOC_N(var,type,n,old_n) REALLOC_N(var, type, n)
467 #else
468 void *ruby_sized_xrealloc(void *ptr, size_t new_size, size_t old_size) RUBY_ATTR_ALLOC_SIZE((2));
469 void *ruby_sized_xrealloc2(void *ptr, size_t new_count, size_t element_size, size_t old_count) RUBY_ATTR_ALLOC_SIZE((2, 3));
470 void ruby_sized_xfree(void *x, size_t size);
471 #define SIZED_REALLOC_N(var,type,n,old_n) ((var)=(type*)ruby_sized_xrealloc((char*)(var), (n) * sizeof(type), (old_n) * sizeof(type)))
472 #endif
473 
474 void rb_gc_resurrect(VALUE ptr);
475 
476 /* hash.c */
478 #define RHASH_TBL_RAW(h) rb_hash_tbl_raw(h)
481 #define HASH_DELETED FL_USER1
482 #define HASH_PROC_DEFAULT FL_USER2
483 
484 /* inits.c */
485 void rb_call_inits(void);
486 
487 /* io.c */
488 const char *ruby_get_inplace_mode(void);
489 void ruby_set_inplace_mode(const char *);
490 ssize_t rb_io_bufread(VALUE io, void *buf, size_t size);
492 void rb_write_error_str(VALUE mesg);
494 
495 /* iseq.c */
496 VALUE rb_iseq_clone(VALUE iseqval, VALUE newcbase);
497 VALUE rb_iseq_path(VALUE iseqval);
499 VALUE rb_iseq_label(VALUE iseqval);
502 VALUE rb_iseq_klass(VALUE iseqval); /* completely temporary fucntion */
504 
505 /* load.c */
506 VALUE rb_get_load_path(void);
508 NORETURN(void rb_load_fail(VALUE, const char*));
509 
510 /* math.c */
520 
521 /* newline.c */
522 void Init_newline(void);
523 
524 /* numeric.c */
525 int rb_num_to_uint(VALUE val, unsigned int *ret);
526 VALUE ruby_num_interval_step_size(VALUE from, VALUE to, VALUE step, int excl);
527 int ruby_float_step(VALUE from, VALUE to, VALUE step, int excl);
528 double ruby_float_mod(double x, double y);
530 VALUE rb_int_succ(VALUE num);
531 VALUE rb_int_pred(VALUE num);
532 
533 #if USE_FLONUM
534 #define RUBY_BIT_ROTL(v, n) (((v) << (n)) | ((v) >> ((sizeof(v) * 8) - n)))
535 #define RUBY_BIT_ROTR(v, n) (((v) >> (n)) | ((v) << ((sizeof(v) * 8) - n)))
536 #endif
537 
538 static inline double
540 {
541 #if USE_FLONUM
542  if (FLONUM_P(v)) {
543  if (v != (VALUE)0x8000000000000002) { /* LIKELY */
544  union {
545  double d;
546  VALUE v;
547  } t;
548 
549  VALUE b63 = (v >> 63);
550  /* e: xx1... -> 011... */
551  /* xx0... -> 100... */
552  /* ^b63 */
553  t.v = RUBY_BIT_ROTR((2 - b63) | (v & ~0x03), 3);
554  return t.d;
555  }
556  else {
557  return 0.0;
558  }
559  }
560 #endif
561  return ((struct RFloat *)v)->float_value;
562 }
563 
564 static inline VALUE
566 {
567 #if USE_FLONUM
568  union {
569  double d;
570  VALUE v;
571  } t;
572  int bits;
573 
574  t.d = d;
575  bits = (int)((VALUE)(t.v >> 60) & 0x7);
576  /* bits contains 3 bits of b62..b60. */
577  /* bits - 3 = */
578  /* b011 -> b000 */
579  /* b100 -> b001 */
580 
581  if (t.v != 0x3000000000000000 /* 1.72723e-77 */ &&
582  !((bits-3) & ~0x01)) {
583  return (RUBY_BIT_ROTL(t.v, 3) & ~(VALUE)0x01) | 0x02;
584  }
585  else if (t.v == (VALUE)0) {
586  /* +0.0 */
587  return 0x8000000000000002;
588  }
589  /* out of range */
590 #endif
591  return rb_float_new_in_heap(d);
592 }
593 
594 #define rb_float_value(v) rb_float_value_inline(v)
595 #define rb_float_new(d) rb_float_new_inline(d)
596 
597 /* object.c */
598 void rb_obj_copy_ivar(VALUE dest, VALUE obj);
599 VALUE rb_obj_equal(VALUE obj1, VALUE obj2);
601 
602 struct RBasicRaw {
603  VALUE flags;
604  VALUE klass;
605 };
606 
607 #define RBASIC_CLEAR_CLASS(obj) (((struct RBasicRaw *)((VALUE)(obj)))->klass = 0)
608 #define RBASIC_SET_CLASS_RAW(obj, cls) (((struct RBasicRaw *)((VALUE)(obj)))->klass = (cls))
609 #define RBASIC_SET_CLASS(obj, cls) do { \
610  VALUE _obj_ = (obj); \
611  RB_OBJ_WRITE(_obj_, &((struct RBasicRaw *)(_obj_))->klass, cls); \
612 } while (0)
613 
614 /* parse.y */
625 void rb_gc_mark_parser(void);
626 void rb_gc_mark_symbols(int full_mark);
627 
628 /* proc.c */
631 int rb_block_arity(void);
632 
633 /* process.c */
634 #define RB_MAX_GROUPS (65536)
635 
636 struct rb_execarg {
637  int use_shell;
638  union {
639  struct {
641  } sh;
642  struct {
644  VALUE command_abspath; /* full path string or nil */
645  VALUE argv_str;
646  VALUE argv_buf;
647  } cmd;
648  } invoke;
650  VALUE envp_str;
651  VALUE envp_buf;
653  unsigned pgroup_given : 1;
654  unsigned umask_given : 1;
655  unsigned unsetenv_others_given : 1;
656  unsigned unsetenv_others_do : 1;
657  unsigned close_others_given : 1;
658  unsigned close_others_do : 1;
659  unsigned chdir_given : 1;
660  unsigned new_pgroup_given : 1;
661  unsigned new_pgroup_flag : 1;
662  unsigned uid_given : 1;
663  unsigned gid_given : 1;
664  rb_pid_t pgroup_pgid; /* asis(-1), new pgroup(0), specified pgroup (0<V). */
665  VALUE rlimit_limits; /* Qfalse or [[rtype, softlim, hardlim], ...] */
667  rb_uid_t uid;
668  rb_gid_t gid;
669  VALUE fd_dup2;
670  VALUE fd_close;
671  VALUE fd_open;
674  VALUE env_modification; /* Qfalse or [[k1,v1], ...] */
676 };
677 
678 /* argv_str contains extra two elements.
679  * The beginning one is for /bin/sh used by exec_with_sh.
680  * The last one for terminating NULL used by execve.
681  * See rb_exec_fillarg() in process.c. */
682 #define ARGVSTR2ARGC(argv_str) (RSTRING_LEN(argv_str) / sizeof(char *) - 2)
683 #define ARGVSTR2ARGV(argv_str) ((char **)RSTRING_PTR(argv_str) + 1)
684 
685 rb_pid_t rb_fork_ruby(int *status);
686 void rb_last_status_clear(void);
687 
688 /* rational.c */
689 VALUE rb_lcm(VALUE x, VALUE y);
691 
692 /* re.c */
693 VALUE rb_reg_compile(VALUE str, int options, const char *sourcefile, int sourceline);
695 
696 /* signal.c */
697 int rb_get_next_signal(void);
698 int rb_sigaltstack_size(void);
699 
700 /* strftime.c */
701 #ifdef RUBY_ENCODING_H
702 size_t rb_strftime_timespec(char *s, size_t maxsize, const char *format, rb_encoding *enc,
703  const struct vtm *vtm, struct timespec *ts, int gmt);
704 size_t rb_strftime(char *s, size_t maxsize, const char *format, rb_encoding *enc,
705  const struct vtm *vtm, VALUE timev, int gmt);
706 #endif
707 
708 /* string.c */
710 int rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p);
714 #define QUOTE(str) rb_str_quote_unprintable(str)
715 #define QUOTE_ID(id) rb_id_quote_unprintable(id)
716 void rb_str_fill_terminator(VALUE str, const int termlen);
718 #ifdef RUBY_ENCODING_H
720 #endif
721 #define STR_NOEMBED FL_USER1
722 #define STR_SHARED FL_USER2 /* = ELTS_SHARED */
723 #define STR_ASSOC FL_USER3
724 #define STR_SHARED_P(s) FL_ALL((s), STR_NOEMBED|ELTS_SHARED)
725 #define STR_ASSOC_P(s) FL_ALL((s), STR_NOEMBED|STR_ASSOC)
726 #define STR_NOCAPA (STR_NOEMBED|ELTS_SHARED|STR_ASSOC)
727 #define STR_NOCAPA_P(s) (FL_TEST((s),STR_NOEMBED) && FL_ANY((s),ELTS_SHARED|STR_ASSOC))
728 #define STR_EMBED_P(str) (!FL_TEST((str), STR_NOEMBED))
729 #define is_ascii_string(str) (rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT)
730 #define is_broken_string(str) (rb_enc_str_coderange(str) == ENC_CODERANGE_BROKEN)
731 
732 /* struct.c */
734 
735 /* time.c */
737 
738 /* thread.c */
742 void rb_clear_trace_func(void);
743 VALUE rb_get_coverages(void);
748 void rb_mutex_allow_trap(VALUE self, int val);
749 VALUE rb_uninterruptible(VALUE (*b_proc)(ANYARGS), VALUE data);
751 void ruby_kill(rb_pid_t pid, int sig);
752 
753 /* thread_pthread.c, thread_win32.c */
754 void Init_native_thread(void);
755 
756 /* vm_insnhelper.h */
757 rb_serial_t rb_next_class_serial(void);
758 
759 /* vm.c */
761 void rb_vm_mark(void *ptr);
762 void Init_BareVM(void);
763 VALUE rb_vm_top_self(void);
765 void rb_vm_change_state(void);
767 void rb_thread_mark(void *th);
768 const void **rb_vm_get_insns_address_table(void);
770 void rb_vm_pop_cfunc_frame(void);
771 
772 /* vm_dump.c */
773 void rb_vm_bugreport(void);
774 void rb_print_backtrace(void);
775 
776 /* vm_eval.c */
777 void Init_vm_eval(void);
780 typedef void rb_check_funcall_hook(int, VALUE, ID, int, const VALUE *, VALUE);
781 VALUE rb_check_funcall_with_hook(VALUE recv, ID mid, int argc, const VALUE *argv,
783 VALUE rb_catch_protect(VALUE t, rb_block_call_func *func, VALUE data, int *stateptr);
784 
785 /* vm_insnhelper.c */
786 VALUE rb_equal_opt(VALUE obj1, VALUE obj2);
787 int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *);
788 VALUE rb_extract_keywords(VALUE *orighash);
789 
790 /* vm_method.c */
791 void Init_eval_method(void);
792 int rb_method_defined_by(VALUE obj, ID mid, VALUE (*cfunc)(ANYARGS));
793 
794 /* miniprelude.c, prelude.c */
795 void Init_prelude(void);
796 
797 /* vm_backtrace.c */
798 void Init_vm_backtrace(void);
801 
804 int rb_backtrace_p(VALUE obj);
809 
811 const char *rb_objspace_data_type_name(VALUE obj);
812 
813 /* Temporary. This API will be removed (renamed). */
815 
816 /* bignum.c */
823 VALUE rb_big2str_poweroftwo(VALUE x, int base);
824 VALUE rb_big2str_generic(VALUE x, int base);
825 VALUE rb_str2big_poweroftwo(VALUE arg, int base, int badcheck);
826 VALUE rb_str2big_normal(VALUE arg, int base, int badcheck);
827 VALUE rb_str2big_karatsuba(VALUE arg, int base, int badcheck);
828 #if defined(HAVE_LIBGMP) && defined(HAVE_GMP_H)
829 VALUE rb_big_mul_gmp(VALUE x, VALUE y);
830 VALUE rb_big_divrem_gmp(VALUE x, VALUE y);
831 VALUE rb_big2str_gmp(VALUE x, int base);
832 VALUE rb_str2big_gmp(VALUE arg, int base, int badcheck);
833 #endif
834 
835 /* error.c */
836 int rb_bug_reporter_add(void (*func)(FILE *, void *), void *data);
837 
838 /* file.c */
839 #ifdef __APPLE__
840 VALUE rb_str_normalize_ospath(const char *ptr, long len);
841 #endif
842 
843 /* io.c */
844 void rb_maygvl_fd_fix_cloexec(int fd);
845 
846 /* numeric.c */
847 VALUE rb_int_positive_pow(long x, unsigned long y);
848 
849 /* process.c */
850 int rb_exec_async_signal_safe(const struct rb_execarg *e, char *errmsg, size_t errmsg_buflen);
851 rb_pid_t rb_fork_async_signal_safe(int *status, int (*chfunc)(void*, char *, size_t), void *charg, VALUE fds, char *errmsg, size_t errmsg_buflen);
852 VALUE rb_execarg_new(int argc, VALUE *argv, int accept_shell);
853 struct rb_execarg *rb_execarg_get(VALUE execarg_obj); /* dangerous. needs GC guard. */
854 VALUE rb_execarg_init(int argc, VALUE *argv, int accept_shell, VALUE execarg_obj);
855 int rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val);
856 void rb_execarg_fixup(VALUE execarg_obj);
857 int rb_execarg_run_options(const struct rb_execarg *e, struct rb_execarg *s, char* errmsg, size_t errmsg_buflen);
858 VALUE rb_execarg_extract_options(VALUE execarg_obj, VALUE opthash);
859 void rb_execarg_setenv(VALUE execarg_obj, VALUE env);
860 
861 /* rational.c */
862 VALUE rb_gcd_normal(VALUE self, VALUE other);
863 #if defined(HAVE_LIBGMP) && defined(HAVE_GMP_H)
864 VALUE rb_gcd_gmp(VALUE x, VALUE y);
865 #endif
866 
867 /* util.c */
868 extern const signed char ruby_digit36_to_number_table[];
869 
870 /* variable.c */
871 void rb_gc_mark_global_tbl(void);
873 void rb_mark_generic_ivar_tbl(void);
874 
875 int rb_st_insert_id_and_value(VALUE obj, st_table *tbl, ID key, VALUE value);
876 st_table *rb_st_copy(VALUE obj, struct st_table *orig_tbl);
877 
878 /* gc.c */
879 size_t rb_obj_memsize_of(VALUE);
880 #define RB_OBJ_GC_FLAGS_MAX 5
881 size_t rb_obj_gc_flags(VALUE, ID[], size_t);
882 
884 
885 #if defined(__cplusplus)
886 #if 0
887 { /* satisfy cc-mode */
888 #endif
889 } /* extern "C" { */
890 #endif
891 
892 #endif /* RUBY_INTERNAL_H */
893