summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-12-15 19:13:15 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-12-15 19:13:15 +0000
commita3450f473382f091973d874128883a1cad04c1ba (patch)
treeff0fb186da6f8f14b385349e41ade5bbb38bc153
parent20748861d4fa27997a174e4511b9454456483e91 (diff)
iseq.c: use caller location
* iseq.c (rb_method_for_self_aref, rb_method_for_self_aset): set same location as the caller. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48851 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--iseq.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/iseq.c b/iseq.c
index 015c860d2f..de304906fe 100644
--- a/iseq.c
+++ b/iseq.c
@@ -548,13 +548,28 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt)
return iseqval;
}
+static VALUE
+caller_location(VALUE *path)
+{
+ rb_thread_t *th = GET_THREAD();
+ rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp);
+ if (cfp) {
+ int line = rb_vm_get_sourceline(cfp);
+ *path = cfp->iseq->location.path;
+ return INT2FIX(line);
+ }
+ else {
+ *path = rb_str_new2("<compiled>");
+ return INT2FIX(1);
+ }
+}
+
VALUE
rb_method_for_self_aref(VALUE name, VALUE arg)
{
VALUE iseqval = iseq_alloc(rb_cISeq);
rb_iseq_t *iseq;
- VALUE path = rb_str_new2("<compiled>");
- VALUE lineno = INT2FIX(1);
+ VALUE path, lineno = caller_location(&path);
VALUE parent = 0;
VALUE misc, locals, params, exception, body, send_arg;
int flag = VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE;
@@ -603,8 +618,7 @@ rb_method_for_self_aset(VALUE name, VALUE arg)
{
VALUE iseqval = iseq_alloc(rb_cISeq);
rb_iseq_t *iseq;
- VALUE path = rb_str_new2("<compiled>");
- VALUE lineno = INT2FIX(1);
+ VALUE path, lineno = caller_location(&path);
VALUE parent = 0;
VALUE misc, locals, params, exception, body, send_arg;
int flag = VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE;