Data Structures | Defines | Typedefs | Functions | Variables

compile.c File Reference

#include "ruby/ruby.h"
#include "vm_core.h"
#include "iseq.h"
#include "insns.inc"
#include "insns_info.inc"
#include "optinsn.inc"
Include dependency graph for compile.c:

Go to the source code of this file.

Data Structures

struct  iseq_link_element
struct  iseq_link_anchor
struct  iseq_label_data
struct  iseq_insn_data
struct  iseq_adjust_data
struct  ensure_range
struct  iseq_compile_data_ensure_node_stack

Defines

#define USE_INSN_STACK_INCREASE   1
#define numberof(array)   (int)(sizeof(array) / sizeof((array)[0]))
#define FIXNUM_INC(n, i)   ((n)+(INT2FIX(i)&~FIXNUM_FLAG))
#define FIXNUM_OR(n, i)   ((n)|INT2FIX(i))
#define CPDEBUG   0
 debug function(macro) interface depend on CPDEBUG if it is less than 0, runtime option is in effect.
#define compile_debug   CPDEBUG
#define debugi(header, id)   r_id(id)
#define debugp(header, value)   r_value(value)
#define debugp_verbose(header, value)   r_value(value)
#define debugp_verbose_node(header, value)   r_value(value)
#define debugp_param(header, value)   r_value(value)
#define debug_node_start(node)   ((void)0)
#define debug_node_end()   ((void)0)
#define debugs   if(0)printf
#define debug_compile(msg, v)   (v)
#define NEW_LABEL(l)   new_label_body(iseq, l)
#define iseq_filename(iseq)   (((rb_iseq_t*)DATA_PTR(iseq))->filename)
#define iseq_filepath(iseq)   (((rb_iseq_t*)DATA_PTR(iseq))->filepath)
#define NEW_ISEQVAL(node, name, type, line_no)   new_child_iseq(iseq, node, name, 0, type, line_no)
#define NEW_CHILD_ISEQVAL(node, name, type, line_no)   new_child_iseq(iseq, node, name, iseq->self, type, line_no)
#define ADD_SEQ(seq1, seq2)   APPEND_LIST(seq1, seq2)
#define ADD_INSN(seq, line, insn)   ADD_ELEM(seq, (LINK_ELEMENT *) new_insn_body(iseq, line, BIN(insn), 0))
#define ADD_INSNL(seq, line, insn, label)
#define ADD_INSN1(seq, line, insn, op1)
#define ADD_INSN2(seq, line, insn, op1, op2)
#define ADD_INSN3(seq, line, insn, op1, op2, op3)
#define ADD_SEND(seq, line, id, argc)   ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)INT2FIX(0))
#define ADD_CALL_RECEIVER(seq, line)   ADD_INSN(seq, line, putnil)
#define ADD_CALL(seq, line, id, argc)   ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)INT2FIX(VM_CALL_FCALL_BIT))
#define ADD_CALL_WITH_BLOCK(seq, line, id, argc, block)   ADD_SEND_R(seq, line, id, argc, block, (VALUE)INT2FIX(VM_CALL_FCALL_BIT))
#define ADD_SEND_R(seq, line, id, argc, block, flag)
#define ADD_TRACE(seq, line, event)
#define ADD_LABEL(seq, label)   ADD_ELEM(seq, (LINK_ELEMENT *) label)
#define ADD_ADJUST(seq, line, label)   ADD_ELEM(seq, (LINK_ELEMENT *) new_adjust_body(iseq, label, line))
#define ADD_ADJUST_RESTORE(seq, label)   ADD_ELEM(seq, (LINK_ELEMENT *) new_adjust_body(iseq, label, -1))
#define ADD_CATCH_ENTRY(type, ls, le, iseqv, lc)
#define COMPILE(anchor, desc, node)
#define COMPILE_POPED(anchor, desc, node)
#define COMPILE_(anchor, desc, node, poped)
#define OPERAND_AT(insn, idx)   (((INSN*)(insn))->operands[idx])
#define INSN_OF(insn)   (((INSN*)(insn))->insn_id)
#define COMPILE_ERROR(strs)
#define ERROR_ARGS   ruby_sourcefile, nd_line(node),
#define COMPILE_OK   1
#define COMPILE_NG   0
#define DECL_ANCHOR(name)   LINK_ANCHOR *name, name##_body__ = {{0,},}
#define INIT_ANCHOR(name)   (name##_body__.last = &name##_body__.anchor, name = &name##_body__)
#define hide_obj(obj)   do {OBJ_FREEZE(obj); RBASIC(obj)->klass = 0;} while (0)
#define ISEQ_ARG
#define ISEQ_ARG_DECLARE
#define ruby_sourcefile   RSTRING_PTR(iseq->filename)
#define MEMORY(v)
#define BUFSIZE   0x100
#define rb_intern(str)   rb_intern_const(str)
#define CHECK_ARRAY(v)   rb_convert_type(v, T_ARRAY, "Array", "to_ary")
#define CHECK_STRING(v)   rb_convert_type(v, T_STRING, "String", "to_str")
#define CHECK_SYMBOL(v)   rb_convert_type(v, T_SYMBOL, "Symbol", "to_sym")

Typedefs

typedef struct iseq_link_element LINK_ELEMENT
typedef struct iseq_link_anchor LINK_ANCHOR
typedef struct iseq_label_data LABEL
typedef struct iseq_insn_data INSN
typedef struct iseq_adjust_data ADJUST

Functions

 NORETURN (PRINTF_ARGS(void rb_compile_bug(const char *, int, const char *,...), 3, 4))
static ID r_id (ID id)
static VALUE r_value (VALUE value)
static void dump_disasm_list (LINK_ELEMENT *elem)
static int insn_data_length (INSN *iobj)
static int insn_data_line_no (INSN *iobj)
static int calc_sp_depth (int depth, INSN *iobj)
static void ADD_ELEM (ISEQ_ARG_DECLARE LINK_ANCHOR *anchor, LINK_ELEMENT *elem)
static INSNnew_insn_body (rb_iseq_t *iseq, int line_no, int insn_id, int argc,...)
static LABELnew_label_body (rb_iseq_t *iseq, long line)
static ADJUSTnew_adjust_body (rb_iseq_t *iseq, LABEL *label, int line)
static int iseq_compile_each (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int poped)
 compile each node
static int iseq_setup (rb_iseq_t *iseq, LINK_ANCHOR *anchor)
static int iseq_optimize (rb_iseq_t *iseq, LINK_ANCHOR *anchor)
static int iseq_insns_unification (rb_iseq_t *iseq, LINK_ANCHOR *anchor)
static int iseq_set_local_table (rb_iseq_t *iseq, ID *tbl)
static int iseq_set_exception_local_table (rb_iseq_t *iseq)
static int iseq_set_arguments (rb_iseq_t *iseq, LINK_ANCHOR *anchor, NODE *node)
static int iseq_set_sequence_stackcaching (rb_iseq_t *iseq, LINK_ANCHOR *anchor)
static int iseq_set_sequence (rb_iseq_t *iseq, LINK_ANCHOR *anchor)
 ruby insn object array -> raw instruction sequence
static int iseq_set_exception_table (rb_iseq_t *iseq)
static int iseq_set_optargs_table (rb_iseq_t *iseq)
static void verify_list (ISEQ_ARG_DECLARE const char *info, LINK_ANCHOR *anchor)
static int iseq_add_mark_object (rb_iseq_t *iseq, VALUE v)
static int iseq_add_mark_object_compile_time (rb_iseq_t *iseq, VALUE v)
VALUE rb_iseq_compile_node (VALUE self, NODE *node)
int rb_iseq_translate_threaded_code (rb_iseq_t *iseq)
static void * compile_data_alloc (rb_iseq_t *iseq, size_t size)
static INSNcompile_data_alloc_insn (rb_iseq_t *iseq)
static LABELcompile_data_alloc_label (rb_iseq_t *iseq)
static ADJUSTcompile_data_alloc_adjust (rb_iseq_t *iseq)
static void INSERT_ELEM_NEXT (LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
static void REPLACE_ELEM (LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
static void REMOVE_ELEM (LINK_ELEMENT *elem)
static LINK_ELEMENTFIRST_ELEMENT (LINK_ANCHOR *anchor)
static LINK_ELEMENTPOP_ELEMENT (ISEQ_ARG_DECLARE LINK_ANCHOR *anchor)
static int LIST_SIZE_ZERO (LINK_ANCHOR *anchor)
static void APPEND_LIST (ISEQ_ARG_DECLARE LINK_ANCHOR *anc1, LINK_ANCHOR *anc2)
static void INSERT_LIST (ISEQ_ARG_DECLARE LINK_ANCHOR *anc1, LINK_ANCHOR *anc2)
static INSNnew_insn_core (rb_iseq_t *iseq, int line_no, int insn_id, int argc, VALUE *argv)
static INSNnew_insn_send (rb_iseq_t *iseq, int line_no, VALUE id, VALUE argc, VALUE block, VALUE flag)
static VALUE new_child_iseq (rb_iseq_t *iseq, NODE *node, VALUE name, VALUE parent, VALUE type, int line_no)
static int get_dyna_var_idx_at_raw (rb_iseq_t *iseq, ID id)
static int get_local_var_idx (rb_iseq_t *iseq, ID id)
static int get_dyna_var_idx (rb_iseq_t *iseq, ID id, int *level, int *ls)
static int cdhash_cmp (VALUE val, VALUE lit)
static st_index_t cdhash_hash (VALUE a)
static int label_get_position (LABEL *lobj)
static int label_get_sp (LABEL *lobj)
static LINK_ELEMENTget_destination_insn (INSN *iobj)
static LINK_ELEMENTget_next_insn (INSN *iobj)
static LINK_ELEMENTget_prev_insn (INSN *iobj)
static int iseq_peephole_optimize (rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcallopt)
static int insn_set_specialized_instruction (rb_iseq_t *iseq, INSN *iobj, int insn_id)
static int iseq_specialized_instruction (rb_iseq_t *iseq, INSN *iobj)
static int compile_dstr_fragments (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int *cntp)
static int compile_dstr (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node)
static int compile_dregx (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node)
static int compile_branch_condition (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *cond, LABEL *then_label, LABEL *else_label)
static int compile_array_ (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node_root, VALUE opt_p, int poped)
static VALUE compile_array (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node_root, VALUE opt_p)
static VALUE case_when_optimizable_literal (NODE *node)
static VALUE when_vals (rb_iseq_t *iseq, LINK_ANCHOR *cond_seq, NODE *vals, LABEL *l1, VALUE special_literals)
static int compile_massign_lhs (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node)
static void compile_massign_opt_lhs (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *lhsn)
static int compile_massign_opt (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *rhsn, NODE *orig_lhsn)
static int compile_massign (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int poped)
static int compile_colon2 (rb_iseq_t *iseq, NODE *node, LINK_ANCHOR *pref, LINK_ANCHOR *body)
static VALUE compile_cpath (LINK_ANCHOR *ret, rb_iseq_t *iseq, NODE *cpath)
static int defined_expr (rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, LABEL **lfinish, VALUE needstr)
static VALUE make_name_for_block (rb_iseq_t *iseq)
static void push_ensure_entry (rb_iseq_t *iseq, struct iseq_compile_data_ensure_node_stack *enl, struct ensure_range *er, NODE *node)
static void add_ensure_range (rb_iseq_t *iseq, struct ensure_range *erange, LABEL *lstart, LABEL *lend)
static void add_ensure_iseq (LINK_ANCHOR *ret, rb_iseq_t *iseq, int is_return)
static VALUE setup_args (rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned long *flag)
static VALUE insn_data_to_s_detail (INSN *iobj)
VALUE rb_insns_name_array (void)
static LABELregister_label (rb_iseq_t *iseq, struct st_table *labels_table, VALUE obj)
static VALUE get_exception_sym2type (VALUE sym)
static int iseq_build_exception (rb_iseq_t *iseq, struct st_table *labels_table, VALUE exception)
static struct st_tableinsn_make_insn_table (void)
static int iseq_build_body (rb_iseq_t *iseq, LINK_ANCHOR *anchor, VALUE body, struct st_table *labels_table)
static VALUE CHECK_INTEGER (VALUE v)
VALUE rb_iseq_build_from_ary (rb_iseq_t *iseq, VALUE locals, VALUE args, VALUE exception, VALUE body)
int rb_dvar_defined (ID id)
int rb_local_defined (ID id)
int rb_parse_in_eval (void)
int rb_parse_in_main (void)

Variables

static struct st_hash_type cdhash_type

Define Documentation

#define ADD_ADJUST (   seq,
  line,
  label 
)    ADD_ELEM(seq, (LINK_ELEMENT *) new_adjust_body(iseq, label, line))

Definition at line 242 of file compile.c.

Referenced by iseq_compile_each().

#define ADD_ADJUST_RESTORE (   seq,
  label 
)    ADD_ELEM(seq, (LINK_ELEMENT *) new_adjust_body(iseq, label, -1))

