1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13: #ifndef RUBY_COMPILE_H
14: #define RUBY_COMPILE_H
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29: #ifndef CPDEBUG
30: #define CPDEBUG 0
31: #endif
32:
33: #if 0
34: #undef CPDEBUG
35: #define CPDEBUG 2
36: #endif
37:
38: NORETURN(PRINTF_ARGS(void rb_compile_bug(const char*, int, const char*, ...), 3, 4));
39:
40: #if CPDEBUG > 0
41:
42: #define debugp(header, value) \
43: (ruby_debug_print_indent(0, CPDEBUG, gl_node_level * 2), \
44: ruby_debug_print_value(0, CPDEBUG, header, value))
45:
46: #define debugi(header, id) \
47: (ruby_debug_print_indent(0, CPDEBUG, gl_node_level * 2), \
48: ruby_debug_print_id(0, CPDEBUG, header, id))
49:
50: #define debugp_param(header, value) \
51: (ruby_debug_print_indent(1, CPDEBUG, gl_node_level * 2), \
52: ruby_debug_print_value(1, CPDEBUG, header, value))
53:
54: #define debugp_verbose(header, value) \
55: (ruby_debug_print_indent(2, CPDEBUG, gl_node_level * 2), \
56: ruby_debug_print_value(2, CPDEBUG, header, value))
57:
58: #define debugp_verbose_node(header, value) \
59: (ruby_debug_print_indent(10, CPDEBUG, gl_node_level * 2), \
60: ruby_debug_print_value(10, CPDEBUG, header, value))
61:
62: #define debug_node_start(node) \
63: (ruby_debug_print_indent(-1, CPDEBUG, gl_node_level*2), \
64: ruby_debug_print_node(1, CPDEBUG, "", (NODE *)node), gl_node_level++) \
65:
66: #define debug_node_end() gl_node_level --;
67:
68: #else
69:
70: static inline ID
71: r_id(ID id)
72: {
73: return id;
74: }
75:
76: static inline VALUE
77: r_value(VALUE value)
78: {
79: return value;
80: }
81:
82: #define debugi(header, id) r_id(id)
83: #define debugp(header, value) r_value(value)
84: #define debugp_verbose(header, value) r_value(value)
85: #define debugp_verbose_node(header, value) r_value(value)
86: #define debugp_param(header, value) r_value(value)
87: #define debug_node_start(node)
88: #define debug_node_end()
89: #endif
90:
91: #if CPDEBUG > 1
92: #define debugs ruby_debug_print_indent(-1, CPDEBUG, gl_node_level*2), printf
93: #define debug_compile(msg, v) (ruby_debug_print_indent(-1, CPDEBUG, gl_node_level*2), printf("%s", msg), (v))
94: #else
95: #define debugs if(0)printf
96: #define debug_compile(msg, v) (v)
97: #endif
98:
99:
100:
101: #define NEW_LABEL(l) new_label_body(iseq, l)
102:
103: #define iseq_filename(iseq) \
104: (((rb_iseq_t*)DATA_PTR(iseq))->filename)
105:
106: #define NEW_ISEQVAL(node, name, type) \
107: new_child_iseq(iseq, node, name, 0, type)
108:
109: #define NEW_CHILD_ISEQVAL(node, name, type) \
110: new_child_iseq(iseq, node, name, iseq->self, type)
111:
112: #define NEW_SPECIAQL_BLOCK_ISEQVAL(iseq, sym) \
113: new_child_iseq(iseq, iseq->node, iseq->name, iseq->parent_iseq, iseq->type, sym)
114:
115:
116: #define ADD_SEQ(seq1, seq2) \
117: APPEND_LIST(seq1, seq2)
118:
119:
120: #define ADD_INSN(seq, line, insn) \
121: ADD_ELEM(seq, (LINK_ELEMENT *) new_insn_body(iseq, line, BIN(insn), 0))
122:
123:
124: #define ADD_INSNL(seq, line, insn, label) \
125: ADD_ELEM(seq, (LINK_ELEMENT *) \
126: new_insn_body(iseq, line, BIN(insn), 1, (VALUE)label))
127:
128:
129: #define ADD_INSN1(seq, line, insn, op1) \
130: ADD_ELEM(seq, (LINK_ELEMENT *) \
131: new_insn_body(iseq, line, BIN(insn), 1, (VALUE)op1))
132:
133: #define ADD_INSN2(seq, line, insn, op1, op2) \
134: ADD_ELEM(seq, (LINK_ELEMENT *) \
135: new_insn_body(iseq, line, BIN(insn), 2, (VALUE)op1, (VALUE)op2))
136:
137: #define ADD_INSN3(seq, line, insn, op1, op2, op3) \
138: ADD_ELEM(seq, (LINK_ELEMENT *) \
139: new_insn_body(iseq, line, BIN(insn), 3, (VALUE)op1, (VALUE)op2, (VALUE)op3))
140:
141:
142: #define ADD_SEND(seq, line, id, argc) \
143: ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)INT2FIX(0))
144:
145: #define ADD_CALL_RECEIVER(seq, line) \
146: ADD_INSN(seq, line, putnil)
147:
148: #define ADD_CALL(seq, line, id, argc) \
149: ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)INT2FIX(VM_CALL_FCALL_BIT))
150:
151: #define ADD_CALL_WITH_BLOCK(seq, line, id, argc, block) \
152: ADD_SEND_R(seq, line, id, argc, block, (VALUE)INT2FIX(VM_CALL_FCALL_BIT))
153:
154: #define ADD_SEND_R(seq, line, id, argc, block, flag) \
155: ADD_ELEM(seq, (LINK_ELEMENT *) \
156: new_insn_send(iseq, line, \
157: (VALUE)id, (VALUE)argc, (VALUE)block, (VALUE)flag))
158:
159: #define ADD_TRACE(seq, line, event) \
160: if (iseq->compile_data->option->trace_instruction) { \
161: ADD_INSN1(seq, line, trace, INT2FIX(event)); \
162: }
163:
164:
165: #define ADD_LABEL(seq, label) \
166: ADD_ELEM(seq, (LINK_ELEMENT *)label)
167:
168: #define ADD_CATCH_ENTRY(type, ls, le, iseqv, lc) \
169: (rb_ary_push(iseq->compile_data->catch_table_ary, \
170: rb_ary_new3(5, type, \
171: (VALUE)(ls) | 1, (VALUE)(le) | 1, \
172: iseqv, (VALUE)(lc) | 1)))
173:
174:
175: #define COMPILE(anchor, desc, node) \
176: (debug_compile("== " desc "\n", \
177: iseq_compile_each(iseq, anchor, node, 0)))
178:
179:
180: #define COMPILE_POPED(anchor, desc, node) \
181: (debug_compile("== " desc "\n", \
182: iseq_compile_each(iseq, anchor, node, 1)))
183:
184:
185: #define COMPILE_(anchor, desc, node, poped) \
186: (debug_compile("== " desc "\n", \
187: iseq_compile_each(iseq, anchor, node, poped)))
188:
189: #define OPERAND_AT(insn, idx) \
190: (((INSN*)(insn))->operands[idx])
191:
192: #define INSN_OF(insn) \
193: (((INSN*)(insn))->insn_id)
194:
195:
196: #define COMPILE_ERROR(strs) \
197: { \
198: VALUE tmp = GET_THREAD()->errinfo; \
199: if(CPDEBUG)rb_bug strs; \
200: GET_THREAD()->errinfo = iseq->compile_data->err_info; \
201: rb_compile_error strs; \
202: iseq->compile_data->err_info = GET_THREAD()->errinfo; \
203: GET_THREAD()->errinfo = tmp; \
204: ret = 0; \
205: break; \
206: }
207:
208: #define ERROR_ARGS (node)->nd_file, nd_line(node),
209:
210:
211: #define COMPILE_OK 1
212: #define COMPILE_NG 0
213:
214:
215:
216:
217: #define DECL_ANCHOR(name) \
218: LINK_ANCHOR *name, name##_body__ = {{0,},}
219: #define INIT_ANCHOR(name) \
220: (name##_body__.last = &name##_body__.anchor, name = &name##_body__)
221:
222: #endif