~ubuntu-branches/ubuntu/quantal/ruby1.9.1/quantal

« back to all changes in this revision

Viewing changes to include/ruby/ruby.h

  • Committer: Bazaar Package Importer
  • Author(s): Lucas Nussbaum
  • Date: 2011-09-24 19:16:17 UTC
  • mfrom: (1.1.8 upstream) (13.1.7 experimental)
  • Revision ID: james.westby@ubuntu.com-20110924191617-o1qz4rcmqjot8zuy
Tags: 1.9.3~rc1-1
* New upstream release: 1.9.3 RC1.
  + Includes load.c fixes. Closes: #639959.
* Upload to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
 
3
3
  ruby/ruby.h -
4
4
 
5
 
  $Author: yugui $
 
5
  $Author: nobu $
6
6
  created at: Thu Jun 10 14:26:32 JST 1993
7
7
 
8
8
  Copyright (C) 1993-2008 Yukihiro Matsumoto
21
21
#endif
22
22
#endif
23
23
 
24
 
#ifndef RUBY_LIB_PREFIX
25
24
#include "ruby/config.h"
26
25
#ifdef RUBY_EXTCONF_H
27
26
#include RUBY_EXTCONF_H
28
27
#endif
29
 
#endif
30
28
 
31
29
#define NORETURN_STYLE_NEW 1
32
30
#ifndef NORETURN
46
44
#define PRINTF_ARGS(decl, string_index, first_to_check) decl
47
45
#endif
48
46
 
49
 
#ifdef HAVE_STDLIB_H
50
 
# include <stdlib.h>
51
 
#endif
52
 
 
53
47
#ifdef HAVE_STRING_H
54
48
# include <string.h>
55
49
#else
68
62
#endif
69
63
 
70
64
#include <stdarg.h>
71
 
#include <stddef.h>
72
65
#include <stdio.h>
73
66
 
74
67
#include "defines.h"
75
68
 
 
69
#if defined __GNUC__ && __GNUC__ >= 4
 
70
#pragma GCC visibility push(default)
 
71
#endif
 
72
 
76
73
#if defined(HAVE_ALLOCA_H)
77
74
#include <alloca.h>
78
75
#else
99
96
# define SIGNED_VALUE LONG_LONG
100
97
# define LONG_LONG_VALUE 1
101
98
# define SIZEOF_VALUE SIZEOF_LONG_LONG
102
 
# define PRI_VALUE_PREFIX "ll"
 
99
# define PRI_VALUE_PREFIX PRI_LL_PREFIX
103
100
#else
104
101
# error ---->> ruby requires sizeof(void*) == sizeof(long) to be compiled. <<----
105
102
#endif
111
108
#endif
112
109
typedef char ruby_check_sizeof_voidp[SIZEOF_VOIDP == sizeof(void*) ? 1 : -1];
113
110
 
 
111
#ifndef PRI_INT_PREFIX
 
112
#define PRI_INT_PREFIX ""
 
113
#endif
 
114
#ifndef PRI_LONG_PREFIX
 
115
#define PRI_LONG_PREFIX "l"
 
116
#endif
 
117
 
114
118
#if defined PRIdPTR && !defined PRI_VALUE_PREFIX
115
119
#define PRIdVALUE PRIdPTR
116
120
#define PRIiVALUE PRIiPTR
136
140
# elif SIZEOF_TIME_T == SIZEOF_LONG
137
141
#  define PRI_TIMET_PREFIX "l"
138
142
# elif SIZEOF_TIME_T == SIZEOF_LONG_LONG
139
 
#  define PRI_TIMET_PREFIX "ll"
 
143
#  define PRI_TIMET_PREFIX PRI_LL_PREFIX
140
144
# endif
141
145
#endif
142
146
 
143
 
#if defined PRIdPTR
144
 
# define PRI_PTRDIFF_PREFIX "t"
 
147
#if defined PRI_PTRDIFF_PREFIX
145
148
#elif SIZEOF_PTRDIFF_T == SIZEOF_INT
146
 
# define PRI_PTRDIFF_PREFIX
 
149
# define PRI_PTRDIFF_PREFIX ""
147
150
#elif SIZEOF_PTRDIFF_T == SIZEOF_LONG
148
151
# define PRI_PTRDIFF_PREFIX "l"
149
152
#elif SIZEOF_PTRDIFF_T == SIZEOF_LONG_LONG
150
 
# define PRI_PTRDIFF_PREFIX "ll"
 
153
# define PRI_PTRDIFF_PREFIX PRI_LL_PREFIX
151
154
#endif
152
155
#define PRIdPTRDIFF PRI_PTRDIFF_PREFIX"d"
153
156
#define PRIiPTRDIFF PRI_PTRDIFF_PREFIX"i"
156
159
#define PRIxPTRDIFF PRI_PTRDIFF_PREFIX"x"
157
160
#define PRIXPTRDIFF PRI_PTRDIFF_PREFIX"X"
158
161
 
159
 
#if defined PRIdPTR
160
 
# define PRI_SIZE_PREFIX "z"
 
162
#if defined PRI_SIZE_PREFIX
161
163
#elif SIZEOF_SIZE_T == SIZEOF_INT
162
 
# define PRI_SIZE_PREFIX
 
164
# define PRI_SIZE_PREFIX ""
163
165
#elif SIZEOF_SIZE_T == SIZEOF_LONG
164
166
# define PRI_SIZE_PREFIX "l"
165
167
#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
166
 
# define PRI_SIZE_PREFIX "ll"
 
168
# define PRI_SIZE_PREFIX PRI_LL_PREFIX
167
169
#endif
168
170
#define PRIdSIZE PRI_SIZE_PREFIX"d"
169
171
#define PRIiSIZE PRI_SIZE_PREFIX"i"
278
280
 
279
281
#if SIZEOF_INT < SIZEOF_LONG
280
282
#define rb_long2int_internal(n, i) \
281
 
    int i = (int)(n); \
282
 
    if ((long)i != (n)) rb_out_of_int(n)
 
283
    int (i) = (int)(n); \
 
284
    if ((long)(i) != (n)) rb_out_of_int(n)
283
285
#ifdef __GNUC__
284
286
#define rb_long2int(n) __extension__ ({long i2l_n = (n); rb_long2int_internal(i2l_n, i2l_i); i2l_i;})
285
287
#else
308
310
#ifndef NUM2GIDT
309
311
#define NUM2GIDT(v) NUM2LONG(v)
310
312
#endif
 
313
#ifndef NUM2MODET
 
314
#define NUM2MODET(v) NUM2INT(v)
 
315
#endif
 
316
#ifndef MODET2NUM
 
317
#define MODET2NUM(v) INT2NUM(v)
 
318
#endif
311
319
 
312
 
#define FIX2LONG(x) RSHIFT((SIGNED_VALUE)x,1)
 
320
#define FIX2LONG(x) (long)RSHIFT((SIGNED_VALUE)(x),1)
313
321
#define FIX2ULONG(x) ((((VALUE)(x))>>1)&LONG_MAX)
314
322
#define FIXNUM_P(f) (((SIGNED_VALUE)(f))&FIXNUM_FLAG)
315
323
#define POSFIXABLE(f) ((f) < FIXNUM_MAX+1)
432
440
#define RB_GC_GUARD(v) (*RB_GC_GUARD_PTR(&(v)))
433
441
 
434
442
void rb_check_type(VALUE,int);
435
 
#define Check_Type(v,t) rb_check_type((VALUE)(v),t)
 
443
#define Check_Type(v,t) rb_check_type((VALUE)(v),(t))
436
444
 
437
445
VALUE rb_str_to_str(VALUE);
438
446
VALUE rb_string_value(volatile VALUE*);
477
485
 
478
486
SIGNED_VALUE rb_num2long(VALUE);
479
487
VALUE rb_num2ulong(VALUE);
480
 
#define NUM2LONG_internal(x) (FIXNUM_P(x) ? FIX2LONG(x) : rb_num2long(x))
 
488
#define NUM2LONG_internal(x) ((long)(FIXNUM_P(x) ? FIX2LONG(x) : rb_num2long(x)))
481
489
#ifdef __GNUC__
482
490
#define NUM2LONG(x) \
483
491
    __extension__ ({VALUE num2long_x = (x); NUM2LONG_internal(num2long_x);})
488
496
    return NUM2LONG_internal(x);
489
497
}
490
498
#endif
491
 
#define NUM2ULONG(x) rb_num2ulong((VALUE)x)
 
499
#define NUM2ULONG(x) rb_num2ulong((VALUE)(x))
492
500
#if SIZEOF_INT < SIZEOF_LONG
493
501
long rb_num2int(VALUE);
494
502
long rb_fix2int(VALUE);
495
 
#define FIX2INT(x) ((int)rb_fix2int((VALUE)x))
 
503
#define FIX2INT(x) ((int)rb_fix2int((VALUE)(x)))
496
504
#define NUM2INT_internal(x) (FIXNUM_P(x) ? FIX2INT(x) : (int)rb_num2int(x))
497
505
#ifdef __GNUC__
498
506
#define NUM2INT(x) \
529
537
    return NUM2LL_internal(x);
530
538
}
531
539
# endif
532
 
# define NUM2ULL(x) rb_num2ull((VALUE)x)
 
540
# define NUM2ULL(x) rb_num2ull((VALUE)(x))
533
541
#endif
534
542
 
535
543
#if defined(HAVE_LONG_LONG) && SIZEOF_OFF_T > SIZEOF_LONG
553
561
VALUE rb_int2big(SIGNED_VALUE);
554
562
 
555
563
VALUE rb_newobj(void);
556
 
#define NEWOBJ(obj,type) type *obj = (type*)rb_newobj()
 
564
#define NEWOBJ(obj,type) type *(obj) = (type*)rb_newobj()
557
565
#define OBJSETUP(obj,c,t) do {\
558
566
    RBASIC(obj)->flags = (t);\
559
567
    RBASIC(obj)->klass = (c);\
560
 
    if (rb_safe_level() >= 3) FL_SET(obj, FL_TAINT | FL_UNTRUSTED);\
 
568
    if (rb_safe_level() >= 3) FL_SET((obj), FL_TAINT | FL_UNTRUSTED);\
561
569
} while (0)
562
570
#define CLONESETUP(clone,obj) do {\
563
 
    OBJSETUP(clone,rb_singleton_class_clone((VALUE)obj),RBASIC(obj)->flags);\
564
 
    rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);\
565
 
    if (FL_TEST(obj, FL_EXIVAR)) rb_copy_generic_ivar((VALUE)clone,(VALUE)obj);\
 
571
    OBJSETUP((clone),rb_singleton_class_clone((VALUE)(obj)),RBASIC(obj)->flags);\
 
572
    rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)(clone));\
 
573
    if (FL_TEST((obj), FL_EXIVAR)) rb_copy_generic_ivar((VALUE)(clone),(VALUE)(obj));\
566
574
} while (0)
567
575
#define DUPSETUP(dup,obj) do {\
568
 
    OBJSETUP(dup,rb_obj_class(obj), (RBASIC(obj)->flags)&(T_MASK|FL_EXIVAR|FL_TAINT|FL_UNTRUSTED)); \
569
 
    if (FL_TEST(obj, FL_EXIVAR)) rb_copy_generic_ivar((VALUE)dup,(VALUE)obj);\
 
