1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

iseq.c: show function name if possible

* iseq.c (rb_insn_operand_intern): show the name of the nearest
  run-time symbol if possible.

* compile.c (insn_data_to_s_detail): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48858 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2014-12-16 01:14:27 +00:00
parent 389ea73014
commit 1d5c5ea153
2 changed files with 29 additions and 2 deletions

View file

@ -18,6 +18,10 @@
#include "insns.inc" #include "insns.inc"
#include "insns_info.inc" #include "insns_info.inc"
#ifdef HAVE_DLADDR
# include <dlfcn.h>
#endif
#define FIXNUM_INC(n, i) ((n)+(INT2FIX(i)&~FIXNUM_FLAG)) #define FIXNUM_INC(n, i) ((n)+(INT2FIX(i)&~FIXNUM_FLAG))
#define FIXNUM_OR(n, i) ((n)|INT2FIX(i)) #define FIXNUM_OR(n, i) ((n)|INT2FIX(i))
@ -5604,7 +5608,17 @@ insn_data_to_s_detail(INSN *iobj)
rb_str_cat2(str, "<ch>"); rb_str_cat2(str, "<ch>");
break; break;
case TS_FUNCPTR: case TS_FUNCPTR:
rb_str_catf(str, "<%p>", (rb_insn_func_t)OPERAND_AT(iobj, j)); {
rb_insn_func_t func = (rb_insn_func_t)OPERAND_AT(iobj, j);
#ifdef HAVE_DLADDR
Dl_info info;
if (dladdr(func, &info) && info.dli_sname) {
rb_str_cat2(str, info.dli_sname);
break;
}
#endif
rb_str_catf(str, "<%p>", func);
}
break; break;
default:{ default:{
rb_raise(rb_eSyntaxError, "unknown operand type: %c", type); rb_raise(rb_eSyntaxError, "unknown operand type: %c", type);

15
iseq.c
View file

@ -13,6 +13,10 @@
#include "ruby/util.h" #include "ruby/util.h"
#include "eval_intern.h" #include "eval_intern.h"
#ifdef HAVE_DLADDR
# include <dlfcn.h>
#endif
/* #define RUBY_MARK_FREE_DEBUG 1 */ /* #define RUBY_MARK_FREE_DEBUG 1 */
#include "gc.h" #include "gc.h"
#include "vm_core.h" #include "vm_core.h"
@ -1375,7 +1379,16 @@ rb_insn_operand_intern(const rb_iseq_t *iseq,
break; break;
case TS_FUNCPTR: case TS_FUNCPTR:
ret = rb_str_new2("<funcptr>"); {
#ifdef HAVE_DLADDR
Dl_info info;
if (dladdr((void *)op, &info) && info.dli_sname) {
ret = rb_str_new_cstr(info.dli_sname);
break;
}
#endif
ret = rb_str_new2("<funcptr>");
}
break; break;
default: default: