Permalink
Browse files

* vm_core.h: add a data type rb_location_t to store iseq location

  information.
  rb_location_t#filename, filepath, name and line_no was moved from
  rb_iseq_t.  rb_location_t#basename is a new field which is
  similar to `name' field without any decoration.
  `name' field contains some decoration such as `block in foo'.
  `basename' only contains `foo'.
  rb_iseq_t contains memory object of rb_location_t.
* iseq.c: setup rb_location_t for each rb_iseq_t memory objects.
* compile.c, proc.c, vm.c, vm_dump.c, vm_eval.c, vm_insnhelper.c,
  vm_method.c: support about it.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35756 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information...
1 parent 9c46e77 commit 8bcf7fc40266faa09cf8b6cebb2d96c1bb8d51ee @ko1 ko1 committed May 22, 2012
Showing with 114 additions and 77 deletions.
  1. +16 −0 ChangeLog
  2. +20 −20 compile.c
  3. +46 −31 iseq.c
  4. +4 −4 proc.c
  5. +7 −7 vm.c
  6. +11 −5 vm_core.h
  7. +4 −4 vm_dump.c
  8. +1 −1 vm_eval.c
  9. +2 −2 vm_insnhelper.c
  10. +3 −3 vm_method.c
View
@@ -1,3 +1,19 @@
+Tue May 22 16:49:15 2012 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: add a data type rb_location_t to store iseq location
+ information.
+ rb_location_t#filename, filepath, name and line_no was moved from
+ rb_iseq_t. rb_location_t#basename is a new field which is
+ similar to `name' field without any decoration.
+ `name' field contains some decoration such as `block in foo'.
+ `basename' only contains `foo'.
+ rb_iseq_t contains memory object of rb_location_t.
+
+ * iseq.c: setup rb_location_t for each rb_iseq_t memory objects.
+
+ * compile.c, proc.c, vm.c, vm_dump.c, vm_eval.c, vm_insnhelper.c,
+ vm_method.c: support about it.
+
Tue May 22 00:45:05 2012 Yusuke Endoh <mame@tsg.ne.jp>
* struct.c (rb_struct_members): Refactoring. As Struct#members had
View
@@ -166,10 +166,10 @@ r_value(VALUE value)
#define NEW_LABEL(l) new_label_body(iseq, (l))
#define iseq_filename(iseq) \
- (((rb_iseq_t*)DATA_PTR(iseq))->filename)
+ (((rb_iseq_t*)DATA_PTR(iseq))->location.filename)
#define iseq_filepath(iseq) \
- (((rb_iseq_t*)DATA_PTR(iseq))->filepath)
+ (((rb_iseq_t*)DATA_PTR(iseq))->location.filepath)
#define NEW_ISEQVAL(node, name, type, line_no) \
new_child_iseq(iseq, (node), (name), 0, (type), (line_no))
@@ -423,7 +423,7 @@ iseq_add_mark_object(rb_iseq_t *iseq, VALUE v)
return COMPILE_OK;
}
-#define ruby_sourcefile RSTRING_PTR(iseq->filename)
+#define ruby_sourcefile RSTRING_PTR(iseq->location.filename)
static int
iseq_add_mark_object_compile_time(rb_iseq_t *iseq, VALUE v)
@@ -491,13 +491,13 @@ rb_iseq_compile_node(VALUE self, NODE *node)
break;
}
case ISEQ_TYPE_CLASS: {
- ADD_TRACE(ret, FIX2INT(iseq->line_no), RUBY_EVENT_CLASS);
+ ADD_TRACE(ret, FIX2INT(iseq->location.line_no), RUBY_EVENT_CLASS);
COMPILE(ret, "scoped node", node->nd_body);
ADD_TRACE(ret, nd_line(node), RUBY_EVENT_END);
break;
}
case ISEQ_TYPE_METHOD: {
- ADD_TRACE(ret, FIX2INT(iseq->line_no), RUBY_EVENT_CALL);
+ ADD_TRACE(ret, FIX2INT(iseq->location.line_no), RUBY_EVENT_CALL);
COMPILE(ret, "scoped node", node->nd_body);
ADD_TRACE(ret, nd_line(node), RUBY_EVENT_RETURN);
break;
@@ -1376,7 +1376,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
default:
dump_disasm_list(FIRST_ELEMENT(anchor));
dump_disasm_list(list);
- rb_compile_error(RSTRING_PTR(iseq->filename), line,
+ rb_compile_error(RSTRING_PTR(iseq->location.filename), line,
"error: set_sequence");
break;
}
@@ -1419,7 +1419,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
if (iobj->operand_size != len - 1) {
/* printf("operand size miss! (%d, %d)\n", iobj->operand_size, len); */
dump_disasm_list(list);
- rb_compile_error(RSTRING_PTR(iseq->filename), iobj->line_no,
+ rb_compile_error(RSTRING_PTR(iseq->location.filename), iobj->line_no,
"operand size miss! (%d for %d)",
iobj->operand_size, len - 1);
xfree(generated_iseq);
@@ -1436,7 +1436,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
/* label(destination position) */
lobj = (LABEL *)operands[j];
if (!lobj->set) {
- rb_compile_error(RSTRING_PTR(iseq->filename), iobj->line_no,
+ rb_compile_error(RSTRING_PTR(iseq->location.filename), iobj->line_no,
"unknown label");
}
if (lobj->sp == -1) {
@@ -1502,7 +1502,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
}
break;
default:
- rb_compile_error(RSTRING_PTR(iseq->filename), iobj->line_no,
+ rb_compile_error(RSTRING_PTR(iseq->location.filename), iobj->line_no,
"unknown operand type: %c", type);
xfree(generated_iseq);
xfree(line_info_table);
@@ -2045,7 +2045,7 @@ insn_set_sc_state(rb_iseq_t *iseq, INSN *iobj, int state)
dump_disasm_list((LINK_ELEMENT *)iobj);
dump_disasm_list((LINK_ELEMENT *)lobj);
printf("\n-- %d, %d\n", lobj->sc_state, nstate);
- rb_compile_error(RSTRING_PTR(iseq->filename), iobj->line_no,
+ rb_compile_error(RSTRING_PTR(iseq->location.filename), iobj->line_no,
"insn_set_sc_state error\n");
return 0;
}
@@ -2147,7 +2147,7 @@ iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
case SCS_XX:
goto normal_insn;
default:
- rb_compile_error(RSTRING_PTR(iseq->filename), iobj->line_no,
+ rb_compile_error(RSTRING_PTR(iseq->location.filename), iobj->line_no,
"unreachable");
}
/* remove useless pop */
@@ -2449,7 +2449,7 @@ when_vals(rb_iseq_t *iseq, LINK_ANCHOR *cond_seq, NODE *vals, LABEL *l1, int onl
}
else {
if (rb_hash_lookup(literals, lit) != Qnil) {
- rb_compile_warning(RSTRING_PTR(iseq->filename), nd_line(val), "duplicated when clause is ignored");
+ rb_compile_warning(RSTRING_PTR(iseq->location.filename), nd_line(val), "duplicated when clause is ignored");
}
else {
rb_hash_aset(literals, lit, (VALUE)(l1) | 1);
@@ -2897,7 +2897,7 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
VALUE rescue = NEW_CHILD_ISEQVAL(NEW_NIL(),
rb_str_concat(rb_str_new2
("defined guard in "),
- iseq->name),
+ iseq->location.name),
ISEQ_TYPE_DEFINED_GUARD, 0);
APPEND_LABEL(ret, lcur, lstart);
ADD_LABEL(ret, lend);
@@ -2924,10 +2924,10 @@ make_name_for_block(rb_iseq_t *iseq)
}
if (level == 1) {
- return rb_sprintf("block in %s", RSTRING_PTR(ip->name));
+ return rb_sprintf("block in %s", RSTRING_PTR(ip->location.name));
}
else {
- return rb_sprintf("block (%d levels) in %s", level, RSTRING_PTR(ip->name));
+ return rb_sprintf("block (%d levels) in %s", level, RSTRING_PTR(ip->location.name));
}
}
@@ -3649,7 +3649,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
LABEL *lcont = NEW_LABEL(nd_line(node));
VALUE rescue = NEW_CHILD_ISEQVAL(
node->nd_resq,
- rb_str_concat(rb_str_new2("rescue in "), iseq->name),
+ rb_str_concat(rb_str_new2("rescue in "), iseq->location.name),
ISEQ_TYPE_RESCUE, nd_line(node));
ADD_LABEL(ret, lstart);
@@ -3731,7 +3731,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
VALUE ensure = NEW_CHILD_ISEQVAL(node->nd_ensr,
rb_str_concat(rb_str_new2
("ensure in "),
- iseq->name),
+ iseq->location.name),
ISEQ_TYPE_ENSURE, nd_line(node));
LABEL *lstart = NEW_LABEL(nd_line(node));
LABEL *lend = NEW_LABEL(nd_line(node));
@@ -4917,7 +4917,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
LABEL *lfin = NEW_LABEL(nd_line(node));
LABEL *ltrue = NEW_LABEL(nd_line(node));
VALUE key = rb_sprintf("flipflag/%s-%p-%d",
- RSTRING_PTR(iseq->name), (void *)iseq,
+ RSTRING_PTR(iseq->location.name), (void *)iseq,
iseq->compile_data->flip_cnt++);
hide_obj(key);
@@ -5454,12 +5454,12 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *anchor,
if (st_lookup(insn_table, (st_data_t)insn, &insn_id) == 0) {
/* TODO: exception */
RB_GC_GUARD(insn) = rb_inspect(insn);
- rb_compile_error(RSTRING_PTR(iseq->filename), line_no,
+ rb_compile_error(RSTRING_PTR(iseq->location.filename), line_no,
"unknown instruction: %s", RSTRING_PTR(insn));
}
if (argc != insn_len((VALUE)insn_id)-1) {
- rb_compile_error(RSTRING_PTR(iseq->filename), line_no,
+ rb_compile_error(RSTRING_PTR(iseq->location.filename), line_no,
"operand size mismatch");
}
View
77 iseq.c
@@ -69,8 +69,8 @@ iseq_free(void *ptr)
if (!iseq->orig) {
/* It's possible that strings are freed */
if (0) {
- RUBY_GC_INFO("%s @ %s\n", RSTRING_PTR(iseq->name),
- RSTRING_PTR(iseq->filename));
+ RUBY_GC_INFO("%s @ %s\n", RSTRING_PTR(iseq->location.name),
+ RSTRING_PTR(iseq->location.filename));
}
if (iseq->iseq != iseq->iseq_encoded) {
@@ -99,11 +99,14 @@ iseq_mark(void *ptr)
if (ptr) {
rb_iseq_t *iseq = ptr;
- RUBY_GC_INFO("%s @ %s\n", RSTRING_PTR(iseq->name), RSTRING_PTR(iseq->filename));
+ RUBY_GC_INFO("%s @ %s\n", RSTRING_PTR(iseq->location.name), RSTRING_PTR(iseq->location.filename));
RUBY_MARK_UNLESS_NULL(iseq->mark_ary);
- RUBY_MARK_UNLESS_NULL(iseq->name);
- RUBY_MARK_UNLESS_NULL(iseq->filename);
- RUBY_MARK_UNLESS_NULL(iseq->filepath);
+
+ RUBY_MARK_UNLESS_NULL(iseq->location.name);
+ RUBY_MARK_UNLESS_NULL(iseq->location.basename);
+ RUBY_MARK_UNLESS_NULL(iseq->location.filename);
+ RUBY_MARK_UNLESS_NULL(iseq->location.filepath);
+
RUBY_MARK_UNLESS_NULL((VALUE)iseq->cref_stack);
RUBY_MARK_UNLESS_NULL(iseq->klass);
RUBY_MARK_UNLESS_NULL(iseq->coverage);
@@ -175,6 +178,17 @@ iseq_alloc(VALUE klass)
return TypedData_Make_Struct(klass, rb_iseq_t, &iseq_data_type, iseq);
}
+static rb_location_t *
+iseq_location_setup(rb_iseq_t *iseq, VALUE filename, VALUE filepath, VALUE name, size_t line_no)
+{
+ rb_location_t *loc = &iseq->location;
+ loc->filename = filename;
+ loc->filepath = filepath;
+ loc->name = loc->basename = name;
+ loc->line_no = line_no;
+ return loc;
+}
+
static void
set_relation(rb_iseq_t *iseq, const VALUE parent)
{
@@ -225,23 +239,26 @@ prepare_iseq_build(rb_iseq_t *iseq,
VALUE parent, enum iseq_type type, VALUE block_opt,
const rb_compile_option_t *option)
{
+ iseq->type = type;
+ iseq->arg_rest = -1;
+ iseq->arg_block = -1;
+ iseq->arg_keyword = -1;
+ iseq->klass = 0;
+ set_relation(iseq, parent);
+
OBJ_FREEZE(name);
OBJ_FREEZE(filename);
- iseq->name = name;
- iseq->filename = filename;
- iseq->filepath = filepath;
- iseq->line_no = (unsigned short)line_no; /* TODO: really enough? */
+ iseq_location_setup(iseq, filename, filepath, name, line_no);
+ if (iseq != iseq->local_iseq) {
+ iseq->location.basename = iseq->local_iseq->location.name;
+ }
+
iseq->defined_method_id = 0;
iseq->mark_ary = rb_ary_tmp_new(3);
OBJ_UNTRUST(iseq->mark_ary);
RBASIC(iseq->mark_ary)->klass = 0;
- iseq->type = type;
- iseq->arg_rest = -1;
- iseq->arg_block = -1;
- iseq->arg_keyword = -1;
- iseq->klass = 0;
/*
* iseq->special_block_builder = GC_GUARDED_PTR_REF(block_opt);
@@ -269,8 +286,6 @@ prepare_iseq_build(rb_iseq_t *iseq,
iseq->compile_data->option = option;
iseq->compile_data->last_coverable_line = -1;
- set_relation(iseq, parent);
-
iseq->coverage = Qfalse;
if (!GET_THREAD()->parse_in_eval) {
VALUE coverages = rb_get_coverages();
@@ -292,7 +307,7 @@ cleanup_iseq_build(rb_iseq_t *iseq)
compile_data_free(data);
if (RTEST(err)) {
- rb_funcall2(err, rb_intern("set_backtrace"), 1, &iseq->filename);
+ rb_funcall2(err, rb_intern("set_backtrace"), 1, &iseq->location.filename);
rb_exc_raise(err);
}
return Qtrue;
@@ -560,7 +575,7 @@ rb_iseq_compile_with_option(VALUE src, VALUE file, VALUE filepath, VALUE line, V
make_compile_option(&option, opt);
if (th->base_block && th->base_block->iseq) {
- return rb_iseq_new_with_opt(node, th->base_block->iseq->name,
+ return rb_iseq_new_with_opt(node, th->base_block->iseq->location.name,
file, filepath, line, th->base_block->iseq->self,
ISEQ_TYPE_EVAL, &option);
}
@@ -636,7 +651,7 @@ iseq_check(VALUE val)
{
rb_iseq_t *iseq;
GetISeqPtr(val, iseq);
- if (!iseq->name) {
+ if (!iseq->location.name) {
rb_raise(rb_eTypeError, "uninitialized InstructionSequence");
}
return iseq;
@@ -654,13 +669,13 @@ iseq_inspect(VALUE self)
{
rb_iseq_t *iseq;
GetISeqPtr(self, iseq);
- if (!iseq->name) {
+ if (!iseq->location.name) {
return rb_sprintf("#<%s: uninitialized>", rb_obj_classname(self));
}
return rb_sprintf("<%s:%s@%s>",
rb_obj_classname(self),
- RSTRING_PTR(iseq->name), RSTRING_PTR(iseq->filename));
+ RSTRING_PTR(iseq->location.name), RSTRING_PTR(iseq->location.filename));
}
static
@@ -677,7 +692,7 @@ iseq_to_a(VALUE self)
int
rb_iseq_first_lineno(const rb_iseq_t *iseq)
{
- return FIX2INT(iseq->line_no);
+ return FIX2INT(iseq->location.line_no);
}
/* TODO: search algorithm is brute force.
@@ -808,7 +823,7 @@ insn_operand_intern(rb_iseq_t *iseq,
{
rb_iseq_t *iseq = (rb_iseq_t *)op;
if (iseq) {
- ret = iseq->name;
+ ret = iseq->location.name;
if (child) {
rb_ary_push(child, iseq->self);
}
@@ -1342,10 +1357,10 @@ iseq_data_to_ary(rb_iseq_t *iseq)
rb_ary_push(val, INT2FIX(ISEQ_MINOR_VERSION)); /* minor */
rb_ary_push(val, INT2FIX(1));
rb_ary_push(val, misc);
- rb_ary_push(val, iseq->name);
- rb_ary_push(val, iseq->filename);
- rb_ary_push(val, iseq->filepath);
- rb_ary_push(val, iseq->line_no);
+ rb_ary_push(val, iseq->location.name);
+ rb_ary_push(val, iseq->location.filename);
+ rb_ary_push(val, iseq->location.filepath);
+ rb_ary_push(val, iseq->location.line_no);
rb_ary_push(val, type);
rb_ary_push(val, locals);
rb_ary_push(val, args);
@@ -1482,9 +1497,9 @@ rb_iseq_build_for_ruby2cext(
/* copy iseq */
*iseq = *iseq_template;
- iseq->name = rb_str_new2(name);
- iseq->filename = rb_str_new2(filename);
- iseq->line_no = line_no;
+ iseq->location.name = rb_str_new2(name);
+ iseq->location.filename = rb_str_new2(filename);
+ iseq->location.line_no = line_no;
iseq->mark_ary = rb_ary_tmp_new(3);
OBJ_UNTRUST(iseq->mark_ary);
iseq->self = iseqval;
Oops, something went wrong.

0 comments on commit 8bcf7fc

Please sign in to comment.