576
    OBJSETUP((dup),rb_obj_class(obj), (RBASIC(obj)->flags)&(T_MASK|FL_EXIVAR|FL_TAINT|FL_UNTRUSTED)); \
 
577
    if (FL_TEST((obj), FL_EXIVAR)) rb_copy_generic_ivar((VALUE)(dup),(VALUE)(obj));\
570
578
} while (0)
571
579
 
572
580
struct RBasic {
601
609
     ROBJECT(o)->as.heap.iv_index_tbl)
602
610
 
603
611
/** @internal */
604
 
typedef struct {
605
 
    VALUE super;
606
 
    struct st_table *iv_tbl;
607
 
} rb_classext_t;
 
612
typedef struct rb_classext_struct rb_classext_t;
608
613
 
609
614
struct RClass {
610
615
    struct RBasic basic;
612
617
    struct st_table *m_tbl;
613
618
    struct st_table *iv_index_tbl;
614
619
};
615
 
#define RCLASS_IV_TBL(c) (RCLASS(c)->ptr->iv_tbl)
616
 
#define RCLASS_M_TBL(c) (RCLASS(c)->m_tbl)
617
 
#define RCLASS_SUPER(c) (RCLASS(c)->ptr->super)
618
 
#define RCLASS_IV_INDEX_TBL(c) (RCLASS(c)->iv_index_tbl)
 
620
#define RCLASS_SUPER(c) rb_class_get_superclass(c)
619
621
#define RMODULE_IV_TBL(m) RCLASS_IV_TBL(m)
 
622
#define RMODULE_CONST_TBL(m) RCLASS_CONST_TBL(m)
620
623
#define RMODULE_M_TBL(m) RCLASS_M_TBL(m)
621
624
#define RMODULE_SUPER(m) RCLASS_SUPER(m)
622
625
 
647
650
#define RSTRING_NOEMBED FL_USER1
648
651
#define RSTRING_EMBED_LEN_MASK (FL_USER2|FL_USER3|FL_USER4|FL_USER5|FL_USER6)
649
652
#define RSTRING_EMBED_LEN_SHIFT (FL_USHIFT+2)
 
653
#define RSTRING_EMBED_LEN(str) \
 
