(linenum→info "unix/slp.c:2238")

ruby/1.9.0/compile.h

    1: /**********************************************************************
    2: 
    3:   compile.h -
    4: 
    5:   $Author: ko1 $
    6:   $Date: 2007-11-14 07:13:04 +0900 (Wed, 14 Nov 2007) $
    7:   created at: 04/01/01 23:36:57 JST
    8: 
    9:   Copyright (C) 2004-2007 Koichi Sasada
   10: 
   11: **********************************************************************/
   12: 
   13: #ifndef RUBY_COMPILE_H
   14: #define RUBY_COMPILE_H
   15: 
   16: /*  */
   17: /**
   18:  * debug function(macro) interface depend on CPDEBUG
   19:  *
   20:  * debug level:
   21:  *  0: no debug output
   22:  *  1: show node type
   23:  *  2: show node important parameters
   24:  *  ...
   25:  *  5: show other parameters
   26:  * 10: show every AST array
   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: /* create new label */
  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: /* add instructions */
  116: #define ADD_SEQ(seq1, seq2) \
  117:   APPEND_LIST(seq1, seq2)
  118: 
  119: /* add an instruction */
  120: #define ADD_INSN(seq, line, insn) \
  121:   ADD_ELEM(seq, (LINK_ELEMENT *) new_insn_body(iseq, line, BIN(insn), 0))
  122: 
  123: /* add an instruction with label operand */
  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: /* add an instruction with some operands (1, 2, 3, 5) */
  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: /* Specific Insn factory */
  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: /* add label */
  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: /* compile node */
  175: #define COMPILE(anchor, desc, node) \
  176:   (debug_compile("== " desc "\n", \
  177:                  iseq_compile_each(iseq, anchor, node, 0)))
  178: 
  179: /* compile node, this node's value will be poped */
  180: #define COMPILE_POPED(anchor, desc, node)    \
  181:   (debug_compile("== " desc "\n", \
  182:                  iseq_compile_each(iseq, anchor, node, 1)))
  183: 
  184: /* compile node, which is poped when 'poped' is true */
  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: /* error */
  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: /* leave name uninitialized so that compiler warn if INIT_ANCHOR is
  216:  * missing */
  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 /* RUBY_COMPILE_H */
Syntax (Markdown)