pline 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/README +134 -0
  2. data/ext/pline/depend +55 -0
  3. data/ext/pline/extconf.rb +14 -0
  4. data/ext/pline/iseq.c +124 -0
  5. data/ext/pline/minfo.c +167 -0
  6. data/ext/pline/pline.c.rb +68 -0
  7. data/ext/pline/profiler.c +125 -0
  8. data/ext/pline/ruby_source/1.9.2/debug.h +36 -0
  9. data/ext/pline/ruby_source/1.9.2/eval_intern.h +232 -0
  10. data/ext/pline/ruby_source/1.9.2/gc.h +77 -0
  11. data/ext/pline/ruby_source/1.9.2/id.h +170 -0
  12. data/ext/pline/ruby_source/1.9.2/insns.inc +179 -0
  13. data/ext/pline/ruby_source/1.9.2/insns_info.inc +695 -0
  14. data/ext/pline/ruby_source/1.9.2/iseq.h +104 -0
  15. data/ext/pline/ruby_source/1.9.2/manual_update.h +19 -0
  16. data/ext/pline/ruby_source/1.9.2/method.h +103 -0
  17. data/ext/pline/ruby_source/1.9.2/node.h +483 -0
  18. data/ext/pline/ruby_source/1.9.2/thread_pthread.h +27 -0
  19. data/ext/pline/ruby_source/1.9.2/thread_win32.h +33 -0
  20. data/ext/pline/ruby_source/1.9.2/vm_core.h +706 -0
  21. data/ext/pline/ruby_source/1.9.2/vm_exec.h +184 -0
  22. data/ext/pline/ruby_source/1.9.2/vm_insnhelper.c +1734 -0
  23. data/ext/pline/ruby_source/1.9.2/vm_insnhelper.h +208 -0
  24. data/ext/pline/ruby_source/1.9.2/vm_opts.h +51 -0
  25. data/ext/pline/ruby_source/1.9.3/atomic.h +56 -0
  26. data/ext/pline/ruby_source/1.9.3/constant.h +34 -0
  27. data/ext/pline/ruby_source/1.9.3/debug.h +41 -0
  28. data/ext/pline/ruby_source/1.9.3/eval_intern.h +234 -0
  29. data/ext/pline/ruby_source/1.9.3/gc.h +98 -0
  30. data/ext/pline/ruby_source/1.9.3/id.h +175 -0
  31. data/ext/pline/ruby_source/1.9.3/insns.inc +179 -0
  32. data/ext/pline/ruby_source/1.9.3/insns_info.inc +695 -0
  33. data/ext/pline/ruby_source/1.9.3/internal.h +227 -0
  34. data/ext/pline/ruby_source/1.9.3/iseq.h +125 -0
  35. data/ext/pline/ruby_source/1.9.3/manual_update.h +19 -0
  36. data/ext/pline/ruby_source/1.9.3/method.h +105 -0
  37. data/ext/pline/ruby_source/1.9.3/node.h +503 -0
  38. data/ext/pline/ruby_source/1.9.3/thread_pthread.h +51 -0
  39. data/ext/pline/ruby_source/1.9.3/thread_win32.h +40 -0
  40. data/ext/pline/ruby_source/1.9.3/vm_core.h +756 -0
  41. data/ext/pline/ruby_source/1.9.3/vm_exec.h +184 -0
  42. data/ext/pline/ruby_source/1.9.3/vm_insnhelper.c +1749 -0
  43. data/ext/pline/ruby_source/1.9.3/vm_insnhelper.h +220 -0
  44. data/ext/pline/ruby_source/1.9.3/vm_opts.h +51 -0
  45. data/ext/pline/sinfo.c +311 -0
  46. data/lib/pline.rb +11 -0
  47. data/lib/pline/minfo.rb +22 -0
  48. data/lib/pline/summarize.rb +127 -0
  49. data/lib/pline/util.rb +54 -0
  50. data/pline.gemspec +28 -0
  51. metadata +102 -0
