insn_info/insns_info
* iseq.h (iseq_line_info_entry): rename to iseq_insn_info_entry. * vm_core.h (rb_iseq_constant_body): rename field name line_info_table to insns_info and also from line_info_size to insns_info_size. * compile.c (INSN): add struct insn_info to contain per insn information. * compile.c (add_insn_info): added to add new insn_info entry. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60726 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
3b7373fd00
commit
1c5ae5a163
113
compile.c
113
compile.c
@ -72,10 +72,12 @@ typedef struct iseq_label_data {
|
|||||||
typedef struct iseq_insn_data {
|
typedef struct iseq_insn_data {
|
||||||
LINK_ELEMENT link;
|
LINK_ELEMENT link;
|
||||||
enum ruby_vminsn_type insn_id;
|
enum ruby_vminsn_type insn_id;
|
||||||
unsigned int line_no;
|
|
||||||
int operand_size;
|
int operand_size;
|
||||||
int sc_state;
|
int sc_state;
|
||||||
VALUE *operands;
|
VALUE *operands;
|
||||||
|
struct {
|
||||||
|
int line_no;
|
||||||
|
} insn_info;
|
||||||
} INSN;
|
} INSN;
|
||||||
|
|
||||||
typedef struct iseq_adjust_data {
|
typedef struct iseq_adjust_data {
|
||||||
@ -1111,7 +1113,7 @@ new_insn_core(rb_iseq_t *iseq, int line_no,
|
|||||||
iobj->link.type = ISEQ_ELEMENT_INSN;
|
iobj->link.type = ISEQ_ELEMENT_INSN;
|
||||||
iobj->link.next = 0;
|
iobj->link.next = 0;
|
||||||
iobj->insn_id = insn_id;
|
iobj->insn_id = insn_id;
|
||||||
iobj->line_no = line_no;
|
iobj->insn_info.line_no = line_no;
|
||||||
iobj->operands = argv;
|
iobj->operands = argv;
|
||||||
iobj->operand_size = argc;
|
iobj->operand_size = argc;
|
||||||
iobj->sc_state = 0;
|
iobj->sc_state = 0;
|
||||||
@ -1679,7 +1681,7 @@ get_ivar_ic_value(rb_iseq_t *iseq,ID id)
|
|||||||
|
|
||||||
#define BADINSN_ERROR \
|
#define BADINSN_ERROR \
|
||||||
(xfree(generated_iseq), \
|
(xfree(generated_iseq), \
|
||||||
xfree(line_info_table), \
|
xfree(insns_info), \
|
||||||
BADINSN_DUMP(anchor, list, NULL), \
|
BADINSN_DUMP(anchor, list, NULL), \
|
||||||
COMPILE_ERROR)
|
COMPILE_ERROR)
|
||||||
|
|
||||||
@ -1709,7 +1711,7 @@ fix_sp_depth(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
sp = calc_sp_depth(sp, iobj);
|
sp = calc_sp_depth(sp, iobj);
|
||||||
if (sp < 0) {
|
if (sp < 0) {
|
||||||
BADINSN_DUMP(anchor, list, NULL);
|
BADINSN_DUMP(anchor, list, NULL);
|
||||||
COMPILE_ERROR(iseq, iobj->line_no,
|
COMPILE_ERROR(iseq, iobj->insn_info.line_no,
|
||||||
"argument stack underflow (%d)", sp);
|
"argument stack underflow (%d)", sp);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1717,7 +1719,7 @@ fix_sp_depth(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
stack_max = sp;
|
stack_max = sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
line = iobj->line_no;
|
line = iobj->insn_info.line_no;
|
||||||
/* fprintf(stderr, "insn: %-16s, sp: %d\n", insn_name(iobj->insn_id), sp); */
|
/* fprintf(stderr, "insn: %-16s, sp: %d\n", insn_name(iobj->insn_id), sp); */
|
||||||
operands = iobj->operands;
|
operands = iobj->operands;
|
||||||
insn = iobj->insn_id;
|
insn = iobj->insn_id;
|
||||||
@ -1728,7 +1730,7 @@ fix_sp_depth(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
if (iobj->operand_size != len - 1) {
|
if (iobj->operand_size != len - 1) {
|
||||||
/* printf("operand size miss! (%d, %d)\n", iobj->operand_size, len); */
|
/* printf("operand size miss! (%d, %d)\n", iobj->operand_size, len); */
|
||||||
BADINSN_DUMP(anchor, list, NULL);
|
BADINSN_DUMP(anchor, list, NULL);
|
||||||
COMPILE_ERROR(iseq, iobj->line_no,
|
COMPILE_ERROR(iseq, iobj->insn_info.line_no,
|
||||||
"operand size miss! (%d for %d)",
|
"operand size miss! (%d for %d)",
|
||||||
iobj->operand_size, len - 1);
|
iobj->operand_size, len - 1);
|
||||||
return -1;
|
return -1;
|
||||||
@ -1740,7 +1742,7 @@ fix_sp_depth(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
LABEL *lobj = (LABEL *)operands[j];
|
LABEL *lobj = (LABEL *)operands[j];
|
||||||
if (!lobj->set) {
|
if (!lobj->set) {
|
||||||
BADINSN_DUMP(anchor, list, NULL);
|
BADINSN_DUMP(anchor, list, NULL);
|
||||||
COMPILE_ERROR(iseq, iobj->line_no,
|
COMPILE_ERROR(iseq, iobj->insn_info.line_no,
|
||||||
"unknown label: "LABEL_FORMAT, lobj->label_no);
|
"unknown label: "LABEL_FORMAT, lobj->label_no);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1791,18 +1793,50 @@ fix_sp_depth(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
return stack_max;
|
return stack_max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
add_insn_info(struct iseq_insn_info_entry *insns_info, int insns_info_index, int code_index, LINK_ELEMENT *list)
|
||||||
|
{
|
||||||
|
if (list->type == ISEQ_ELEMENT_INSN) {
|
||||||
|
INSN *iobj = (INSN *)list;
|
||||||
|
if (iobj->insn_info.line_no != 0 &&
|
||||||
|
(insns_info_index == 0 ||
|
||||||
|
insns_info[insns_info_index-1].line_no != iobj->insn_info.line_no)) {
|
||||||
|
insns_info[insns_info_index].position = code_index;
|
||||||
|
insns_info[insns_info_index].line_no = iobj->insn_info.line_no;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (list->type == ISEQ_ELEMENT_ADJUST) {
|
||||||
|
ADJUST *adjust = (ADJUST *)list;
|
||||||
|
if (insns_info_index > 0 ||
|
||||||
|
insns_info[insns_info_index-1].line_no != adjust->line_no) {
|
||||||
|
insns_info[insns_info_index].position = code_index;
|
||||||
|
insns_info[insns_info_index].line_no = adjust->line_no;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
VM_UNREACHABLE(add_insn_info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
ruby insn object list -> raw instruction sequence
|
ruby insn object list -> raw instruction sequence
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
||||||
{
|
{
|
||||||
struct iseq_line_info_entry *line_info_table;
|
struct iseq_insn_info_entry *insns_info;
|
||||||
unsigned int last_line = 0;
|
|
||||||
LINK_ELEMENT *list;
|
LINK_ELEMENT *list;
|
||||||
VALUE *generated_iseq;
|
VALUE *generated_iseq;
|
||||||
|
|
||||||
int insn_num, code_index, line_info_index, sp = 0;
|
int insn_num, code_index, insns_info_index, sp = 0;
|
||||||
int stack_max = fix_sp_depth(iseq, anchor);
|
int stack_max = fix_sp_depth(iseq, anchor);
|
||||||
|
|
||||||
if (stack_max < 0) return COMPILE_NG;
|
if (stack_max < 0) return COMPILE_NG;
|
||||||
@ -1853,7 +1887,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
|
|
||||||
/* make instruction sequence */
|
/* make instruction sequence */
|
||||||
generated_iseq = ALLOC_N(VALUE, code_index);
|
generated_iseq = ALLOC_N(VALUE, code_index);
|
||||||
line_info_table = ALLOC_N(struct iseq_line_info_entry, insn_num);
|
insns_info = ALLOC_N(struct iseq_insn_info_entry, insn_num);
|
||||||
iseq->body->is_entries = ZALLOC_N(union iseq_inline_storage_entry, iseq->body->is_size);
|
iseq->body->is_entries = ZALLOC_N(union iseq_inline_storage_entry, iseq->body->is_size);
|
||||||
iseq->body->ci_entries = (struct rb_call_info *)ruby_xmalloc(sizeof(struct rb_call_info) * iseq->body->ci_size +
|
iseq->body->ci_entries = (struct rb_call_info *)ruby_xmalloc(sizeof(struct rb_call_info) * iseq->body->ci_size +
|
||||||
sizeof(struct rb_call_info_with_kwarg) * iseq->body->ci_kw_size);
|
sizeof(struct rb_call_info_with_kwarg) * iseq->body->ci_kw_size);
|
||||||
@ -1862,7 +1896,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
ISEQ_COMPILE_DATA(iseq)->ci_index = ISEQ_COMPILE_DATA(iseq)->ci_kw_index = 0;
|
ISEQ_COMPILE_DATA(iseq)->ci_index = ISEQ_COMPILE_DATA(iseq)->ci_kw_index = 0;
|
||||||
|
|
||||||
list = FIRST_ELEMENT(anchor);
|
list = FIRST_ELEMENT(anchor);
|
||||||
line_info_index = code_index = sp = 0;
|
insns_info_index = code_index = sp = 0;
|
||||||
|
|
||||||
while (list) {
|
while (list) {
|
||||||
switch (list->type) {
|
switch (list->type) {
|
||||||
@ -1976,16 +2010,12 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
generated_iseq[code_index + 1 + j] = operands[j];
|
generated_iseq[code_index + 1 + j] = operands[j];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
BADINSN_ERROR(iseq, iobj->line_no,
|
BADINSN_ERROR(iseq, iobj->insn_info.line_no,
|
||||||
"unknown operand type: %c", type);
|
"unknown operand type: %c", type);
|
||||||
return COMPILE_NG;
|
return COMPILE_NG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (last_line != iobj->line_no) {
|
if (add_insn_info(insns_info, insns_info_index, code_index, (LINK_ELEMENT *)iobj)) insns_info_index++;
|
||||||
line_info_table[line_info_index].line_no = last_line = iobj->line_no;
|
|
||||||
line_info_table[line_info_index].position = code_index;
|
|
||||||
line_info_index++;
|
|
||||||
}
|
|
||||||
code_index += len;
|
code_index += len;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2010,11 +2040,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
if (adjust->line_no != -1) {
|
if (adjust->line_no != -1) {
|
||||||
const int diff = orig_sp - sp;
|
const int diff = orig_sp - sp;
|
||||||
if (diff > 0) {
|
if (diff > 0) {
|
||||||
if (last_line != (unsigned int)adjust->line_no) {
|
if (add_insn_info(insns_info, insns_info_index, code_index, (LINK_ELEMENT *)adjust)) insns_info_index++;
|
||||||
line_info_table[line_info_index].line_no = last_line = adjust->line_no;
|
|
||||||
line_info_table[line_info_index].position = code_index;
|
|
||||||
line_info_index++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (diff > 1) {
|
if (diff > 1) {
|
||||||
generated_iseq[code_index++] = BIN(adjuststack);
|
generated_iseq[code_index++] = BIN(adjuststack);
|
||||||
@ -2026,7 +2052,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
else if (diff < 0) {
|
else if (diff < 0) {
|
||||||
int label_no = adjust->label ? adjust->label->label_no : -1;
|
int label_no = adjust->label ? adjust->label->label_no : -1;
|
||||||
xfree(generated_iseq);
|
xfree(generated_iseq);
|
||||||
xfree(line_info_table);
|
xfree(insns_info);
|
||||||
debug_list(anchor);
|
debug_list(anchor);
|
||||||
COMPILE_ERROR(iseq, adjust->line_no,
|
COMPILE_ERROR(iseq, adjust->line_no,
|
||||||
"iseq_set_sequence: adjust bug to %d %d < %d",
|
"iseq_set_sequence: adjust bug to %d %d < %d",
|
||||||
@ -2048,11 +2074,11 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
iseq->body->stack_max = stack_max;
|
iseq->body->stack_max = stack_max;
|
||||||
|
|
||||||
/* get rid of memory leak when REALLOC failed */
|
/* get rid of memory leak when REALLOC failed */
|
||||||
iseq->body->line_info_table = line_info_table;
|
iseq->body->insns_info = insns_info;
|
||||||
|
|
||||||
REALLOC_N(line_info_table, struct iseq_line_info_entry, line_info_index);
|
REALLOC_N(insns_info, struct iseq_insn_info_entry, insns_info_index);
|
||||||
iseq->body->line_info_table = line_info_table;
|
iseq->body->insns_info = insns_info;
|
||||||
iseq->body->line_info_size = line_info_index;
|
iseq->body->insns_info_size = insns_info_index;
|
||||||
|
|
||||||
return COMPILE_OK;
|
return COMPILE_OK;
|
||||||
}
|
}
|
||||||
@ -2369,7 +2395,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
|
|||||||
* pop
|
* pop
|
||||||
* jump L1
|
* jump L1
|
||||||
*/
|
*/
|
||||||
INSN *popiobj = new_insn_core(iseq, iobj->line_no,
|
INSN *popiobj = new_insn_core(iseq, iobj->insn_info.line_no,
|
||||||
BIN(pop), 0, 0);
|
BIN(pop), 0, 0);
|
||||||
REPLACE_ELEM(&piobj->link, &popiobj->link);
|
REPLACE_ELEM(&piobj->link, &popiobj->link);
|
||||||
}
|
}
|
||||||
@ -2509,7 +2535,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
|
|||||||
REMOVE_ELEM(iobj->link.prev);
|
REMOVE_ELEM(iobj->link.prev);
|
||||||
}
|
}
|
||||||
else if (!iseq_pop_newarray(iseq, pobj)) {
|
else if (!iseq_pop_newarray(iseq, pobj)) {
|
||||||
pobj = new_insn_core(iseq, pobj->line_no, BIN(pop), 0, NULL);
|
pobj = new_insn_core(iseq, pobj->insn_info.line_no, BIN(pop), 0, NULL);
|
||||||
INSERT_ELEM_NEXT(&iobj->link, &pobj->link);
|
INSERT_ELEM_NEXT(&iobj->link, &pobj->link);
|
||||||
}
|
}
|
||||||
if (cond) {
|
if (cond) {
|
||||||
@ -2871,7 +2897,7 @@ new_unified_insn(rb_iseq_t *iseq,
|
|||||||
list = list->next;
|
list = list->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new_insn_core(iseq, iobj->line_no, insn_id, argc, operands);
|
return new_insn_core(iseq, iobj->insn_info.line_no, insn_id, argc, operands);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2955,7 +2981,7 @@ insn_set_sc_state(rb_iseq_t *iseq, const LINK_ELEMENT *anchor, INSN *iobj, int s
|
|||||||
if (lobj->sc_state != 0) {
|
if (lobj->sc_state != 0) {
|
||||||
if (lobj->sc_state != nstate) {
|
if (lobj->sc_state != nstate) {
|
||||||
BADINSN_DUMP(anchor, iobj, lobj);
|
BADINSN_DUMP(anchor, iobj, lobj);
|
||||||
COMPILE_ERROR(iseq, iobj->line_no,
|
COMPILE_ERROR(iseq, iobj->insn_info.line_no,
|
||||||
"insn_set_sc_state error: %d at "LABEL_FORMAT
|
"insn_set_sc_state error: %d at "LABEL_FORMAT
|
||||||
", %d expected\n",
|
", %d expected\n",
|
||||||
lobj->sc_state, lobj->label_no, nstate);
|
lobj->sc_state, lobj->label_no, nstate);
|
||||||
@ -3059,7 +3085,7 @@ iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
|
|||||||
case SCS_XX:
|
case SCS_XX:
|
||||||
goto normal_insn;
|
goto normal_insn;
|
||||||
default:
|
default:
|
||||||
COMPILE_ERROR(iseq, iobj->line_no,
|
COMPILE_ERROR(iseq, iobj->insn_info.line_no,
|
||||||
"unreachable");
|
"unreachable");
|
||||||
return COMPILE_NG;
|
return COMPILE_NG;
|
||||||
}
|
}
|
||||||
@ -5179,7 +5205,6 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, const NODE *node, int poppe
|
|||||||
return iseq_compile_each0(iseq, ret, node, popped);
|
return iseq_compile_each0(iseq, ret, node, popped);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, int popped)
|
iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, int popped)
|
||||||
{
|
{
|
||||||
@ -7013,7 +7038,7 @@ dump_disasm_list_with_cursor(const LINK_ELEMENT *link, const LINK_ELEMENT *curr,
|
|||||||
{
|
{
|
||||||
iobj = (INSN *)link;
|
iobj = (INSN *)link;
|
||||||
str = insn_data_to_s_detail(iobj);
|
str = insn_data_to_s_detail(iobj);
|
||||||
printf("%04d %-65s(%4u)\n", pos, StringValueCStr(str), iobj->line_no);
|
printf("%04d %-65s(%4u)\n", pos, StringValueCStr(str), iobj->insn_info.line_no);
|
||||||
pos += insn_data_length(iobj);
|
pos += insn_data_length(iobj);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -8101,16 +8126,16 @@ ibf_load_param_keyword(const struct ibf_load *load, const struct rb_iseq_constan
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct iseq_line_info_entry *
|
static struct iseq_insn_info_entry *
|
||||||
ibf_dump_line_info_table(struct ibf_dump *dump, const rb_iseq_t *iseq)
|
ibf_dump_insns_info(struct ibf_dump *dump, const rb_iseq_t *iseq)
|
||||||
{
|
{
|
||||||
return IBF_W(iseq->body->line_info_table, struct iseq_line_info_entry, iseq->body->line_info_size);
|
return IBF_W(iseq->body->insns_info, struct iseq_insn_info_entry, iseq->body->insns_info_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct iseq_line_info_entry *
|
static struct iseq_insn_info_entry *
|
||||||
ibf_load_line_info_table(const struct ibf_load *load, const struct rb_iseq_constant_body *body)
|
ibf_load_insns_info(const struct ibf_load *load, const struct rb_iseq_constant_body *body)
|
||||||
{
|
{
|
||||||
return IBF_R(body->line_info_table, struct iseq_line_info_entry, body->line_info_size);
|
return IBF_R(body->insns_info, struct iseq_insn_info_entry, body->insns_info_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ID *
|
static ID *
|
||||||
@ -8264,7 +8289,7 @@ ibf_dump_iseq_each(struct ibf_dump *dump, const rb_iseq_t *iseq)
|
|||||||
dump_body.iseq_encoded = ibf_dump_code(dump, iseq);
|
dump_body.iseq_encoded = ibf_dump_code(dump, iseq);
|
||||||
dump_body.param.opt_table = ibf_dump_param_opt_table(dump, iseq);
|
dump_body.param.opt_table = ibf_dump_param_opt_table(dump, iseq);
|
||||||
dump_body.param.keyword = ibf_dump_param_keyword(dump, iseq);
|
dump_body.param.keyword = ibf_dump_param_keyword(dump, iseq);
|
||||||
dump_body.line_info_table = ibf_dump_line_info_table(dump, iseq);
|
dump_body.insns_info = ibf_dump_insns_info(dump, iseq);
|
||||||
dump_body.local_table = ibf_dump_local_table(dump, iseq);
|
dump_body.local_table = ibf_dump_local_table(dump, iseq);
|
||||||
dump_body.catch_table = ibf_dump_catch_table(dump, iseq);
|
dump_body.catch_table = ibf_dump_catch_table(dump, iseq);
|
||||||
dump_body.parent_iseq = ibf_dump_iseq(dump, iseq->body->parent_iseq);
|
dump_body.parent_iseq = ibf_dump_iseq(dump, iseq->body->parent_iseq);
|
||||||
@ -8302,7 +8327,7 @@ ibf_load_iseq_each(const struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t of
|
|||||||
load_body->is_size = body->is_size;
|
load_body->is_size = body->is_size;
|
||||||
load_body->ci_size = body->ci_size;
|
load_body->ci_size = body->ci_size;
|
||||||
load_body->ci_kw_size = body->ci_kw_size;
|
load_body->ci_kw_size = body->ci_kw_size;
|
||||||
load_body->line_info_size = body->line_info_size;
|
load_body->insns_info_size = body->insns_info_size;
|
||||||
|
|
||||||
RB_OBJ_WRITE(iseq, &load_body->mark_ary, iseq_mark_ary_create((int)body->mark_ary));
|
RB_OBJ_WRITE(iseq, &load_body->mark_ary, iseq_mark_ary_create((int)body->mark_ary));
|
||||||
|
|
||||||
@ -8334,7 +8359,7 @@ ibf_load_iseq_each(const struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t of
|
|||||||
load_body->cc_entries = ZALLOC_N(struct rb_call_cache, body->ci_size + body->ci_kw_size);
|
load_body->cc_entries = ZALLOC_N(struct rb_call_cache, body->ci_size + body->ci_kw_size);
|
||||||
load_body->param.opt_table = ibf_load_param_opt_table(load, body);
|
load_body->param.opt_table = ibf_load_param_opt_table(load, body);
|
||||||
load_body->param.keyword = ibf_load_param_keyword(load, body);
|
load_body->param.keyword = ibf_load_param_keyword(load, body);
|
||||||
load_body->line_info_table = ibf_load_line_info_table(load, body);
|
load_body->insns_info = ibf_load_insns_info(load, body);
|
||||||
load_body->local_table = ibf_load_local_table(load, body);
|
load_body->local_table = ibf_load_local_table(load, body);
|
||||||
load_body->catch_table = ibf_load_catch_table(load, body);
|
load_body->catch_table = ibf_load_catch_table(load, body);
|
||||||
load_body->parent_iseq = ibf_load_iseq(load, body->parent_iseq);
|
load_body->parent_iseq = ibf_load_iseq(load, body->parent_iseq);
|
||||||
|
40
iseq.c
40
iseq.c
@ -74,7 +74,7 @@ rb_iseq_free(const rb_iseq_t *iseq)
|
|||||||
if (iseq) {
|
if (iseq) {
|
||||||
if (iseq->body) {
|
if (iseq->body) {
|
||||||
ruby_xfree((void *)iseq->body->iseq_encoded);
|
ruby_xfree((void *)iseq->body->iseq_encoded);
|
||||||
ruby_xfree((void *)iseq->body->line_info_table);
|
ruby_xfree((void *)iseq->body->insns_info);
|
||||||
ruby_xfree((void *)iseq->body->local_table);
|
ruby_xfree((void *)iseq->body->local_table);
|
||||||
ruby_xfree((void *)iseq->body->is_entries);
|
ruby_xfree((void *)iseq->body->is_entries);
|
||||||
|
|
||||||
@ -157,7 +157,7 @@ iseq_memsize(const rb_iseq_t *iseq)
|
|||||||
|
|
||||||
size += sizeof(struct rb_iseq_constant_body);
|
size += sizeof(struct rb_iseq_constant_body);
|
||||||
size += body->iseq_size * sizeof(VALUE);
|
size += body->iseq_size * sizeof(VALUE);
|
||||||
size += body->line_info_size * sizeof(struct iseq_line_info_entry);
|
size += body->insns_info_size * sizeof(struct iseq_insn_info_entry);
|
||||||
size += body->local_table_size * sizeof(ID);
|
size += body->local_table_size * sizeof(ID);
|
||||||
if (body->catch_table) {
|
if (body->catch_table) {
|
||||||
size += iseq_catch_table_bytes(body->catch_table->size);
|
size += iseq_catch_table_bytes(body->catch_table->size);
|
||||||
@ -1217,45 +1217,45 @@ iseqw_to_a(VALUE self)
|
|||||||
/* TODO: search algorithm is brute force.
|
/* TODO: search algorithm is brute force.
|
||||||
this should be binary search or so. */
|
this should be binary search or so. */
|
||||||
|
|
||||||
static const struct iseq_line_info_entry *
|
static const struct iseq_insn_info_entry *
|
||||||
get_line_info(const rb_iseq_t *iseq, size_t pos)
|
get_insn_info(const rb_iseq_t *iseq, size_t pos)
|
||||||
{
|
{
|
||||||
size_t i = 0, size = iseq->body->line_info_size;
|
size_t i = 0, size = iseq->body->insns_info_size;
|
||||||
const struct iseq_line_info_entry *table = iseq->body->line_info_table;
|
const struct iseq_insn_info_entry *insns_info = iseq->body->insns_info;
|
||||||
const int debug = 0;
|
const int debug = 0;
|
||||||
|
|
||||||
if (debug) {
|
if (debug) {
|
||||||
printf("size: %"PRIuSIZE"\n", size);
|
printf("size: %"PRIuSIZE"\n", size);
|
||||||
printf("table[%"PRIuSIZE"]: position: %d, line: %d, pos: %"PRIuSIZE"\n",
|
printf("insns_info[%"PRIuSIZE"]: position: %d, line: %d, pos: %"PRIuSIZE"\n",
|
||||||
i, table[i].position, table[i].line_no, pos);
|
i, insns_info[i].position, insns_info[i].line_no, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
else if (size == 1) {
|
else if (size == 1) {
|
||||||
return &table[0];
|
return &insns_info[0];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (i=1; i<size; i++) {
|
for (i=1; i<size; i++) {
|
||||||
if (debug) printf("table[%"PRIuSIZE"]: position: %d, line: %d, pos: %"PRIuSIZE"\n",
|
if (debug) printf("insns_info[%"PRIuSIZE"]: position: %d, line: %d, pos: %"PRIuSIZE"\n",
|
||||||
i, table[i].position, table[i].line_no, pos);
|
i, insns_info[i].position, insns_info[i].line_no, pos);
|
||||||
|
|
||||||
if (table[i].position == pos) {
|
if (insns_info[i].position == pos) {
|
||||||
return &table[i];
|
return &insns_info[i];
|
||||||
}
|
}
|
||||||
if (table[i].position > pos) {
|
if (insns_info[i].position > pos) {
|
||||||
return &table[i-1];
|
return &insns_info[i-1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return &table[i-1];
|
return &insns_info[i-1];
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int
|
static unsigned int
|
||||||
find_line_no(const rb_iseq_t *iseq, size_t pos)
|
find_line_no(const rb_iseq_t *iseq, size_t pos)
|
||||||
{
|
{
|
||||||
const struct iseq_line_info_entry *entry = get_line_info(iseq, pos);
|
const struct iseq_insn_info_entry *entry = get_insn_info(iseq, pos);
|
||||||
|
|
||||||
if (entry) {
|
if (entry) {
|
||||||
return entry->line_no;
|
return entry->line_no;
|
||||||
@ -2090,8 +2090,8 @@ iseq_data_to_ary(const rb_iseq_t *iseq)
|
|||||||
rb_ary_push(body, (VALUE)label);
|
rb_ary_push(body, (VALUE)label);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ti < iseq->body->line_info_size && iseq->body->line_info_table[ti].position == pos) {
|
if (ti < iseq->body->insns_info_size && iseq->body->insns_info[ti].position == pos) {
|
||||||
line = iseq->body->line_info_table[ti].line_no;
|
line = iseq->body->insns_info[ti].line_no;
|
||||||
rb_ary_push(body, INT2FIX(line));
|
rb_ary_push(body, INT2FIX(line));
|
||||||
ti++;
|
ti++;
|
||||||
}
|
}
|
||||||
|
4
iseq.h
4
iseq.h
@ -140,9 +140,9 @@ struct rb_compile_option_struct {
|
|||||||
int debug_level;
|
int debug_level;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct iseq_line_info_entry {
|
struct iseq_insn_info_entry {
|
||||||
unsigned int position;
|
unsigned int position;
|
||||||
unsigned int line_no;
|
int line_no;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct iseq_catch_table_entry {
|
struct iseq_catch_table_entry {
|
||||||
|
@ -383,7 +383,7 @@ struct rb_iseq_constant_body {
|
|||||||
rb_iseq_location_t location;
|
rb_iseq_location_t location;
|
||||||
|
|
||||||
/* insn info, must be freed */
|
/* insn info, must be freed */
|
||||||
const struct iseq_line_info_entry *line_info_table;
|
const struct iseq_insn_info_entry *insns_info;
|
||||||
|
|
||||||
const ID *local_table; /* must free */
|
const ID *local_table; /* must free */
|
||||||
|
|
||||||
@ -408,7 +408,7 @@ struct rb_iseq_constant_body {
|
|||||||
unsigned int is_size;
|
unsigned int is_size;
|
||||||
unsigned int ci_size;
|
unsigned int ci_size;
|
||||||
unsigned int ci_kw_size;
|
unsigned int ci_kw_size;
|
||||||
unsigned int line_info_size;
|
unsigned int insns_info_size;
|
||||||
unsigned int stack_max; /* for stack overflow check */
|
unsigned int stack_max; /* for stack overflow check */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user