diff options
author | wanabe <wanabe@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-03-22 11:44:01 +0000 |
---|---|---|
committer | wanabe <wanabe@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-03-22 11:44:01 +0000 |
commit | c46f71399ae54967e7247ac4df0c26adeddbffd6 (patch) | |
tree | 829ebc2a778a5306f6c403029fe5b04713fd480c /vm_method.c | |
parent | 5d8f69503299ef719c5523546cf2745de136cea9 (diff) | |
download | bundler-c46f71399ae54967e7247ac4df0c26adeddbffd6.tar.gz |
* proc.c (rb_method_location): return attr's location if it is setup.
[Feature #2084]
* NEWS: follow above.
* vm_method.c (rb_add_method): save attr's location.
* gc.c (mark_method_entry): mark attr's location.
* method.h (rb_method_definition_t): add member to save attr's location.
* vm_eval.c (vm_call0): follow above.
* vm_insnhelper.c (vm_call_method): ditto.
* vm_method.c (rb_method_definition_eq): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27016 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_method.c')
-rw-r--r-- | vm_method.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/vm_method.c b/vm_method.c index 5a78906a2e..4b5ab89e7c 100644 --- a/vm_method.c +++ b/vm_method.c @@ -260,6 +260,9 @@ method_added(VALUE klass, ID mid) rb_method_entry_t * rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *opts, rb_method_flag_t noex) { + rb_thread_t *th; + rb_control_frame_t *cfp; + int line; rb_method_entry_t *me = rb_add_method_def(klass, mid, type, 0, noex); rb_method_definition_t *def = ALLOC(rb_method_definition_t); me->def = def; @@ -275,7 +278,15 @@ rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *opts, rb_method_ break; case VM_METHOD_TYPE_ATTRSET: case VM_METHOD_TYPE_IVAR: - def->body.attr_id = (ID)opts; + def->body.attr.id = (ID)opts; + th = GET_THREAD(); + cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp); + if (cfp && (line = rb_vm_get_sourceline(cfp))) { + VALUE location = rb_ary_new3(2, cfp->iseq->filename, INT2FIX(line)); + def->body.attr.location = rb_ary_freeze(location); + } else { + def->body.attr.location = Qfalse; + } break; case VM_METHOD_TYPE_BMETHOD: def->body.proc = (VALUE)opts; @@ -838,7 +849,7 @@ rb_method_definition_eq(const rb_method_definition_t *d1, const rb_method_defini d1->body.cfunc.argc == d2->body.cfunc.argc; case VM_METHOD_TYPE_ATTRSET: case VM_METHOD_TYPE_IVAR: - return d1->body.attr_id == d2->body.attr_id; + return d1->body.attr.id == d2->body.attr.id; case VM_METHOD_TYPE_BMETHOD: return RTEST(rb_equal(d1->body.proc, d2->body.proc)); case VM_METHOD_TYPE_MISSING: |