654
     (long)((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
 
655
            (RSTRING_EMBED_LEN_MASK >> RSTRING_EMBED_LEN_SHIFT))
650
656
#define RSTRING_LEN(str) \
651
657
    (!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
652
 
     (long)((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
653
 
            (RSTRING_EMBED_LEN_MASK >> RSTRING_EMBED_LEN_SHIFT)) : \
 
658
     RSTRING_EMBED_LEN(str) : \
654
659
     RSTRING(str)->as.heap.len)
655
660
#define RSTRING_PTR(str) \
656
661
    (!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
658
663
     RSTRING(str)->as.heap.ptr)
659
664
#define RSTRING_END(str) \
660
665
    (!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
661
 
     (RSTRING(str)->as.ary + \
662
 
      ((RBASIC(str)->flags >> RSTRING_EMBED_LEN_SHIFT) & \
663
 
       (RSTRING_EMBED_LEN_MASK >> RSTRING_EMBED_LEN_SHIFT))) : \
 
666
     (RSTRING(str)->as.ary + RSTRING_EMBED_LEN(str)) : \
664
667
     (RSTRING(str)->as.heap.ptr + RSTRING(str)->as.heap.len))
665
668
#define RSTRING_LENINT(str) rb_long2int(RSTRING_LEN(str))
 
669
#define RSTRING_GETMEM(str, ptrvar, lenvar) \
 
670
    (!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
 
671
     ((ptrvar) = RSTRING(str)->as.ary, (lenvar) = RSTRING_EMBED_LEN(str)) : \
 
672
     ((ptrvar) = RSTRING(str)->as.heap.ptr, (lenvar) = RSTRING(str)->as.heap.len))
666
673
 
667
674
#define RARRAY_EMBED_LEN_MAX 3
668
675
struct RArray {
742
749
    void *data;
743
750
};
744
751
 
745
 
typedef struct rb_data_type_struct {
 
752
typedef struct rb_data_type_struct rb_data_type_t;
 
753
 
 
754
struct rb_data_type_struct {
746
755
    const char *wrap_struct_name;
747
 
    void (*dmark)(void*);
748
 
    void (*dfree)(void*);
749
 
    size_t (*dsize)(const void *);
750
 
    void *reserved[3]; /* For future extension.
751
 
                          This array *must* be filled with ZERO. */
 
756
    struct {
 
757
        void (*dmark)(void*);
 
758
        void (*dfree)(void*);
 
759
        size_t (*dsize)(const void *);
 
760
        void *reserved[2]; /* For future extension.
 
761
                              This array *must* be filled with ZERO. */
 
762
    } function;
 
763
    const rb_data_type_t *parent;
752
764
    void *data;        /* This area can be used for any purpose
753
765
                          by a programmer who define the type. */
754
 
} rb_data_type_t;
 
766
};
 
767
 
 
768
#define HAVE_TYPE_RB_DATA_TYPE_T 1
 
769
#define HAVE_RB_DATA_TYPE_T_FUNCTION 1
 
770
#define HAVE_RB_DATA_TYPE_T_PARENT 1
755
771
 
756
772
struct RTypedData {
757
773
    struct RBasic basic;
767
783
#define RTYPEDDATA_DATA(v) (RTYPEDDATA(v)->data)
768
784
 
769
785
/*
770
 
#define RUBY_DATA_FUNC(func) ((void (*)(void*))func)
 
786
#define RUBY_DATA_FUNC(func) ((void (*)(void*))(func))
771
787
*/
772
788
typedef void (*RUBY_DATA_FUNC)(void*);
773
789
 
774
790
VALUE rb_data_object_alloc(VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC);
775
791
VALUE rb_data_typed_object_alloc(VALUE klass, void *datap, const rb_data_type_t *);
 
792
int rb_typeddata_inherited_p(const rb_data_type_t *child, const rb_data_type_t *parent);
776
793
int rb_typeddata_is_kind_of(VALUE, const rb_data_type_t *);
777
794
void *rb_check_typeddata(VALUE, const rb_data_type_t *);
778
 
#define Check_TypedStruct(v,t) rb_check_typeddata((VALUE)(v),t)
 
795
#define Check_TypedStruct(v,t) rb_check_typeddata((VALUE)(v),(t))
779
796
#define RUBY_DEFAULT_FREE ((RUBY_DATA_FUNC)-1)
780
797
#define RUBY_NEVER_FREE   ((RUBY_DATA_FUNC)0)
781
798
#define RUBY_TYPED_DEFAULT_FREE RUBY_DEFAULT_FREE
782
799
#define RUBY_TYPED_NEVER_FREE   RUBY_NEVER_FREE
783
800
 
784
801
#define Data_Wrap_Struct(klass,mark,free,sval)\
785
 
    rb_data_object_alloc(klass,sval,(RUBY_DATA_FUNC)mark,(RUBY_DATA_FUNC)free)
 
802
    rb_data_object_alloc((klass),(sval),(RUBY_DATA_FUNC)(mark),(RUBY_DATA_FUNC)(free))
786
803
 
787
804
#define Data_Make_Struct(klass,type,mark,free,sval) (\
788
 
    sval = ALLOC(type),\
789
 
    memset(sval, 0, sizeof(type)),\
790
 
    Data_Wrap_Struct(klass,mark,free,sval)\
 
805
    (sval) = ALLOC(type),\
 
806
    memset((sval), 0, sizeof(type)),\
 
807
    Data_Wrap_Struct((klass),(mark),(free),(sval))\
791
808
)
792
809
 
793
810
#define TypedData_Wrap_Struct(klass,data_type,sval)\
794
 
  rb_data_typed_object_alloc(klass,sval,data_type)
 
811
  rb_data_typed_object_alloc((klass),(sval),(data_type))
795
812
 
796
813
#define TypedData_Make_Struct(klass, type, data_type, sval) (\
797
 
    sval = ALLOC(type),\
798
 
    memset(sval, 0, sizeof(type)),\
799
 
    TypedData_Wrap_Struct(klass,data_type,sval)\
 
814
    (sval) = ALLOC(type),\
 
815
    memset((sval), 0, sizeof(type)),\
 
816
    TypedData_Wrap_Struct((klass),(data_type),(sval))\
800
817
)
801
818
 
802
819
#define Data_Get_Struct(obj,type,sval) do {\
803
 
    Check_Type(obj, T_DATA); \
804
 
    sval = (type*)DATA_PTR(obj);\
 
820
    Check_Type((obj), T_DATA); \
 
821
    (sval) = (type*)DATA_PTR(obj);\
805
822
} while (0)
806
823
 