@@ -0,0 +1,208 @@
1
+ /**********************************************************************
2
+
3
+ insnhelper.h - helper macros to implement each instructions
4
+
5
+ $Author: wanabe $
6
+ created at: 04/01/01 15:50:34 JST
7
+
8
+ Copyright (C) 2004-2007 Koichi Sasada
9
+
10
+ **********************************************************************/
11
+
12
+ #ifndef RUBY_INSNHELPER_H
13
+ #define RUBY_INSNHELPER_H
14
+
15
+ /**
16
+ * VM Debug Level
17
+ *
18
+ * debug level:
19
+ * 0: no debug output
20
+ * 1: show instruction name
21
+ * 2: show stack frame when control stack frame is changed
22
+ * 3: show stack status
23
+ * 4: show register
24
+ * 5:
25
+ * 10: gc check
26
+ */
27
+
28
+ #ifndef VMDEBUG
29
+ #define VMDEBUG 0
30
+ #endif
31
+
32
+ #if 0
33
+ #undef VMDEBUG
34
+ #define VMDEBUG 3
35
+ #endif
36
+
37
+ enum {
38
+ BOP_PLUS,
39
+ BOP_MINUS,
40
+ BOP_MULT,
41
+ BOP_DIV,
42
+ BOP_MOD,
43
+ BOP_EQ,
44
+ BOP_EQQ,
45
+ BOP_LT,
46
+ BOP_LE,
47
+ BOP_LTLT,
48
+ BOP_AREF,
49
+ BOP_ASET,
50
+ BOP_LENGTH,
51
+ BOP_SIZE,
52
+ BOP_SUCC,
53
+ BOP_GT,
54
+ BOP_GE,
55
+ BOP_NOT,
56
+ BOP_NEQ,
57
+
58
+ BOP_LAST_
59
+ };
60
+
61
+ extern char ruby_vm_redefined_flag[BOP_LAST_];
62
+ extern VALUE ruby_vm_const_missing_count;
63
+
64
+
65
+ /**********************************************************/
66
+ /* deal with stack */
67
+ /**********************************************************/
68
+
69
+ #define PUSH(x) (SET_SV(x), INC_SP(1))
70
+ #define TOPN(n) (*(GET_SP()-(n)-1))
71
+ #define POPN(n) (DEC_SP(n))
72
+ #define POP() (DEC_SP(1))
73
+ #define STACK_ADDR_FROM_TOP(n) (GET_SP()-(n))
74
+
75
+ #define GET_TOS() (tos) /* dummy */
76
+
77
+ /**********************************************************/
78
+ /* deal with registers */
79
+ /**********************************************************/
80
+
81
+ #define REG_CFP (reg_cfp)
82
+ #define REG_PC (REG_CFP->pc)
83
+ #define REG_SP (REG_CFP->sp)
84
+ #define REG_LFP (REG_CFP->lfp)
85
+ #define REG_DFP (REG_CFP->dfp)
86
+
87
+ #define RESTORE_REGS() do { \
88
+ REG_CFP = th->cfp; \
89
+ } while (0)
90
+
91
+ #define REG_A reg_a
92
+ #define REG_B reg_b
93
+
94
+ #ifdef COLLECT_USAGE_ANALYSIS
95
+ #define USAGE_ANALYSIS_REGISTER_HELPER(a, b, v) \
96
+ (USAGE_ANALYSIS_REGISTER(a, b), (v))
97
+ #else
98
+ #define USAGE_ANALYSIS_REGISTER_HELPER(a, b, v) (v)
99
+ #endif
100
+
101
+ /* PC */
102
+ #define GET_PC() (USAGE_ANALYSIS_REGISTER_HELPER(0, 0, REG_PC))
103
+ #define SET_PC(x) (REG_PC = (USAGE_ANALYSIS_REGISTER_HELPER(0, 1, x)))
104
+ #define GET_CURRENT_INSN() (*GET_PC())
105
+ #define GET_OPERAND(n) (GET_PC()[(n)])
106
+ #define ADD_PC(n) (SET_PC(REG_PC + (n)))
107
+
108
+ #define GET_PC_COUNT() (REG_PC - GET_ISEQ()->iseq_encoded)
109
+ #define JUMP(dst) (REG_PC += (dst))
110
+
111
+ /* FP */
112
+ #define GET_CFP() (USAGE_ANALYSIS_REGISTER_HELPER(2, 0, REG_CFP))
113
+ #define GET_LFP() (USAGE_ANALYSIS_REGISTER_HELPER(3, 0, REG_LFP))
114
+ #define SET_LFP(x) (REG_LFP = (USAGE_ANALYSIS_REGISTER_HELPER(3, 1, (x))))
115
+ #define GET_DFP() (USAGE_ANALYSIS_REGISTER_HELPER(4, 0, REG_DFP))
116
+ #define SET_DFP(x) (REG_DFP = (USAGE_ANALYSIS_REGISTER_HELPER(4, 1, (x))))
117
+
118
+ /* SP */
119
+ #define GET_SP() (USAGE_ANALYSIS_REGISTER_HELPER(1, 0, REG_SP))
120
+ #define SET_SP(x) (REG_SP = (USAGE_ANALYSIS_REGISTER_HELPER(1, 1, (x))))
121
+ #define INC_SP(x) (REG_SP += (USAGE_ANALYSIS_REGISTER_HELPER(1, 1, (x))))
122
+ #define DEC_SP(x) (REG_SP -= (USAGE_ANALYSIS_REGISTER_HELPER(1, 1, (x))))
123
+ #define SET_SV(x) (*GET_SP() = (x))
124
+ /* set current stack value as x */
125
+
126
+ #define GET_SP_COUNT() (REG_SP - th->stack)
127
+
128
+ /* instruction sequence C struct */
129
+ #define GET_ISEQ() (GET_CFP()->iseq)
130
+
131
+ /**********************************************************/
132
+ /* deal with variables */
133
+ /**********************************************************/
134
+
135
+ #define GET_PREV_DFP(dfp) ((VALUE *)((dfp)[0] & ~0x03))
136
+
137
+ #define GET_GLOBAL(entry) rb_gvar_get((struct rb_global_entry*)entry)
138
+ #define SET_GLOBAL(entry, val) rb_gvar_set((struct rb_global_entry*)entry, val)
139
+
140
+ #define GET_CONST_INLINE_CACHE(dst) ((IC) * (GET_PC() + (dst) + 2))
141
+
142
+ /**********************************************************/
143
+ /* deal with values */
144
+ /**********************************************************/
145
+
146
+ #define GET_SELF() (USAGE_ANALYSIS_REGISTER_HELPER(5, 0, GET_CFP()->self))
147
+
148
+ /**********************************************************/
149
+ /* deal with control flow 2: method/iterator */
150
+ /**********************************************************/
151
+
152
+ #define COPY_CREF(c1, c2) do { \
153
+ NODE *__tmp_c2 = (c2); \
154
+ c1->nd_clss = __tmp_c2->nd_clss; \
155
+ c1->nd_visi = __tmp_c2->nd_visi;\
156
+ c1->nd_next = __tmp_c2->nd_next; \
157
+ } while (0)
158
+
159
+ #define CALL_METHOD(num, blockptr, flag, id, me, recv) do { \
160
+ VALUE v = vm_call_method(th, GET_CFP(), num, blockptr, flag, id, me, recv); \
161
+ if (v == Qundef) { \
162
+ RESTORE_REGS(); \
163
+ NEXT_INSN(); \
164
+ } \
165
+ else { \
166
+ val = v; \
167
+ } \
168
+ } while (0)
169
+
170
+ #define GET_BLOCK_PTR() \
171
+ ((rb_block_t *)(GC_GUARDED_PTR_REF(GET_LFP()[0] & \
172
+ ((GET_LFP()[0] & 0x02) - 0x02))))
173
+
174
+ /**********************************************************/
175
+ /* deal with control flow 3: exception */
176
+ /**********************************************************/
177
+
178
+
179
+ /**********************************************************/
180
+ /* others */
181
+ /**********************************************************/
182
+
183
+ /* optimize insn */
184
+ #define FIXNUM_2_P(a, b) ((a) & (b) & 1)
185
+ #define BASIC_OP_UNREDEFINED_P(op) (LIKELY(ruby_vm_redefined_flag[op] == 0))
186
+ #define HEAP_CLASS_OF(obj) RBASIC(obj)->klass
187
+
188
+ #ifndef USE_IC_FOR_SPECIALIZED_METHOD
189
+ #define USE_IC_FOR_SPECIALIZED_METHOD 1
190
+ #endif
191
+
192
+ #if USE_IC_FOR_SPECIALIZED_METHOD
193
+
194
+ #define CALL_SIMPLE_METHOD(num, id, recv) do { \
195
+ VALUE klass = CLASS_OF(recv); \
196
+ CALL_METHOD(num, 0, 0, id, vm_method_search(id, klass, ic), recv); \
197
+ } while (0)
198
+
199
+ #else
200
+
201
+ #define CALL_SIMPLE_METHOD(num, id, recv) do { \
202
+ VALUE klass = CLASS_OF(recv); \
203
+ CALL_METHOD(num, 0, 0, id, rb_method_entry(klass, id), recv); \
204
+ } while (0)
205
+
206
+ #endif
207
+
208
+ #endif /* RUBY_INSNHELPER_H */
@@ -0,0 +1,51 @@
1
+ /*-*-c-*-*/
2
+ /**********************************************************************
3
+
4
+ vm_opts.h - VM optimize option
5
+
6
+ $Author: akr $
7
+
8
+ Copyright (C) 2004-2007 Koichi Sasada
9
+
10
+ **********************************************************************/
11
+
12
+
13
+ #ifndef RUBY_VM_OPTS_H
14
+ #define RUBY_VM_OPTS_H
15
+
16
+ /* Compile options.
17
+ * You can change these options at runtime by VM::CompileOption.
18
+ * Following definitions are default values.
19
+ */
20
+
21
+ #define OPT_TRACE_INSTRUCTION 1
22
+ #define OPT_TAILCALL_OPTIMIZATION 0
23
+ #define OPT_PEEPHOLE_OPTIMIZATION 1
24
+ #define OPT_SPECIALISED_INSTRUCTION 1
25
+ #define OPT_INLINE_CONST_CACHE 1
26
+
27
+
28
+ /* Build Options.
29
+ * You can't change these options at runtime.
30
+ */
31
+
32
+ /* C compiler depend */
33
+ #define OPT_DIRECT_THREADED_CODE 1
34
+ #define OPT_TOKEN_THREADED_CODE 0
35
+ #define OPT_CALL_THREADED_CODE 0
36
+
37
+ /* VM running option */
38
+ #define OPT_CHECKED_RUN 1
39
+ #define OPT_INLINE_METHOD_CACHE 1
40
+ #define OPT_BLOCKINLINING 0
41
+
42
+ /* architecture independent, affects generated code */
43
+ #define OPT_OPERANDS_UNIFICATION 0
44
+ #define OPT_INSTRUCTIONS_UNIFICATION 0
45
+ #define OPT_UNIFY_ALL_COMBINATION 0
46
+ #define OPT_STACK_CACHING 0
47
+
48
+ /* misc */
49
+ #define SUPPORT_JOKE 0
50
+
51
+ #endif /* RUBY_VM_OPTS_H */
@@ -0,0 +1,56 @@
1
+ #ifndef RUBY_ATOMIC_H
2
+ #define RUBY_ATOMIC_H
3
+
4
+ #ifdef _WIN32
5
+ #if defined _MSC_VER && _MSC_VER > 1200
6
+ #pragma intrinsic(_InterlockedOr)
7
+ #endif
8
+ typedef LONG rb_atomic_t;
9
+
10
+ # define ATOMIC_SET(var, val) InterlockedExchange(&(var), (val))
11
+ # define ATOMIC_INC(var) InterlockedIncrement(&(var))
12
+ # define ATOMIC_DEC(var) InterlockedDecrement(&(var))
13
+ #if defined __GNUC__
14
+ # define ATOMIC_OR(var, val) __asm__("lock\n\t" "orl\t%1, %0" : "=m"(var) : "Ir"(val))
15
+ #elif defined _MSC_VER && _MSC_VER <= 1200
16
+ # define ATOMIC_OR(var, val) rb_w32_atomic_or(&(var), (val))
17
+ static inline void
18
+ rb_w32_atomic_or(volatile rb_atomic_t *var, rb_atomic_t val)
19
+ {
20
+ #ifdef _M_IX86
21
+ __asm mov eax, var;
22
+ __asm mov ecx, val;
23
+ __asm lock or [eax], ecx;
24
+ #else
25
+ #error unsupported architecture
26
+ #endif
27
+ }
28
+ #else
29
+ # define ATOMIC_OR(var, val) _InterlockedOr(&(var), (val))
30
+ #endif
31
+ # define ATOMIC_EXCHANGE(var, val) InterlockedExchange(&(var), (val))
32
+
33
+ #elif defined HAVE_GCC_ATOMIC_BUILTINS
34
+ /* @shyouhei hack to support atomic operations in case of gcc. Gcc
35
+ * has its own pseudo-insns to support them. See info, or
36
+ * http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html */
37
+
38
+ typedef unsigned int rb_atomic_t; /* Anything OK */
39
+ # define ATOMIC_SET(var, val) __sync_lock_test_and_set(&(var), (val))
40
+ # define ATOMIC_INC(var) __sync_fetch_and_add(&(var), 1)
41
+ # define ATOMIC_DEC(var) __sync_fetch_and_sub(&(var), 1)
42
+ # define ATOMIC_OR(var, val) __sync_or_and_fetch(&(var), (val))
43
+ # define ATOMIC_EXCHANGE(var, val) __sync_lock_test_and_set(&(var), (val))
44
+
45
+ #else
46
+ typedef int rb_atomic_t;
47
+ extern rb_atomic_t ruby_atomic_exchange(rb_atomic_t *ptr, rb_atomic_t val);
48
+
49
+ # define ATOMIC_SET(var, val) ((var) = (val))
50
+ # define ATOMIC_INC(var) (++(var))
51
+ # define ATOMIC_DEC(var) (--(var))
52
+ # define ATOMIC_OR(var, val) ((var) |= (val))
53
+ # define ATOMIC_EXCHANGE(var, val) ruby_atomic_exchange(&(var), (val))
54
+ #endif
55
+
56
+ #endif /* RUBY_ATOMIC_H */
@@ -0,0 +1,34 @@
1
+ /**********************************************************************
2
+
3
+ constant.h -
4
+
5
+ $Author$
6
+ created at: Sun Nov 15 00:09:33 2009
7
+
8
+ Copyright (C) 2009 Yusuke Endoh
9
+
10
+ **********************************************************************/
11
+ #ifndef CONSTANT_H
12
+ #define CONSTANT_H
13
+
14
+ typedef enum {
15
+ CONST_PUBLIC = 0x00,
16
+ CONST_PRIVATE = 0x01
17
+ } rb_const_flag_t;
18
+
19
+ typedef struct rb_const_entry_struct {
20
+ rb_const_flag_t flag;
21
+ VALUE value; /* should be mark */
22
+ } rb_const_entry_t;
23
+
24
+ VALUE rb_mod_private_constant(int argc, VALUE *argv, VALUE obj);
25
+ VALUE rb_mod_public_constant(int argc, VALUE *argv, VALUE obj);
26
+ void rb_free_const_table(st_table *tbl);
27
+ VALUE rb_public_const_get(VALUE klass, ID id);
28
+ VALUE rb_public_const_get_at(VALUE klass, ID id);
29
+ VALUE rb_public_const_get_from(VALUE klass, ID id);
30
+ int rb_public_const_defined(VALUE klass, ID id);
31
+ int rb_public_const_defined_at(VALUE klass, ID id);
32
+ int rb_public_const_defined_from(VALUE klass, ID id);
33
+
34
+ #endif /* CONSTANT_H */
@@ -0,0 +1,41 @@
1
+ /**********************************************************************
2
+
3
+ debug.h - YARV Debug function interface
4
+
5
+ $Author$
6
+ created at: 04/08/25 02:33:49 JST
7
+
8
+ Copyright (C) 2004-2007 Koichi Sasada
9
+
10
+ **********************************************************************/
11
+
12
+ #ifndef RUBY_DEBUG_H
13
+ #define RUBY_DEBUG_H
14
+
15
+ #include "ruby/ruby.h"
16
+ #include "node.h"
17
+
18
+ #if defined __GNUC__ && __GNUC__ >= 4
19
+ #pragma GCC visibility push(default)
20
+ #endif
21
+
22
+ #define dpv(h,v) ruby_debug_print_value(-1, 0, (h), (v))
23
+ #define dp(v) ruby_debug_print_value(-1, 0, "", (v))
24
+ #define dpi(i) ruby_debug_print_id(-1, 0, "", (i))
25
+ #define dpn(n) ruby_debug_print_node(-1, 0, "", (n))
26
+
27
+ #define bp() ruby_debug_breakpoint()
28
+
29
+ VALUE ruby_debug_print_value(int level, int debug_level, const char *header, VALUE v);
30
+ ID ruby_debug_print_id(int level, int debug_level, const char *header, ID id);
31
+ NODE *ruby_debug_print_node(int level, int debug_level, const char *header, const NODE *node);
32
+ int ruby_debug_print_indent(int level, int debug_level, int indent_level);
33
+ void ruby_debug_breakpoint(void);
34
+ void ruby_debug_gc_check_func(void);
35
+ void ruby_set_debug_option(const char *str);
36
+
37
+ #if defined __GNUC__ && __GNUC__ >= 4
38
+ #pragma GCC visibility pop
39
+ #endif
40
+
41
+ #endif /* RUBY_DEBUG_H */
@@ -0,0 +1,234 @@
1
+ #ifndef RUBY_EVAL_INTERN_H
2
+ #define RUBY_EVAL_INTERN_H
3
+
4
+ #include "ruby/ruby.h"
5
+ #include "vm_core.h"
6
+
7
+ #define PASS_PASSED_BLOCK_TH(th) do { \
8
+ (th)->passed_block = GC_GUARDED_PTR_REF((rb_block_t *)(th)->cfp->lfp[0]); \
9
+ (th)->cfp->flag |= VM_FRAME_FLAG_PASSED; \
10
+ } while (0)
11
+
12
+ #define PASS_PASSED_BLOCK() do { \
13
+ rb_thread_t * const __th__ = GET_THREAD(); \
14
+ PASS_PASSED_BLOCK_TH(__th__); \
15
+ } while (0)
16
+
17
+ #ifdef HAVE_STDLIB_H
18
+ #include <stdlib.h>
19
+ #endif
20
+ #ifndef EXIT_SUCCESS
21
+ #define EXIT_SUCCESS 0
22
+ #endif
23
+ #ifndef EXIT_FAILURE
24
+ #define EXIT_FAILURE 1
25
+ #endif
26
+
27
+ #include <stdio.h>
28
+ #include <setjmp.h>
29
+
30
+ #ifdef __APPLE__
31
+ #include <crt_externs.h>
32
+ #endif
33
+
34
+ /* Make alloca work the best possible way. */
35
+ #ifdef __GNUC__
36
+ # ifndef atarist
37
+ # ifndef alloca
38
+ # define alloca __builtin_alloca
39
+ # endif
40
+ # endif /* atarist */
41
+ #else
42
+ # ifdef HAVE_ALLOCA_H
43
+ # include <alloca.h>
44
+ # else
45
+ # ifdef _AIX
46
+ #pragma alloca
47
+ # else
48
+ # ifndef alloca /* predefined by HP cc +Olibcalls */
49
+ void *alloca();
50
+ # endif
51
+ # endif /* AIX */
52
+ # endif /* HAVE_ALLOCA_H */
53
+ #endif /* __GNUC__ */
54
+
55
+ #ifndef HAVE_STRING_H
56
+ char *strrchr(const char *, const char);
57
+ #endif
58
+
59
+ #ifdef HAVE_UNISTD_H
60
+ #include <unistd.h>
61
+ #endif
62
+
63
+ #ifdef HAVE_NET_SOCKET_H
64
+ #include <net/socket.h>
65
+ #endif
66
+
67
+ #define ruby_setjmp(env) RUBY_SETJMP(env)
68
+ #define ruby_longjmp(env,val) RUBY_LONGJMP((env),(val))
69
+ #ifdef __CYGWIN__
70
+ # ifndef _setjmp
71
+ int _setjmp(jmp_buf);
72
+ # endif
73
+ # ifndef _longjmp
74
+ NORETURN(void _longjmp(jmp_buf, int));
75
+ # endif
76
+ #endif
77
+
78
+ #include <sys/types.h>
79
+ #include <signal.h>
80
+ #include <errno.h>
81
+
82
+ #ifdef HAVE_SYS_SELECT_H
83
+ #include <sys/select.h>
84
+ #endif
85
+
86
+ /*
87
+ Solaris sys/select.h switches select to select_large_fdset to support larger
88
+ file descriptors if FD_SETSIZE is larger than 1024 on 32bit environment.
89
+ But Ruby doesn't change FD_SETSIZE because fd_set is allocated dynamically.
90
+ So following definition is required to use select_large_fdset.
91
+ */
92
+ #ifdef HAVE_SELECT_LARGE_FDSET
93
+ #define select(n, r, w, e, t) select_large_fdset((n), (r), (w), (e), (t))
94
+ extern int select_large_fdset(int, fd_set *, fd_set *, fd_set *, struct timeval *);
95
+ #endif
96
+
97
+ #ifdef HAVE_SYS_PARAM_H
98
+ #include <sys/param.h>
99
+ #endif
100
+
101
+ #include <sys/stat.h>
102
+
103
+ #define SAVE_ROOT_JMPBUF(th, stmt) do \
104
+ if (ruby_setjmp((th)->root_jmpbuf) == 0) { \
105
+ stmt; \
106
+ } \
107
+ else { \
108
+ rb_fiber_start(); \
109
+ } while (0)
110
+
111
+ #define TH_PUSH_TAG(th) do { \
112
+ rb_thread_t * const _th = (th); \
113
+ struct rb_vm_tag _tag; \
114
+ _tag.tag = 0; \
115
+ _tag.prev = _th->tag; \
116
+ _th->tag = &_tag;
117
+
118
+ #define TH_POP_TAG() \
119
+ _th->tag = _tag.prev; \
120
+ } while (0)
121
+
122
+ #define TH_POP_TAG2() \
123
+ _th->tag = _tag.prev
124
+
125
+ #define PUSH_TAG() TH_PUSH_TAG(GET_THREAD())
126
+ #define POP_TAG() TH_POP_TAG()
127
+
128
+ #define TH_EXEC_TAG() ruby_setjmp(_th->tag->buf)
129
+
130
+ #define EXEC_TAG() \
131
+ TH_EXEC_TAG()
132
+
133
+ #define TH_JUMP_TAG(th, st) do { \
134
+ ruby_longjmp((th)->tag->buf,(st)); \
135
+ } while (0)
136
+
137
+ #define JUMP_TAG(st) TH_JUMP_TAG(GET_THREAD(), (st))
138
+
139
+ #define INTERNAL_EXCEPTION_P(exc) FIXNUM_P(exc)
140
+
141
+ enum ruby_tag_type {
142
+ RUBY_TAG_RETURN = 0x1,
143
+ RUBY_TAG_BREAK = 0x2,
144
+ RUBY_TAG_NEXT = 0x3,
145
+ RUBY_TAG_RETRY = 0x4,
146
+ RUBY_TAG_REDO = 0x5,
147
+ RUBY_TAG_RAISE = 0x6,
148
+ RUBY_TAG_THROW = 0x7,
149
+ RUBY_TAG_FATAL = 0x8,
150
+ RUBY_TAG_MASK = 0xf
151
+ };
152
+ #define TAG_RETURN RUBY_TAG_RETURN
153
+ #define TAG_BREAK RUBY_TAG_BREAK
154
+ #define TAG_NEXT RUBY_TAG_NEXT
155
+ #define TAG_RETRY RUBY_TAG_RETRY
156
+ #define TAG_REDO RUBY_TAG_REDO
157
+ #define TAG_RAISE RUBY_TAG_RAISE
158
+ #define TAG_THROW RUBY_TAG_THROW
159
+ #define TAG_FATAL RUBY_TAG_FATAL
160
+ #define TAG_MASK RUBY_TAG_MASK
161
+
162
+ #define NEW_THROW_OBJECT(val, pt, st) \
163
+ ((VALUE)rb_node_newnode(NODE_LIT, (VALUE)(val), (VALUE)(pt), (VALUE)(st)))
164
+ #define SET_THROWOBJ_CATCH_POINT(obj, val) \
165
+ (RNODE((obj))->u2.value = (val))
166
+ #define SET_THROWOBJ_STATE(obj, val) \
167
+ (RNODE((obj))->u3.value = (val))
168
+
169
+ #define GET_THROWOBJ_VAL(obj) ((VALUE)RNODE((obj))->u1.value)
170
+ #define GET_THROWOBJ_CATCH_POINT(obj) ((VALUE*)RNODE((obj))->u2.value)
171
+ #define GET_THROWOBJ_STATE(obj) ((int)RNODE((obj))->u3.value)
172
+
173
+ #define SCOPE_TEST(f) (rb_vm_cref()->nd_visi & (f))
174
+ #define SCOPE_CHECK(f) (rb_vm_cref()->nd_visi == (f))
175
+ #define SCOPE_SET(f) (rb_vm_cref()->nd_visi = (f))
176
+
177
+ #define CHECK_STACK_OVERFLOW(cfp, margin) do \
178
+ if ((VALUE *)((char *)(((VALUE *)(cfp)->sp) + (margin)) + sizeof(rb_control_frame_t)) >= ((VALUE *)(cfp))) { \
179
+ rb_exc_raise(sysstack_error); \
180
+ } \
181
+ while (0)
182
+
183
+ void rb_thread_cleanup(void);
184
+ void rb_thread_wait_other_threads(void);
185
+
186
+ enum {
187
+ RAISED_EXCEPTION = 1,
188
+ RAISED_STACKOVERFLOW = 2,
189
+ RAISED_NOMEMORY = 4
190
+ };
191
+ int rb_threadptr_set_raised(rb_thread_t *th);
192
+ int rb_threadptr_reset_raised(rb_thread_t *th);
193
+ #define rb_thread_raised_set(th, f) ((th)->raised_flag |= (f))
194
+ #define rb_thread_raised_reset(th, f) ((th)->raised_flag &= ~(f))
195
+ #define rb_thread_raised_p(th, f) (((th)->raised_flag & (f)) != 0)
196
+ #define rb_thread_raised_clear(th) ((th)->raised_flag = 0)
197
+
198
+ VALUE rb_f_eval(int argc, VALUE *argv, VALUE self);
199
+ VALUE rb_make_exception(int argc, VALUE *argv);
200
+
201
+ NORETURN(void rb_fiber_start(void));
202
+
203
+ NORETURN(void rb_print_undef(VALUE, ID, int));
204
+ NORETURN(void rb_vm_localjump_error(const char *,VALUE, int));
205
+ NORETURN(void rb_vm_jump_tag_but_local_jump(int, VALUE));
206
+ NORETURN(void rb_raise_method_missing(rb_thread_t *th, int argc, VALUE *argv,
207
+ VALUE obj, int call_status));
208
+
209
+ VALUE rb_vm_make_jump_tag_but_local_jump(int state, VALUE val);
210
+ NODE *rb_vm_cref(void);
211
+ VALUE rb_vm_call_cfunc(VALUE recv, VALUE (*func)(VALUE), VALUE arg, const rb_block_t *blockptr, VALUE filename);
212
+ void rb_vm_set_progname(VALUE filename);
213
+ void rb_thread_terminate_all(void);
214
+ VALUE rb_vm_top_self();
215
+ VALUE rb_vm_cbase(void);
216
+ void rb_trap_restore_mask(void);
217
+
218
+ #ifndef CharNext /* defined as CharNext[AW] on Windows. */
219
+ #define CharNext(p) ((p) + mblen((p), RUBY_MBCHAR_MAXSIZE))
220
+ #endif
221
+
222
+ #if defined DOSISH || defined __CYGWIN__
223
+ static inline void
224
+ translit_char(char *p, int from, int to)
225
+ {
226
+ while (*p) {
227
+ if ((unsigned char)*p == from)
228
+ *p = to;
229
+ p = CharNext(p);
230
+ }
231
+ }
232
+ #endif
233
+
234
+ #endif /* RUBY_EVAL_INTERN_H */