Definition at line 245 of file compile.c.

Referenced by iseq_compile_each().

#define ADD_CALL (   seq,
  line,
  id,
  argc 
)    ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)INT2FIX(VM_CALL_FCALL_BIT))

Definition at line 214 of file compile.c.

Referenced by iseq_compile_each().

#define ADD_CALL_RECEIVER (   seq,
  line 
)    ADD_INSN(seq, line, putnil)

Definition at line 211 of file compile.c.

Referenced by iseq_compile_each().

#define ADD_CALL_WITH_BLOCK (   seq,
  line,
  id,
  argc,
  block 
)    ADD_SEND_R(seq, line, id, argc, block, (VALUE)INT2FIX(VM_CALL_FCALL_BIT))

Definition at line 217 of file compile.c.

Referenced by iseq_compile_each().

#define ADD_CATCH_ENTRY (   type,
  ls,
  le,
  iseqv,
  lc 
)
Value:
(rb_ary_push(iseq->compile_data->catch_table_ary,               \
                 rb_ary_new3(5, type,                           \
                             (VALUE)(ls) | 1, (VALUE)(le) | 1,  \
                             iseqv, (VALUE)(lc) | 1)))

Definition at line 248 of file compile.c.

Referenced by defined_expr(), iseq_build_exception(), iseq_compile_each(), and rb_iseq_compile_node().

#define ADD_INSN (   seq,
  line,
  insn 
)    ADD_ELEM(seq, (LINK_ELEMENT *) new_insn_body(iseq, line, BIN(insn), 0))
#define ADD_INSN1 (   seq,
  line,
  insn,
  op1 
)
#define ADD_INSN2 (   seq,
  line,
  insn,
  op1,
  op2 
)
Value:
ADD_ELEM(seq, (LINK_ELEMENT *) \
           new_insn_body(iseq, line, BIN(insn), 2, (VALUE)op1, (VALUE)op2))

Definition at line 199 of file compile.c.

Referenced by compile_dregx(), compile_massign(), iseq_compile_each(), and rb_iseq_compile_node().

#define ADD_INSN3 (   seq,
  line,
  insn,
  op1,
  op2,
  op3 
)
Value:
ADD_ELEM(seq, (LINK_ELEMENT *) \
           new_insn_body(iseq, line, BIN(insn), 3, (VALUE)op1, (VALUE)op2, (VALUE)op3))

Definition at line 203 of file compile.c.

Referenced by defined_expr(), and iseq_compile_each().

#define ADD_INSNL (   seq,
  line,
  insn,
  label 
)
Value:
ADD_ELEM(seq, (LINK_ELEMENT *) \
           new_insn_body(iseq, line, BIN(insn), 1, (VALUE)label))

Definition at line 190 of file compile.c.

Referenced by compile_branch_condition(), defined_expr(), iseq_compile_each(), and when_vals().

#define ADD_LABEL (   seq,
  label 
)    ADD_ELEM(seq, (LINK_ELEMENT *) label)
#define ADD_SEND (   seq,
  line,
  id,
  argc 
)    ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)INT2FIX(0))

Definition at line 208 of file compile.c.

Referenced by iseq_compile_each(), and when_vals().

#define ADD_SEND_R (   seq,
  line,
  id,
  argc,
  block,
  flag 
)
Value:
ADD_ELEM(seq, (LINK_ELEMENT *) \
           new_insn_send(iseq, line, \
                         (VALUE)id, (VALUE)argc, (VALUE)block, (VALUE)flag))

Definition at line 220 of file compile.c.

Referenced by iseq_compile_each().

#define ADD_SEQ (   seq1,
  seq2 
)    APPEND_LIST(seq1, seq2)
#define ADD_TRACE (   seq,
  line,
  event 
)
Value:
do { \
      if ((event) == RUBY_EVENT_LINE && iseq->coverage && \
          (line) != iseq->compile_data->last_coverable_line) { \
          RARRAY_PTR(iseq->coverage)[(line) - 1] = INT2FIX(0); \
          iseq->compile_data->last_coverable_line = (line); \
          ADD_INSN1(seq, line, trace, INT2FIX(RUBY_EVENT_COVERAGE)); \
      } \
      if (iseq->compile_data->option->trace_instruction) { \
          ADD_INSN1(seq, line, trace, INT2FIX(event)); \
      } \
  }while(0);

Definition at line 225 of file compile.c.

Referenced by iseq_compile_each(), and rb_iseq_compile_node().

#define BUFSIZE   0x100

Definition at line 2770 of file compile.c.

#define CHECK_ARRAY (   v  )     rb_convert_type(v, T_ARRAY, "Array", "to_ary")

Definition at line 5361 of file compile.c.

Referenced by rb_iseq_build_from_ary().

#define CHECK_STRING (   v  )     rb_convert_type(v, T_STRING, "String", "to_str")

Definition at line 5362 of file compile.c.

#define CHECK_SYMBOL (   v  )     rb_convert_type(v, T_SYMBOL, "Symbol", "to_sym")

Definition at line 5363 of file compile.c.

Referenced by rb_iseq_build_from_ary().

#define COMPILE (   anchor,
  desc,
  node 
)
#define COMPILE_ (   anchor,
  desc,
  node,
  poped 
)
Value:
(debug_compile("== " desc "\n", \
                 iseq_compile_each(iseq, anchor, node, poped)))

Definition at line 265 of file compile.c.

Referenced by compile_array_(), and iseq_compile_each().

#define compile_debug   CPDEBUG

Definition at line 94 of file compile.c.

Referenced by iseq_setup(), and verify_list().

#define COMPILE_ERROR (   strs  ) 
Value:
{                                                  \
  VALUE tmp = GET_THREAD()->errinfo;               \
  if (compile_debug) rb_compile_bug strs;          \
  GET_THREAD()->errinfo = iseq->compile_data->err_info;  \
  rb_compile_error strs;                           \
  iseq->compile_data->err_info = GET_THREAD()->errinfo; \
  GET_THREAD()->errinfo = tmp;                     \
  ret = 0;                                         \
  break;                                           \
}

Definition at line 276 of file compile.c.

Referenced by iseq_compile_each().

#define COMPILE_NG   0

Definition at line 292 of file compile.c.

#define COMPILE_OK   1

Definition at line 291 of file compile.c.

#define COMPILE_POPED (   anchor,
  desc,
  node 
)
Value:
(debug_compile("== " desc "\n", \
                 iseq_compile_each(iseq, anchor, node, 1)))

Definition at line 260 of file compile.c.

Referenced by add_ensure_iseq(), compile_massign_lhs(), compile_massign_opt(), iseq_compile_each(), iseq_set_arguments(), and rb_iseq_compile_node().

#define CPDEBUG   0

debug function(macro) interface depend on CPDEBUG if it is less than 0, runtime option is in effect.

debug level: 0: no debug output 1: show node type 2: show node important parameters ... 5: show other parameters 10: show every AST array

Definition at line 90 of file compile.c.

#define debug_compile (   msg,
  v 
)    (v)

Definition at line 162 of file compile.c.

#define debug_node_end (  )     ((void)0)

Definition at line 153 of file compile.c.

Referenced by iseq_compile_each().

#define debug_node_start (   node  )     ((void)0)

Definition at line 152 of file compile.c.

Referenced by iseq_compile_each().

#define debugi (   header,
  id 
)    r_id(id)

Definition at line 147 of file compile.c.

Referenced by compile_colon2(), and iseq_compile_each().

#define debugp (   header,
  value 
)    r_value(value)

Definition at line 148 of file compile.c.

#define debugp_param (   header,
  value 
)    r_value(value)

Definition at line 151 of file compile.c.

Referenced by compile_dstr_fragments(), and iseq_compile_each().

#define debugp_verbose (   header,
  value 
)    r_value(value)

Definition at line 149 of file compile.c.

#define debugp_verbose_node (   header,
  value 
)    r_value(value)

Definition at line 150 of file compile.c.

#define debugs   if(0)printf
#define DECL_ANCHOR (   name  )     LINK_ANCHOR *name, name##_body__ = {{0,},}
#define ERROR_ARGS   ruby_sourcefile, nd_line(node),

Definition at line 288 of file compile.c.

Referenced by iseq_compile_each(), and rb_iseq_compile_node().

#define FIXNUM_INC (   n,
  i 
)    ((n)+(INT2FIX(i)&~FIXNUM_FLAG))

Definition at line 21 of file compile.c.

Referenced by compile_massign_lhs(), and iseq_compile_each().

#define FIXNUM_OR (   n,
  i 
)    ((n)|INT2FIX(i))

Definition at line 22 of file compile.c.

Referenced by iseq_peephole_optimize().

#define hide_obj (   obj  )     do {OBJ_FREEZE(obj); RBASIC(obj)->klass = 0;} while (0)
#define INIT_ANCHOR (   name  )     (name##_body__.last = &name##_body__.anchor, name = &name##_body__)
#define INSN_OF (   insn  )     (((INSN*)(insn))->insn_id)

Definition at line 272 of file compile.c.

Referenced by iseq_compile_each().

#define ISEQ_ARG

Definition at line 314 of file compile.c.

#define ISEQ_ARG_DECLARE

Definition at line 315 of file compile.c.

#define iseq_filename (   iseq  )     (((rb_iseq_t*)DATA_PTR(iseq))->filename)