807
824
#define TypedData_Get_Struct(obj,type,data_type,sval) do {\
808
 
    sval = (type*)rb_check_typeddata(obj, data_type); \
 
825
    (sval) = (type*)rb_check_typeddata((obj), (data_type)); \
809
826
} while (0)
810
827
 
811
828
#define RSTRUCT_EMBED_LEN_MAX 3
921
938
 
922
939
#define FL_ABLE(x) (!SPECIAL_CONST_P(x) && BUILTIN_TYPE(x) != T_NODE)
923
940
#define FL_TEST(x,f) (FL_ABLE(x)?(RBASIC(x)->flags&(f)):0)
924
 
#define FL_ANY(x,f) FL_TEST(x,f)
925
 
#define FL_ALL(x,f) (FL_TEST(x,f) == (f))
 
941
#define FL_ANY(x,f) FL_TEST((x),(f))
 
942
#define FL_ALL(x,f) (FL_TEST((x),(f)) == (f))
926
943
#define FL_SET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags |= (f);} while (0)
927
944
#define FL_UNSET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags &= ~(f);} while (0)
928
945
#define FL_REVERSE(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags ^= (f);} while (0)
998
1015
#endif
999
1016
#define CHR2FIX(x) INT2FIX((long)((x)&0xff))
1000
1017
 
1001
 
#define ALLOC_N(type,n) (type*)xmalloc2((n),sizeof(type))
1002
 
#define ALLOC(type) (type*)xmalloc(sizeof(type))
1003
 
#define REALLOC_N(var,type,n) (var)=(type*)xrealloc2((char*)(var),(n),sizeof(type))
1004
 
 
1005
 
#define ALLOCA_N(type,n) (type*)alloca(sizeof(type)*(n))
 
1018
#define ALLOC_N(type,n) ((type*)xmalloc2((n),sizeof(type)))
 
1019
#define ALLOC(type) ((type*)xmalloc(sizeof(type)))
 
1020
#define REALLOC_N(var,type,n) ((var)=(type*)xrealloc2((char*)(var),(n),sizeof(type)))
 
1021
 
 
1022
#define ALLOCA_N(type,n) ((type*)alloca(sizeof(type)*(n)))
 
1023
 
 
1024
void *rb_alloc_tmp_buffer(volatile VALUE *store, long len);
 
1025
void rb_free_tmp_buffer(volatile VALUE *store);
 
1026
/* allocates _n_ bytes temporary buffer and stores VALUE including it
 
1027
 * in _v_.  _n_ may be evaluated twice. */
 
1028
#ifdef C_ALLOCA
 
1029
# define ALLOCV(v, n) rb_alloc_tmp_buffer(&(v), (n))
 
1030
#else
 
1031
# define ALLOCV(v, n) ((n) < 1024 ? (RB_GC_GUARD(v) = 0, alloca(n)) : rb_alloc_tmp_buffer(&(v), (n)))
 
