Feature #10187 » call_info-96.patch
compile.c | ||
---|---|---|
}
|
||
static rb_call_info_t *
|
||
new_callinfo(rb_iseq_t *iseq, ID mid, int argc, VALUE block, unsigned long flag)
|
||
new_callinfo(rb_iseq_t *iseq, ID mid, int argc, VALUE block, unsigned int flag)
|
||
{
|
||
rb_call_info_t *ci = (rb_call_info_t *)compile_data_alloc(iseq, sizeof(rb_call_info_t));
|
||
ci->mid = mid;
|
||
... | ... | |
}
|
||
static VALUE
|
||
setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, VALUE *flag)
|
||
setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned int *flag)
|
||
{
|
||
VALUE argc = INT2FIX(0);
|
||
int nsplat = 0;
|
||
... | ... | |
case NODE_OP_ASGN1: {
|
||
DECL_ANCHOR(args);
|
||
VALUE argc;
|
||
VALUE flag = 0;
|
||
unsigned int flag = 0;
|
||
VALUE asgnflag = 0;
|
||
ID id = node->nd_mid;
|
||
int boff = 0;
|
||
... | ... | |
}
|
||
ADD_INSN1(ret, line, dupn, FIXNUM_INC(argc, 1 + boff));
|
||
flag |= asgnflag;
|
||
ADD_SEND_R(ret, line, ID2SYM(idAREF), argc, Qfalse, LONG2FIX(flag));
|
||
ADD_SEND_R(ret, line, ID2SYM(idAREF), argc, Qfalse, INT2FIX(flag));
|
||
if (id == 0 || id == 1) {
|
||
/* 0: or, 1: and
|
||
... | ... | |
ADD_INSN(ret, line, pop);
|
||
}
|
||
ADD_SEND_R(ret, line, ID2SYM(idASET),
|
||
argc, Qfalse, LONG2FIX(flag));
|
||
argc, Qfalse, INT2FIX(flag));
|
||
}
|
||
else {
|
||
if (boff > 0)
|
||
ADD_INSN(ret, line, swap);
|
||
ADD_SEND_R(ret, line, ID2SYM(idASET),
|
||
FIXNUM_INC(argc, 1), Qfalse, LONG2FIX(flag));
|
||
FIXNUM_INC(argc, 1), Qfalse, INT2FIX(flag));
|
||
}
|
||
ADD_INSN(ret, line, pop);
|
||
ADD_INSNL(ret, line, jump, lfin);
|
||
... | ... | |
ADD_INSN(ret, line, pop);
|
||
}
|
||
ADD_SEND_R(ret, line, ID2SYM(idASET),
|
||
argc, Qfalse, LONG2FIX(flag));
|
||
argc, Qfalse, INT2FIX(flag));
|
||
}
|
||
else {
|
||
if (boff > 0)
|
||
ADD_INSN(ret, line, swap);
|
||
ADD_SEND_R(ret, line, ID2SYM(idASET),
|
||
FIXNUM_INC(argc, 1), Qfalse, LONG2FIX(flag));
|
||
FIXNUM_INC(argc, 1), Qfalse, INT2FIX(flag));
|
||
}
|
||
ADD_INSN(ret, line, pop);
|
||
}
|
||
... | ... | |
DECL_ANCHOR(args);
|
||
ID mid = node->nd_mid;
|
||
VALUE argc;
|
||
VALUE flag = 0;
|
||
unsigned int flag = 0;
|
||
VALUE parent_block = iseq->compile_data->current_block;
|
||
iseq->compile_data->current_block = Qfalse;
|
||
... | ... | |
}
|
||
ADD_SEND_R(ret, line, ID2SYM(mid),
|
||
argc, parent_block, LONG2FIX(flag));
|
||
argc, parent_block, INT2FIX(flag));
|
||
if (poped) {
|
||
ADD_INSN(ret, line, pop);
|
||
... | ... | |
case NODE_ZSUPER:{
|
||
DECL_ANCHOR(args);
|
||
int argc;
|
||
VALUE flag = 0;
|
||
unsigned int flag = 0;
|
||
VALUE parent_block = iseq->compile_data->current_block;
|
||
INIT_ANCHOR(args);
|
||
... | ... | |
case NODE_YIELD:{
|
||
DECL_ANCHOR(args);
|
||
VALUE argc;
|
||
VALUE flag = 0;
|
||
unsigned int flag = 0;
|
||
INIT_ANCHOR(args);
|
||
if (iseq->type == ISEQ_TYPE_TOP) {
|
||
... | ... | |
case NODE_ATTRASGN:{
|
||
DECL_ANCHOR(recv);
|
||
DECL_ANCHOR(args);
|
||
VALUE flag = 0;
|
||
unsigned int flag = 0;
|
||
VALUE argc;
|
||
int asgnflag;
|
||
... | ... | |
ADD_SEQ(ret, recv);
|
||
ADD_SEQ(ret, args);
|
||
}
|
||
ADD_SEND_R(ret, line, ID2SYM(node->nd_mid), argc, 0, LONG2FIX(flag));
|
||
ADD_SEND_R(ret, line, ID2SYM(node->nd_mid), argc, 0, INT2FIX(flag));
|
||
ADD_INSN(ret, line, pop);
|
||
break;
|
||
... | ... | |
ID mid = 0;
|
||
int orig_argc = 0;
|
||
VALUE block = 0;
|
||
unsigned long flag = 0;
|
||
unsigned int flag = 0;
|
||
if (!NIL_P(op)) {
|
||
VALUE vmid = rb_hash_aref(op, ID2SYM(rb_intern("mid")));
|
||
... | ... | |
VALUE vblock = rb_hash_aref(op, ID2SYM(rb_intern("blockptr")));
|
||
if (!NIL_P(vmid)) mid = SYM2ID(vmid);
|
||
if (!NIL_P(vflag)) flag = NUM2ULONG(vflag);
|
||
if (!NIL_P(vflag)) flag = NUM2UINT(vflag);
|
||
if (!NIL_P(vorig_argc)) orig_argc = FIX2INT(vorig_argc);
|
||
if (!NIL_P(vblock)) block = iseq_build_load_iseq(iseq, vblock);
|
||
}
|
include/ruby/ruby.h | ||
---|---|---|
struct RBasic basic;
|
||
union {
|
||
struct {
|
||
long numiv;
|
||
long numiv; /* only uses 32-bits */
|
||
VALUE *ivptr;
|
||
struct st_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
|
||
} heap;
|
variable.c | ||
---|---|---|
iv_index_tbl->num_entries < (st_index_t)newsize) {
|
||
newsize = iv_index_tbl->num_entries;
|
||
}
|
||
if (newsize > INT_MAX) rb_memerror();
|
||
if (RBASIC(obj)->flags & ROBJECT_EMBED) {
|
||
newptr = ALLOC_N(VALUE, newsize);
|
||
MEMCPY(newptr, ptr, VALUE, len);
|
vm_core.h | ||
---|---|---|
typedef struct rb_call_info_struct {
|
||
/* fixed at compile time */
|
||
ID mid;
|
||
VALUE flag;
|
||
rb_iseq_t *blockiseq;
|
||
unsigned int flag;
|
||
int orig_argc;
|
||
int argc; /* temporary for method calling */
|
||
rb_iseq_t *blockiseq;
|
||
/* inline cache: keys */
|
||
rb_serial_t method_state;
|
||
... | ... | |
/* temporary values for method calling */
|
||
struct rb_block_struct *blockptr;
|
||
VALUE recv;
|
||
int argc;
|
||
union {
|
||
int opt_pc; /* used by iseq */
|
||
long index; /* used by ivar */
|
||
int index; /* used by ivar */
|
||
int missing_reason; /* used by method_missing */
|
||
int inc_sp; /* used by cfunc */
|
||
} aux;
|
vm_insnhelper.c | ||
---|---|---|
if (LIKELY((!is_attr && ic->ic_serial == RCLASS_SERIAL(klass)) ||
|
||
(is_attr && ci->aux.index > 0))) {
|
||
long index = !is_attr ? (long)ic->ic_value.index : ci->aux.index - 1;
|
||
int index = !is_attr ? (int)ic->ic_value.index : ci->aux.index - 1;
|
||
long len = ROBJECT_NUMIV(obj);
|
||
VALUE *ptr = ROBJECT_IVPTR(obj);
|
||
... | ... | |
ic->ic_serial = RCLASS_SERIAL(klass);
|
||
}
|
||
else { /* call_info */
|
||
ci->aux.index = index + 1;
|
||
ci->aux.index = (int)index + 1;
|
||
}
|
||
}
|
||
}
|
||
-
|