Definition at line 169 of file compile.c.

Referenced by new_child_iseq().

#define iseq_filepath (   iseq  )     (((rb_iseq_t*)DATA_PTR(iseq))->filepath)

Definition at line 172 of file compile.c.

Referenced by new_child_iseq().

#define MEMORY (   v  ) 
Value:
{ \
    int i; \
    if (memindex == memsize) return 0; \
    for (i=0; i<memindex; i++) { \
        if (mem[i] == (v)) return 0; \
    } \
    mem[memindex++] = (v); \
}

Referenced by compile_massign_opt().

#define NEW_CHILD_ISEQVAL (   node,
  name,
  type,
  line_no 
)    new_child_iseq(iseq, node, name, iseq->self, type, line_no)

Definition at line 178 of file compile.c.

Referenced by defined_expr(), and iseq_compile_each().

#define NEW_ISEQVAL (   node,
  name,
  type,
  line_no 
)    new_child_iseq(iseq, node, name, 0, type, line_no)

Definition at line 175 of file compile.c.

Referenced by iseq_compile_each().

#define NEW_LABEL (   l  )     new_label_body(iseq, l)
#define numberof (   array  )     (int)(sizeof(array) / sizeof((array)[0]))

Definition at line 20 of file compile.c.

Referenced by compile_massign_opt(), and rb_insns_name_array().

#define OPERAND_AT (   insn,
  idx 
)    (((INSN*)(insn))->operands[idx])
#define rb_intern (   str  )     rb_intern_const(str)
#define ruby_sourcefile   RSTRING_PTR(iseq->filename)
#define USE_INSN_STACK_INCREASE   1

Definition at line 14 of file compile.c.


Typedef Documentation

typedef struct iseq_adjust_data ADJUST
typedef struct iseq_insn_data INSN
typedef struct iseq_label_data LABEL
typedef struct iseq_link_anchor LINK_ANCHOR

Function Documentation

static void ADD_ELEM ( ISEQ_ARG_DECLARE LINK_ANCHOR anchor,
LINK_ELEMENT elem 
) [static]

Definition at line 391 of file compile.c.

References iseq_link_element::next, iseq_link_element::prev, and verify_list().

Referenced by compile_massign_lhs(), and iseq_build_body().

static void add_ensure_iseq ( LINK_ANCHOR ret,
rb_iseq_t iseq,
int  is_return 
) [static]
static void add_ensure_range ( rb_iseq_t iseq,
struct ensure_range erange,
LABEL lstart,
LABEL lend 
) [static]

Definition at line 2807 of file compile.c.

References ensure_range::begin, compile_data_alloc(), ensure_range::end, ne, and ensure_range::next.

Referenced by add_ensure_iseq().

static void APPEND_LIST ( ISEQ_ARG_DECLARE LINK_ANCHOR anc1,
LINK_ANCHOR anc2 
) [static]
static int calc_sp_depth ( int  depth,
INSN iobj 
) [static]

Definition at line 5000 of file compile.c.

References iseq_insn_data::insn_id, and iseq_insn_data::operands.

Referenced by iseq_set_sequence().

static VALUE case_when_optimizable_literal ( NODE node  )  [static]

Definition at line 2305 of file compile.c.

References nd_type, NODE_LIT, NODE_STR, rb_cNumeric, rb_obj_is_kind_of(), and SYMBOL_P.

Referenced by when_vals().

static int cdhash_cmp ( VALUE  val,
VALUE  lit 
) [static]

Definition at line 1226 of file compile.c.

References BUILTIN_TYPE, rb_eql(), rb_str_hash_cmp(), SPECIAL_CONST_P, and T_STRING.

static st_index_t cdhash_hash ( VALUE  a  )  [static]

Definition at line 1242 of file compile.c.

References FIX2LONG, rb_hash(), rb_str_hash(), SPECIAL_CONST_P, T_STRING, and TYPE.

static VALUE CHECK_INTEGER ( VALUE  v  )  [inline, static]

Definition at line 5364 of file compile.c.

References NUM2LONG().

Referenced by rb_iseq_build_from_ary().

static VALUE compile_array ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE node_root,
VALUE  opt_p 
) [static]

Definition at line 2299 of file compile.c.

References compile_array_().

Referenced by iseq_compile_each(), and setup_args().

static int compile_array_ ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE node_root,
VALUE  opt_p,
int  poped 
) [static]
static int compile_branch_condition ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE cond,
LABEL then_label,
LABEL else_label 
) [static]
static int compile_colon2 ( rb_iseq_t iseq,
NODE node,
LINK_ANCHOR pref,
LINK_ANCHOR body 
) [static]

Definition at line 2523 of file compile.c.

References ADD_INSN, ADD_INSN1, COMPILE, debugi, ID2SYM, nd_line, nd_type, NODE_COLON2, NODE_COLON3, NODE_CONST, and rb_cObject.

Referenced by iseq_compile_each().

static VALUE compile_cpath ( LINK_ANCHOR ret,
rb_iseq_t iseq,
NODE cpath 
) [static]
static void* compile_data_alloc ( rb_iseq_t iseq,
size_t  size 
) [static]
static ADJUST* compile_data_alloc_adjust ( rb_iseq_t iseq  )  [static]

Definition at line 584 of file compile.c.

References compile_data_alloc().

Referenced by new_adjust_body().

static INSN* compile_data_alloc_insn ( rb_iseq_t iseq  )  [static]

Definition at line 572 of file compile.c.

References compile_data_alloc().

Referenced by new_insn_core().

static LABEL* compile_data_alloc_label ( rb_iseq_t iseq  )  [static]