1032
#endif
 
1033
#define ALLOCV_N(type, v, n) ((type*)ALLOCV((v), sizeof(type)*(n)))
 
1034
#define ALLOCV_END(v) rb_free_tmp_buffer(&(v))
1006
1035
 
1007
1036
#define MEMZERO(p,type,n) memset((p), 0, sizeof(type)*(n))
1008
1037
#define MEMCPY(p1,p2,type,n) memcpy((p1), (p2), sizeof(type)*(n))
1051
1080
void rb_define_const(VALUE,const char*,VALUE);
1052
1081
void rb_define_global_const(const char*,VALUE);
1053
1082
 
1054
 
#define RUBY_METHOD_FUNC(func) ((VALUE (*)(ANYARGS))func)
 
1083
#define RUBY_METHOD_FUNC(func) ((VALUE (*)(ANYARGS))(func))
1055
1084
void rb_define_method(VALUE,const char*,VALUE(*)(ANYARGS),int);
1056
1085
void rb_define_module_function(VALUE,const char*,VALUE(*)(ANYARGS),int);
1057
1086
void rb_define_global_function(const char*,VALUE(*)(ANYARGS),int);
1076
1105
    {                                                   \
1077
1106
        static ID rb_intern_id_cache;                   \
1078
1107
        if (!rb_intern_id_cache)                        \
1079
 
            rb_intern_id_cache = rb_intern2(str, (long)strlen(str)); \
 
1108
            rb_intern_id_cache = rb_intern2((str), (long)strlen(str)); \
1080
1109
        result rb_intern_id_cache;                      \
1081
1110
    }
1082
1111
#define CONST_ID(var, str) \
1083
 
    do CONST_ID_CACHE(var =, str) while (0)
 
1112
    do CONST_ID_CACHE((var) =, (str)) while (0)
1084
1113
#ifdef __GNUC__
1085
1114
/* __builtin_constant_p and statement expression is available
1086
1115
 * since gcc-2.7.2.3 at least. */
1087
1116
#define rb_intern(str) \
1088
1117
    (__builtin_constant_p(str) ? \
1089
 
        __extension__ (CONST_ID_CACHE((ID), str)) :     \
 
1118
        __extension__ (CONST_ID_CACHE((ID), (str))) : \
1090
1119
        rb_intern(str))
1091
1120
#define rb_intern_const(str) \
1092
1121
    (__builtin_constant_p(str) ? \
1093
 
     __extension__ (rb_intern2(str, (long)strlen(str))) : \
 
1122
     __extension__ (rb_intern2((str), (long)strlen(str))) : \
1094
1123
     (rb_intern)(str))
1095
1124
#else
1096
 
#define rb_intern_const(str) rb_intern2(str, (long)strlen(str))
 
1125
#define rb_intern_const(str) rb_intern2((str), (long)strlen(str))
1097
1126
#endif
1098
1127
 
1099
1128
const char *rb_class2name(VALUE);
1107
1136
VALUE rb_funcall(VALUE, ID, int, ...);
1108
1137
VALUE rb_funcall2(VALUE, ID, int, const VALUE*);
1109
1138
VALUE rb_funcall3(VALUE, ID, int, const VALUE*);
 
1139
VALUE rb_funcall_passing_block(VALUE, ID, int, const VALUE*);
1110
1140
int rb_scan_args(int, const VALUE*, const char*, ...);
1111
1141
VALUE rb_call_super(int, const VALUE*);
1112
1142
 
1131
1161
NORETURN(void rb_iter_break(void));
1132
1162
NORETURN(void rb_exit(int));
1133
1163
NORETURN(void rb_notimplement(void));
 
1164
VALUE rb_syserr_new(int, const char *);
 
1165
NORETURN(void rb_syserr_fail(int, const char*));
 
