aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-12-10 20:54:01 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-12-13 20:47:07 +0900
commitf3b1b645edfc5a8c938da74a5ed44564b9e2fc08 (patch)
tree179e4a63909d91df39894e98728baf92cc1d8765
parent0b5268afbcf11c299e11102c366e836ae55cc39f (diff)
downloadruby-f3b1b645edfc5a8c938da74a5ed44564b9e2fc08.tar.gz
Create backtrace location array directly
-rw-r--r--common.mk1
-rw-r--r--error.c6
-rw-r--r--eval_intern.h1
-rw-r--r--vm_backtrace.c6
4 files changed, 7 insertions, 7 deletions
diff --git a/common.mk b/common.mk
index debc6d5efb..b2e5b2b6d0 100644
--- a/common.mk
+++ b/common.mk
@@ -1980,6 +1980,7 @@ error.$(OBJEXT): {$(VPATH)}config.h
error.$(OBJEXT): {$(VPATH)}defines.h
error.$(OBJEXT): {$(VPATH)}encoding.h
error.$(OBJEXT): {$(VPATH)}error.c
+error.$(OBJEXT): {$(VPATH)}eval_intern.h
error.$(OBJEXT): {$(VPATH)}id.h
error.$(OBJEXT): {$(VPATH)}intern.h
error.$(OBJEXT): {$(VPATH)}internal.h
diff --git a/error.c b/error.c
index 14114fc93c..b2f6565dfe 100644
--- a/error.c
+++ b/error.c
@@ -292,6 +292,7 @@ warning_write(int argc, VALUE *argv, VALUE buf)
return buf;
}
+VALUE rb_ec_backtrace_location_ary(rb_execution_context_t *ec, long lev, long n);
static VALUE
rb_warn_m(rb_execution_context_t *ec, VALUE exc, VALUE msgs, VALUE uplevel)
{
@@ -302,14 +303,11 @@ rb_warn_m(rb_execution_context_t *ec, VALUE exc, VALUE msgs, VALUE uplevel)
if (!NIL_P(ruby_verbose) && argc > 0) {
VALUE str = argv[0];
if (!NIL_P(uplevel)) {
- VALUE args[2];
long lev = NUM2LONG(uplevel);
if (lev < 0) {
rb_raise(rb_eArgError, "negative level (%ld)", lev);
}
- args[0] = LONG2NUM(lev + 1);
- args[1] = INT2FIX(1);
- location = rb_vm_thread_backtrace_locations(2, args, GET_THREAD()->self);
+ location = rb_ec_backtrace_location_ary(ec, lev + 1, 1);
if (!NIL_P(location)) {
location = rb_ary_entry(location, 0);
}
diff --git a/eval_intern.h b/eval_intern.h
index 1ab049d327..aa07ce30ed 100644
--- a/eval_intern.h
+++ b/eval_intern.h
@@ -287,6 +287,7 @@ VALUE rb_vm_cbase(void);
/* vm_backtrace.c */
VALUE rb_ec_backtrace_object(const rb_execution_context_t *ec);
VALUE rb_ec_backtrace_str_ary(const rb_execution_context_t *ec, long lev, long n);
+VALUE rb_ec_backtrace_location_ary(const rb_execution_context_t *ec, long lev, long n);
#ifndef CharNext /* defined as CharNext[AW] on Windows. */
# ifdef HAVE_MBLEN
diff --git a/vm_backtrace.c b/vm_backtrace.c
index 5b79e3d274..2c9649a7c2 100644
--- a/vm_backtrace.c
+++ b/vm_backtrace.c
@@ -716,8 +716,8 @@ rb_ec_backtrace_str_ary(const rb_execution_context_t *ec, long lev, long n)
return backtrace_to_str_ary(rb_ec_backtrace_object(ec), lev, n);
}
-static VALUE
-ec_backtrace_location_ary(const rb_execution_context_t *ec, long lev, long n)
+VALUE
+rb_ec_backtrace_location_ary(const rb_execution_context_t *ec, long lev, long n)
{
return backtrace_to_location_ary(rb_ec_backtrace_object(ec), lev, n);
}
@@ -1240,7 +1240,7 @@ rb_debug_inspector_open(rb_debug_inspector_func_t func, void *data)
dbg_context.ec = ec;
dbg_context.cfp = dbg_context.ec->cfp;
- dbg_context.backtrace = ec_backtrace_location_ary(ec, 0, 0);
+ dbg_context.backtrace = rb_ec_backtrace_location_ary(ec, 0, 0);
dbg_context.backtrace_size = RARRAY_LEN(dbg_context.backtrace);
dbg_context.contexts = collect_caller_bindings(ec);