Definition at line 578 of file compile.c.

References compile_data_alloc().

Referenced by new_label_body().

static int compile_dregx ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE node 
) [static]

Definition at line 2190 of file compile.c.

References ADD_INSN2, cnt, compile_dstr_fragments(), INT2FIX, and nd_line.

Referenced by iseq_compile_each().

static int compile_dstr ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE node 
) [static]

Definition at line 2181 of file compile.c.

References ADD_INSN1, cnt, compile_dstr_fragments(), INT2FIX, and nd_line.

Referenced by iseq_compile_each().

static int compile_dstr_fragments ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE node,
int *  cntp 
) [static]

Definition at line 2157 of file compile.c.

References ADD_INSN1, cnt, COMPILE, debugp_param, hide_obj, nd_line, and NIL_P.

Referenced by compile_dregx(), and compile_dstr().

static int compile_massign ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE node,
int  poped 
) [static]
static int compile_massign_lhs ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE node 
) [static]
static int compile_massign_opt ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE rhsn,
NODE orig_lhsn 
) [static]
static void compile_massign_opt_lhs ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE lhsn 
) [static]

Definition at line 2391 of file compile.c.

References compile_massign_lhs().

Referenced by compile_massign_opt().

static int defined_expr ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE node,
LABEL **  lfinish,
VALUE  needstr 
) [static]
static void dump_disasm_list ( LINK_ELEMENT elem  )  [static]
static LINK_ELEMENT* FIRST_ELEMENT ( LINK_ANCHOR anchor  )  [static]
static LINK_ELEMENT* get_destination_insn ( INSN iobj  )  [static]
static int get_dyna_var_idx ( rb_iseq_t iseq,
ID  id,
int *  level,
int *  ls 
) [static]
static int get_dyna_var_idx_at_raw ( rb_iseq_t iseq,
ID  id 
) [static]
static VALUE get_exception_sym2type ( VALUE  sym  )  [static]

Definition at line 5151 of file compile.c.

References ID2SYM, rb_eSyntaxError, rb_inspect(), rb_intern, rb_raise(), and StringValuePtr.

Referenced by iseq_build_exception().

static int get_local_var_idx ( rb_iseq_t iseq,
ID  id 
) [static]

Definition at line 1009 of file compile.c.

References get_dyna_var_idx_at_raw(), rb_iseq_struct::local_iseq, and rb_bug().

Referenced by iseq_compile_each().

static LINK_ELEMENT* get_next_insn ( INSN iobj  )  [static]
static LINK_ELEMENT* get_prev_insn ( INSN iobj  )  [static]
static void INSERT_ELEM_NEXT ( LINK_ELEMENT elem1,
LINK_ELEMENT elem2 
) [static]

Definition at line 593 of file compile.c.

References iseq_link_element::next, and iseq_link_element::prev.

Referenced by iseq_peephole_optimize().

static void INSERT_LIST ( ISEQ_ARG_DECLARE LINK_ANCHOR anc1,
LINK_ANCHOR anc2 
) [static]
static int insn_data_length ( INSN iobj  )  [static]

Definition at line 4994 of file compile.c.

References iseq_insn_data::insn_id.

Referenced by dump_disasm_list(), and iseq_set_sequence().

static int insn_data_line_no ( INSN iobj  )  [static]

Definition at line 5006 of file compile.c.

References iseq_insn_data::line_no.

Referenced by dump_disasm_list().

static VALUE insn_data_to_s_detail ( INSN iobj  )  [static]
static struct st_table* insn_make_insn_table ( void   )  [static, read]

Definition at line 5216 of file compile.c.

References ID2SYM, rb_intern, st_init_numtable(), and st_insert().

Referenced by iseq_build_body().

static int insn_set_specialized_instruction ( rb_iseq_t iseq,
INSN iobj,
int  insn_id 
) [static]
static int iseq_add_mark_object ( rb_iseq_t iseq,
VALUE  v 
) [static]
static int iseq_add_mark_object_compile_time ( rb_iseq_t iseq,
VALUE  v 
) [static]
static int iseq_build_body ( rb_iseq_t iseq,
LINK_ANCHOR anchor,
VALUE  body,
struct st_table labels_table 
) [static]
static int iseq_build_exception ( rb_iseq_t iseq,
struct st_table labels_table,
VALUE  exception 
) [static]
static int iseq_compile_each ( rb_iseq_t iseq,
LINK_ANCHOR ret,
NODE node,
int  poped 
) [static]

compile each node

self: InstructionSequence node: Ruby compiled node poped: This node will be poped

Definition at line 2954 of file compile.c.

