Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
diff --git a/proc.c b/proc.c
index 19ce7a1d19..3eb8c9445d 100644
--- a/proc.c
+++ b/proc.c
@@ -1196,6 +1196,24 @@ iseq_location(const rb_iseq_t *iseq)
return rb_ary_new4(2, loc);
}
+static VALUE
+iseq_code_location(const rb_iseq_t *iseq)
+{
+ VALUE loc[5];
+ rb_code_location_t code_location;
+
+ if (!iseq) return Qnil;
+ rb_iseq_check(iseq);
+ loc[0] = rb_iseq_path(iseq);
+ code_location = iseq->body->location.code_location;
+ loc[1] = INT2FIX(code_location.beg_pos.lineno);
+ loc[2] = INT2FIX(code_location.beg_pos.column);
+ loc[3] = INT2FIX(code_location.end_pos.lineno);
+ loc[4] = INT2FIX(code_location.end_pos.column);
+
+ return rb_ary_new4(5, loc);
+}
+
MJIT_FUNC_EXPORTED VALUE
rb_iseq_location(const rb_iseq_t *iseq)
{
@@ -1216,6 +1234,20 @@ rb_proc_location(VALUE self)
return iseq_location(rb_proc_get_iseq(self, 0));
}
+/*
+ * call-seq:
+ * prc.code_location -> [String, Integer, Integer, Integer, Integer]
+ *
+ * Returns the Ruby source filename and code location
+ * or +nil+ if this proc was not defined in Ruby (i.e. native).
+ */
+
+VALUE
+rb_proc_code_location(VALUE self)
+{
+ return iseq_code_location(rb_proc_get_iseq(self, 0));
+}
+
VALUE
rb_unnamed_parameters(int arity)
{
@@ -3670,6 +3702,7 @@ Init_Proc(void)
rb_define_method(rb_cProc, "<<", proc_compose_to_left, 1);
rb_define_method(rb_cProc, ">>", proc_compose_to_right, 1);
rb_define_method(rb_cProc, "source_location", rb_proc_location, 0);
+ rb_define_method(rb_cProc, "code_location", rb_proc_code_location, 0);
rb_define_method(rb_cProc, "parameters", rb_proc_parameters, 0);
/* Exceptions */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.