1166
NORETURN(void rb_mod_syserr_fail(VALUE, int, const char*));
1134
1167
 
1135
1168
/* reports if `-W' specified */
1136
1169
PRINTF_ARGS(void rb_warning(const char*, ...), 1, 2);
1163
1196
 
1164
1197
#ifdef __ia64
1165
1198
void ruby_init_stack(volatile VALUE*, void*);
1166
 
#define ruby_init_stack(addr) ruby_init_stack(addr, rb_ia64_bsp())
 
1199
#define ruby_init_stack(addr) ruby_init_stack((addr), rb_ia64_bsp())
1167
1200
#else
1168
1201
void ruby_init_stack(volatile VALUE*);
1169
1202
#endif
1174
1207
void *ruby_options(int, char**);
1175
1208
int ruby_run_node(void *);
1176
1209
int ruby_exec_node(void *);
 
1210
int ruby_executable_node(void *n, int *status);
1177
1211
 
1178
1212
RUBY_EXTERN VALUE rb_mKernel;
1179
1213
RUBY_EXTERN VALUE rb_mComparable;
1305
1339
 
1306
1340
#ifdef __GNUC__
1307
1341
#define rb_type_p(obj, type) \
1308
 
    __extension__ (__builtin_constant_p(type) ? RB_TYPE_P(obj, type) : \
 
1342
    __extension__ (__builtin_constant_p(type) ? RB_TYPE_P((obj), (type)) : \
1309
1343
                   rb_type(obj) == (type))
1310
1344
#else
1311
1345
#define rb_type_p(obj, type) (rb_type(obj) == (type))
1407
1441
 
1408
1442
int st_strcasecmp(const char *s1, const char *s2);
1409
1443
int st_strncasecmp(const char *s1, const char *s2, size_t n);
1410
 
#define STRCASECMP(s1, s2) (st_strcasecmp(s1, s2))
1411
 
#define STRNCASECMP(s1, s2, n) (st_strncasecmp(s1, s2, n))
 
1444
#define STRCASECMP(s1, s2) (st_strcasecmp((s1), (s2)))
 
1445
#define STRNCASECMP(s1, s2, n) (st_strncasecmp((s1), (s2), (n)))
1412
1446
 
1413
1447
unsigned long ruby_strtoul(const char *str, char **endptr, int base);
1414
 
#define STRTOUL(str, endptr, base) (ruby_strtoul(str, endptr, base))
 
1448
#define STRTOUL(str, endptr, base) (ruby_strtoul((str), (endptr), (base)))
1415
1449
 
1416
1450
#define InitVM(ext) {void InitVM_##ext(void);InitVM_##ext();}
1417
1451
 
1418
 
int ruby_snprintf(char *str, size_t n, char const *fmt, ...);
 
1452
PRINTF_ARGS(int ruby_snprintf(char *str, size_t n, char const *fmt, ...), 3, 4);
1419
1453
int ruby_vsnprintf(char *str, size_t n, char const *fmt, va_list ap);
1420
 
#undef snprintf
1421
 
#undef vsnprintf
1422
 
#define snprintf ruby_snprintf
1423
 
#define vsnprintf ruby_vsnprintf
1424
 
 
1425
 
#ifdef BROKEN_CLOSE
1426
 
#undef getpeername
1427
 
#define getpeername ruby_getpeername
1428
 
#undef getsockname
1429
 
#define getsockname ruby_getsockname
1430
 
#undef shutdown
1431
 
#define shutdown ruby_shutdown
1432
 
#undef close
1433
 
#define close ruby_close
 
1454
 
 
1455
#if defined __GNUC__ && __GNUC__ >= 4
 
1456
#pragma GCC visibility pop
 
1457
#endif
 
1458
 
 
1459
#ifndef RUBY_DONT_SUBST
 
1460
#include "ruby/subst.h"
1434
1461
#endif
1435
1462
 
1436
1463
#if defined(__cplusplus)