References ADD_ADJUST, ADD_ADJUST_RESTORE, ADD_CALL, ADD_CALL_RECEIVER, ADD_CALL_WITH_BLOCK, ADD_CATCH_ENTRY, add_ensure_iseq(), ADD_INSN, ADD_INSN1, ADD_INSN2, ADD_INSN3, ADD_INSNL, ADD_LABEL, ADD_SEND, ADD_SEND_R, ADD_SEQ, ADD_TRACE, rb_iseq_struct::arg_opts, rb_iseq_struct::arg_post_len, rb_iseq_struct::arg_post_start, rb_iseq_struct::arg_rest, rb_iseq_struct::arg_simple, rb_iseq_struct::argc, ensure_range::begin, CATCH_TYPE_BREAK, CATCH_TYPE_ENSURE, CATCH_TYPE_NEXT, CATCH_TYPE_REDO, CATCH_TYPE_RESCUE, CATCH_TYPE_RETRY, COMPILE, COMPILE_, compile_array(), compile_array_(), compile_branch_condition(), compile_colon2(), compile_cpath(), rb_iseq_struct::compile_data, compile_dregx(), compile_dstr(), COMPILE_ERROR, compile_massign(), COMPILE_POPED, CONST_ID, iseq_compile_data::current_block, debug_node_end, debug_node_start, debugi, debugp_param, debugs, DECL_ANCHOR, defined_expr(), ensure_range::end, iseq_compile_data::end_label, iseq_compile_data::ensure_node_stack, iseq_compile_data_ensure_node_stack::erange, ERROR_ARGS, FIXNUM_INC, RNode::flags, iseq_compile_data::flip_cnt, get_dyna_var_idx(), get_local_var_idx(), hide_obj, rb_iseq_struct::ic_size, RNode::id, ID2SYM, id_core_define_method, id_core_define_singleton_method, id_core_set_method_alias, id_core_set_postexe, id_core_set_variable_alias, id_core_undef_method, idAREF, idASET, idBackquote, idEqq, idEqTilde, INIT_ANCHOR, rb_compile_option_struct::inline_const_cache, INSN_OF, INT2FIX, iseq_add_mark_object_compile_time(), ISEQ_TYPE_BLOCK, ISEQ_TYPE_CLASS, ISEQ_TYPE_ENSURE, ISEQ_TYPE_EVAL, ISEQ_TYPE_METHOD, ISEQ_TYPE_RESCUE, ISEQ_TYPE_TOP, iseq_compile_data::last_line, LIST_SIZE_ZERO(), rb_iseq_struct::local_iseq, rb_iseq_struct::local_size, LONG2FIX, iseq_compile_data::loopval_popped, make_name_for_block(), rb_iseq_struct::name, nd_line, nd_type, NEW_CHILD_ISEQVAL, NEW_ISEQVAL, NEW_LABEL, ensure_range::next, RNode::node, NODE_ALIAS, NODE_AND, NODE_ARGSCAT, NODE_ARGSPUSH, NODE_ARRAY, NODE_ATTRASGN, NODE_BACK_REF, NODE_BEGIN, NODE_BLOCK, NODE_BLOCK_PASS, NODE_BREAK, NODE_CALL, NODE_CASE, NODE_CDECL, NODE_CLASS, NODE_COLON2, NODE_COLON3, NODE_CONST, NODE_CVAR, NODE_CVASGN, NODE_DASGN, NODE_DASGN_CURR, NODE_DEFINED, NODE_DEFN, NODE_DEFS, NODE_DOT2, NODE_DOT3, NODE_DREGX, NODE_DREGX_ONCE, NODE_DSTR, NODE_DSYM, NODE_DVAR, NODE_DXSTR, NODE_ENSURE, NODE_ERRINFO, NODE_EVSTR, NODE_FALSE, NODE_FCALL, NODE_FL_NEWLINE, NODE_FLIP2, NODE_FLIP3, NODE_FOR, NODE_GASGN, NODE_GVAR, NODE_HASH, NODE_IASGN, NODE_IASGN2, NODE_IF, NODE_ITER, NODE_IVAR, NODE_LAMBDA, NODE_LASGN, NODE_LIT, NODE_LVAR, NODE_MASGN, NODE_MATCH, NODE_MATCH2, NODE_MATCH3, NODE_MODULE, NODE_NEXT, NODE_NIL, NODE_NTH_REF, NODE_OP_ASGN1, NODE_OP_ASGN2, NODE_OP_ASGN_AND, NODE_OP_ASGN_OR, NODE_OPT_N, NODE_OPTBLOCK, NODE_OR, NODE_POSTEXE, NODE_PRELUDE, NODE_REDO, NODE_RESBODY, NODE_RESCUE, NODE_RETRY, NODE_RETURN, NODE_SCLASS, NODE_SELF, NODE_SPLAT, NODE_STR, NODE_SUPER, NODE_TRUE, NODE_UNDEF, NODE_UNTIL, NODE_VALIAS, NODE_VALUES, NODE_VCALL, NODE_WHEN, NODE_WHILE, NODE_XSTR, NODE_YIELD, NODE_ZARRAY, NODE_ZSUPER, OBJ_FREEZE, OPERAND_AT, iseq_compile_data::option, rb_iseq_struct::parent_iseq, POP_ELEMENT(), iseq_compile_data_ensure_node_stack::prev, push_ensure_entry(), Qfalse, Qnil, Qtrue, Qundef, rb_ary_tmp_new(), rb_bug(), rb_cObject, rb_eStandardError, rb_hash_aref(), rb_hash_aset(), rb_id2name(), rb_id2str(), rb_is_const_id(), rb_sprintf(), rb_str_concat(), rb_str_dup(), rb_str_new2(), iseq_compile_data::redo_label, RSTRING_PTR, RUBY_EVENT_LINE, RUBY_EVENT_RETURN, ruby_node_name(), setup_args(), rb_compile_option_struct::specialized_instruction, iseq_compile_data::start_label, SYMBOL_P, rb_compile_option_struct::tailcall_optimization, rb_iseq_struct::type, type, RNode::u1, RNode::u2, VM_CALL_ARGS_BLOCKARG_BIT, VM_CALL_ARGS_SPLAT_BIT, VM_SPECIAL_OBJECT_CBASE, VM_SPECIAL_OBJECT_CONST_BASE, VM_SPECIAL_OBJECT_VMCORE, and when_vals().

