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
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
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"
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
168
170
#define PRIdSIZE PRI_SIZE_PREFIX"d"
169
171
#define PRIiSIZE PRI_SIZE_PREFIX"i"
553
561
VALUE rb_int2big(SIGNED_VALUE);
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);\
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));\
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));\
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))
667
674
#define RARRAY_EMBED_LEN_MAX 3
745
typedef struct rb_data_type_struct {
752
typedef struct rb_data_type_struct rb_data_type_t;
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. */
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. */
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. */
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
756
772
struct RTypedData {
757
773
struct RBasic basic;
767
783
#define RTYPEDDATA_DATA(v) (RTYPEDDATA(v)->data)
770
#define RUBY_DATA_FUNC(func) ((void (*)(void*))func)
786
#define RUBY_DATA_FUNC(func) ((void (*)(void*))(func))
772
788
typedef void (*RUBY_DATA_FUNC)(void*);
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
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))
787
804
#define Data_Make_Struct(klass,type,mark,free,sval) (\
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))\
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))
796
813
#define TypedData_Make_Struct(klass, type, data_type, sval) (\
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))\
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);\
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)); \
811
828
#define RSTRUCT_EMBED_LEN_MAX 3
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)
999
1016
#define CHR2FIX(x) INT2FIX((long)((x)&0xff))
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))
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)))
1022
#define ALLOCA_N(type,n) ((type*)alloca(sizeof(type)*(n)))
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. */
1029
# define ALLOCV(v, n) rb_alloc_tmp_buffer(&(v), (n))
1031
# define ALLOCV(v, n) ((n) < 1024 ? (RB_GC_GUARD(v) = 0, alloca(n)) : rb_alloc_tmp_buffer(&(v), (n)))
1033
#define ALLOCV_N(type, v, n) ((type*)ALLOCV((v), sizeof(type)*(n)))
1034
#define ALLOCV_END(v) rb_free_tmp_buffer(&(v))
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);
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);
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; \
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))
1096
#define rb_intern_const(str) rb_intern2(str, (long)strlen(str))
1125
#define rb_intern_const(str) rb_intern2((str), (long)strlen(str))
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*);
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*));
1135
1168
/* reports if `-W' specified */
1136
1169
PRINTF_ARGS(void rb_warning(const char*, ...), 1, 2);
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)))
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)))
1416
1450
#define InitVM(ext) {void InitVM_##ext(void);InitVM_##ext();}
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);
1422
#define snprintf ruby_snprintf
1423
#define vsnprintf ruby_vsnprintf
1427
#define getpeername ruby_getpeername
1429
#define getsockname ruby_getsockname
1431
#define shutdown ruby_shutdown
1433
#define close ruby_close
1455
#if defined __GNUC__ && __GNUC__ >= 4
1456
#pragma GCC visibility pop
1459
#ifndef RUBY_DONT_SUBST
1460
#include "ruby/subst.h"
1436
1463
#if defined(__cplusplus)