pline 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +134 -0
- data/ext/pline/depend +55 -0
- data/ext/pline/extconf.rb +14 -0
- data/ext/pline/iseq.c +124 -0
- data/ext/pline/minfo.c +167 -0
- data/ext/pline/pline.c.rb +68 -0
- data/ext/pline/profiler.c +125 -0
- data/ext/pline/ruby_source/1.9.2/debug.h +36 -0
- data/ext/pline/ruby_source/1.9.2/eval_intern.h +232 -0
- data/ext/pline/ruby_source/1.9.2/gc.h +77 -0
- data/ext/pline/ruby_source/1.9.2/id.h +170 -0
- data/ext/pline/ruby_source/1.9.2/insns.inc +179 -0
- data/ext/pline/ruby_source/1.9.2/insns_info.inc +695 -0
- data/ext/pline/ruby_source/1.9.2/iseq.h +104 -0
- data/ext/pline/ruby_source/1.9.2/manual_update.h +19 -0
- data/ext/pline/ruby_source/1.9.2/method.h +103 -0
- data/ext/pline/ruby_source/1.9.2/node.h +483 -0
- data/ext/pline/ruby_source/1.9.2/thread_pthread.h +27 -0
- data/ext/pline/ruby_source/1.9.2/thread_win32.h +33 -0
- data/ext/pline/ruby_source/1.9.2/vm_core.h +706 -0
- data/ext/pline/ruby_source/1.9.2/vm_exec.h +184 -0
- data/ext/pline/ruby_source/1.9.2/vm_insnhelper.c +1734 -0
- data/ext/pline/ruby_source/1.9.2/vm_insnhelper.h +208 -0
- data/ext/pline/ruby_source/1.9.2/vm_opts.h +51 -0
- data/ext/pline/ruby_source/1.9.3/atomic.h +56 -0
- data/ext/pline/ruby_source/1.9.3/constant.h +34 -0
- data/ext/pline/ruby_source/1.9.3/debug.h +41 -0
- data/ext/pline/ruby_source/1.9.3/eval_intern.h +234 -0
- data/ext/pline/ruby_source/1.9.3/gc.h +98 -0
- data/ext/pline/ruby_source/1.9.3/id.h +175 -0
- data/ext/pline/ruby_source/1.9.3/insns.inc +179 -0
- data/ext/pline/ruby_source/1.9.3/insns_info.inc +695 -0
- data/ext/pline/ruby_source/1.9.3/internal.h +227 -0
- data/ext/pline/ruby_source/1.9.3/iseq.h +125 -0
- data/ext/pline/ruby_source/1.9.3/manual_update.h +19 -0
- data/ext/pline/ruby_source/1.9.3/method.h +105 -0
- data/ext/pline/ruby_source/1.9.3/node.h +503 -0
- data/ext/pline/ruby_source/1.9.3/thread_pthread.h +51 -0
- data/ext/pline/ruby_source/1.9.3/thread_win32.h +40 -0
- data/ext/pline/ruby_source/1.9.3/vm_core.h +756 -0
- data/ext/pline/ruby_source/1.9.3/vm_exec.h +184 -0
- data/ext/pline/ruby_source/1.9.3/vm_insnhelper.c +1749 -0
- data/ext/pline/ruby_source/1.9.3/vm_insnhelper.h +220 -0
- data/ext/pline/ruby_source/1.9.3/vm_opts.h +51 -0
- data/ext/pline/sinfo.c +311 -0
- data/lib/pline.rb +11 -0
- data/lib/pline/minfo.rb +22 -0
- data/lib/pline/summarize.rb +127 -0
- data/lib/pline/util.rb +54 -0
- data/pline.gemspec +28 -0
- 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 */
|