static int iseq_insns_unification ( rb_iseq_t iseq,
LINK_ANCHOR anchor 
) [static]
static int iseq_optimize ( rb_iseq_t iseq,
LINK_ANCHOR anchor 
) [static]
static int iseq_peephole_optimize ( rb_iseq_t iseq,
LINK_ELEMENT list,
const int  do_tailcallopt 
) [static]
static int iseq_set_arguments ( rb_iseq_t iseq,
LINK_ANCHOR anchor,
NODE node 
) [static]
static int iseq_set_exception_local_table ( rb_iseq_t iseq  )  [static]
static int iseq_set_exception_table ( rb_iseq_t iseq  )  [static]
static int iseq_set_local_table ( rb_iseq_t iseq,
ID tbl 
) [static]
static int iseq_set_optargs_table ( rb_iseq_t iseq  )  [static]

Definition at line 1609 of file compile.c.

References rb_iseq_struct::arg_opt_table, rb_iseq_struct::arg_opts, and label_get_position().

Referenced by iseq_setup().

static int iseq_set_sequence ( rb_iseq_t iseq,
LINK_ANCHOR anchor 
) [static]
static int iseq_set_sequence_stackcaching ( rb_iseq_t iseq,
LINK_ANCHOR anchor 
) [static]
static int iseq_setup ( rb_iseq_t iseq,
LINK_ANCHOR anchor 
) [static]
static int iseq_specialized_instruction ( rb_iseq_t iseq,
INSN iobj 
) [static]
static int label_get_position ( LABEL lobj  )  [static]

Definition at line 1540 of file compile.c.

References iseq_label_data::position.

Referenced by iseq_set_exception_table(), and iseq_set_optargs_table().

static int label_get_sp ( LABEL lobj  )  [static]

Definition at line 1546 of file compile.c.

References iseq_label_data::sp.

Referenced by iseq_set_exception_table().

static int LIST_SIZE_ZERO ( LINK_ANCHOR anchor  )  [static]

Definition at line 698 of file compile.c.

References iseq_link_anchor::anchor, and iseq_link_element::next.

Referenced by iseq_compile_each(), and setup_args().

static VALUE make_name_for_block ( rb_iseq_t iseq  )  [static]
static ADJUST * new_adjust_body ( rb_iseq_t iseq,
LABEL label,
int  line 
) [static]
static VALUE new_child_iseq ( rb_iseq_t iseq,
NODE node,
VALUE  name,
VALUE  parent,
VALUE  type,
int  line_no 
) [static]
static INSN * new_insn_body ( rb_iseq_t iseq,
int  line_no,
int  insn_id,
int  argc,
  ... 
) [static]

Definition at line 883 of file compile.c.

References argv, compile_data_alloc(), new_insn_core(), and va_init_list.

Referenced by iseq_set_sequence_stackcaching().

static INSN* new_insn_core ( rb_iseq_t iseq,
int  line_no,
int  insn_id,
int  argc,
VALUE argv 
) [static]
static INSN* new_insn_send ( rb_iseq_t iseq,
int  line_no,
VALUE  id,
VALUE  argc,
VALUE  block,
VALUE  flag 
) [static]

Definition at line 901 of file compile.c.

References compile_data_alloc(), rb_iseq_struct::ic_size, INT2FIX, and new_insn_core().

static LABEL * new_label_body ( rb_iseq_t iseq,
long  line 
) [static]
NORETURN ( PRINTF_ARGS(void rb_compile_bug(const char *, int, const char *,...), 3, 4)   ) 
static LINK_ELEMENT* POP_ELEMENT ( ISEQ_ARG_DECLARE LINK_ANCHOR anchor  )  [static]
static void push_ensure_entry ( rb_iseq_t iseq,
struct iseq_compile_data_ensure_node_stack enl,
struct ensure_range er,
NODE node 
) [static]
static ID r_id ( ID  id  )  [inline, static]

Definition at line 136 of file compile.c.

static VALUE r_value ( VALUE  value  )  [inline, static]

Definition at line 142 of file compile.c.

int rb_dvar_defined ( ID  id  ) 
VALUE rb_insns_name_array ( void   ) 

Definition at line 5123 of file compile.c.

References numberof, rb_ary_new(), rb_ary_push(), rb_obj_freeze(), and rb_str_new2().

Referenced by Init_VM().

VALUE rb_iseq_build_from_ary ( rb_iseq_t iseq,
VALUE  locals,
VALUE  args,
VALUE  exception,
VALUE  body 
)
VALUE rb_iseq_compile_node ( VALUE  self,
NODE node 
)
int rb_iseq_translate_threaded_code ( rb_iseq_t iseq  ) 
int rb_local_defined ( ID  id  ) 
int rb_parse_in_eval ( void   ) 

Definition at line 5487 of file compile.c.

References GET_THREAD.

Referenced by parser_compile_string(), and rb_parser_compile_file().

int rb_parse_in_main ( void   ) 

Definition at line 5493 of file compile.c.

References GET_THREAD.

Referenced by yyparse().

static LABEL* register_label ( rb_iseq_t iseq,
struct st_table labels_table,
VALUE  obj 
) [static]
static void REMOVE_ELEM ( LINK_ELEMENT elem  )  [static]
static void REPLACE_ELEM ( LINK_ELEMENT elem1,
LINK_ELEMENT elem2 
) [static]
static VALUE setup_args ( rb_iseq_t iseq,
LINK_ANCHOR args,
NODE argn,
unsigned long *  flag 
) [static]
static void verify_list ( ISEQ_ARG_DECLARE const char *  info,
LINK_ANCHOR anchor 
) [static]
static VALUE when_vals ( rb_iseq_t iseq,
LINK_ANCHOR cond_seq,
NODE vals,
LABEL l1,
VALUE  special_literals 
) [static]

Variable Documentation

struct st_hash_type cdhash_type [static]
Initial value:
 {
    cdhash_cmp,
    cdhash_hash,
}

Definition at line 1252 of file compile.c.