* vm_core.h: add members to rb_trace_arg_t:
* `klass_solved' represents klass and id is checked. * `line' represents line calculated from cfp. * `file' represents line calculated from cfp. * vm_trace.c: fix to use above data stractures. No need to calculate klass and id, line and file pairs for each trace points. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
253938067a
commit
8c138db3d2
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
Tue Nov 27 07:58:03 2012 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* vm_core.h: add members to rb_trace_arg_t:
|
||||||
|
* `klass_solved' represents klass and id is checked.
|
||||||
|
* `line' represents line calculated from cfp.
|
||||||
|
* `file' represents line calculated from cfp.
|
||||||
|
|
||||||
|
* vm_trace.c: fix to use above data stractures.
|
||||||
|
No need to calculate klass and id, line and file
|
||||||
|
pairs for each trace points.
|
||||||
|
|
||||||
Tue Nov 27 07:47:09 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
Tue Nov 27 07:47:09 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||||
|
|
||||||
* thread.c (rb_thread_terminate_all): add RUBY_VM_CHECK_INTS_BLOCKING().
|
* thread.c (rb_thread_terminate_all): add RUBY_VM_CHECK_INTS_BLOCKING().
|
||||||
|
@ -905,6 +905,12 @@ typedef struct rb_trace_arg_struct {
|
|||||||
ID id;
|
ID id;
|
||||||
VALUE klass;
|
VALUE klass;
|
||||||
VALUE data;
|
VALUE data;
|
||||||
|
|
||||||
|
int klass_solved;
|
||||||
|
|
||||||
|
/* calc from cfp */
|
||||||
|
int line;
|
||||||
|
VALUE file;
|
||||||
} rb_trace_arg_t;
|
} rb_trace_arg_t;
|
||||||
|
|
||||||
void rb_threadptr_exec_event_hooks(rb_trace_arg_t *trace_arg);
|
void rb_threadptr_exec_event_hooks(rb_trace_arg_t *trace_arg);
|
||||||
@ -920,6 +926,8 @@ void rb_threadptr_exec_event_hooks(rb_trace_arg_t *trace_arg);
|
|||||||
trace_arg.id = (id_); \
|
trace_arg.id = (id_); \
|
||||||
trace_arg.klass = (klass_); \
|
trace_arg.klass = (klass_); \
|
||||||
trace_arg.data = (data_); \
|
trace_arg.data = (data_); \
|
||||||
|
trace_arg.file = Qundef; \
|
||||||
|
trace_arg.klass_solved = 0; \
|
||||||
rb_threadptr_exec_event_hooks(&trace_arg); \
|
rb_threadptr_exec_event_hooks(&trace_arg); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
77
vm_trace.c
77
vm_trace.c
@ -642,51 +642,62 @@ rb_control_frame_t *rb_vm_get_ruby_level_next_cfp(rb_thread_t *th, rb_control_fr
|
|||||||
int rb_vm_control_frame_id_and_class(rb_control_frame_t *cfp, ID *idp, VALUE *klassp);
|
int rb_vm_control_frame_id_and_class(rb_control_frame_t *cfp, ID *idp, VALUE *klassp);
|
||||||
VALUE rb_binding_new_with_cfp(rb_thread_t *th, rb_control_frame_t *src_cfp);
|
VALUE rb_binding_new_with_cfp(rb_thread_t *th, rb_control_frame_t *src_cfp);
|
||||||
|
|
||||||
|
static void
|
||||||
|
fill_file_and_line(rb_trace_arg_t *trace_arg)
|
||||||
|
{
|
||||||
|
if (trace_arg->file == Qundef) {
|
||||||
|
rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(trace_arg->th, trace_arg->cfp);
|
||||||
|
|
||||||
|
if (cfp) {
|
||||||
|
trace_arg->file = cfp->iseq->location.path;
|
||||||
|
trace_arg->line = rb_vm_get_sourceline(cfp);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
trace_arg->file = Qnil;
|
||||||
|
trace_arg->line = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_tracepoint_attr_line(VALUE tpval)
|
rb_tracepoint_attr_line(VALUE tpval)
|
||||||
{
|
{
|
||||||
rb_tp_t *tp = tpptr(tpval);
|
rb_tp_t *tp = tpptr(tpval);
|
||||||
rb_control_frame_t *cfp;
|
|
||||||
tp_attr_check_active(tp);
|
tp_attr_check_active(tp);
|
||||||
|
fill_file_and_line(tp->trace_arg);
|
||||||
cfp = rb_vm_get_ruby_level_next_cfp(tp->trace_arg->th, tp->trace_arg->cfp);
|
return INT2FIX(tp->trace_arg->line);
|
||||||
if (cfp) {
|
|
||||||
return INT2FIX(rb_vm_get_sourceline(cfp));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return INT2FIX(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_tracepoint_attr_file(VALUE tpval)
|
rb_tracepoint_attr_file(VALUE tpval)
|
||||||
{
|
{
|
||||||
rb_tp_t *tp = tpptr(tpval);
|
rb_tp_t *tp = tpptr(tpval);
|
||||||
rb_control_frame_t *cfp;
|
|
||||||
tp_attr_check_active(tp);
|
tp_attr_check_active(tp);
|
||||||
|
fill_file_and_line(tp->trace_arg);
|
||||||
cfp = rb_vm_get_ruby_level_next_cfp(tp->trace_arg->th, tp->trace_arg->cfp);
|
return tp->trace_arg->file;
|
||||||
if (cfp) {
|
|
||||||
return cfp->iseq->location.path;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return Qnil;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fill_id_and_klass(rb_trace_arg_t *trace_arg)
|
fill_id_and_klass(rb_trace_arg_t *trace_arg)
|
||||||
{
|
{
|
||||||
if (!trace_arg->klass)
|
if (!trace_arg->klass_solved) {
|
||||||
rb_vm_control_frame_id_and_class(trace_arg->cfp, &trace_arg->id, &trace_arg->klass);
|
if (!trace_arg->klass) {
|
||||||
|
rb_vm_control_frame_id_and_class(trace_arg->cfp, &trace_arg->id, &trace_arg->klass);
|
||||||
|
}
|
||||||
|
|
||||||
if (trace_arg->klass) {
|
if (trace_arg->klass) {
|
||||||
if (RB_TYPE_P(trace_arg->klass, T_ICLASS)) {
|
if (RB_TYPE_P(trace_arg->klass, T_ICLASS)) {
|
||||||
trace_arg->klass = RBASIC(trace_arg->klass)->klass;
|
trace_arg->klass = RBASIC(trace_arg->klass)->klass;
|
||||||
|
}
|
||||||
|
else if (FL_TEST(trace_arg->klass, FL_SINGLETON)) {
|
||||||
|
trace_arg->klass = rb_iv_get(trace_arg->klass, "__attached__");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (FL_TEST(trace_arg->klass, FL_SINGLETON)) {
|
else {
|
||||||
trace_arg->klass = rb_iv_get(trace_arg->klass, "__attached__");
|
trace_arg->klass = Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trace_arg->klass_solved = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -696,12 +707,7 @@ rb_tracepoint_attr_id(VALUE tpval)
|
|||||||
rb_tp_t *tp = tpptr(tpval);
|
rb_tp_t *tp = tpptr(tpval);
|
||||||
tp_attr_check_active(tp);
|
tp_attr_check_active(tp);
|
||||||
fill_id_and_klass(tp->trace_arg);
|
fill_id_and_klass(tp->trace_arg);
|
||||||
if (tp->trace_arg->id) {
|
return tp->trace_arg->id ? ID2SYM(tp->trace_arg->id) : Qnil;
|
||||||
return ID2SYM(tp->trace_arg->id);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return Qnil;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
@ -710,13 +716,7 @@ rb_tracepoint_attr_klass(VALUE tpval)
|
|||||||
rb_tp_t *tp = tpptr(tpval);
|
rb_tp_t *tp = tpptr(tpval);
|
||||||
tp_attr_check_active(tp);
|
tp_attr_check_active(tp);
|
||||||
fill_id_and_klass(tp->trace_arg);
|
fill_id_and_klass(tp->trace_arg);
|
||||||
|
return tp->trace_arg->klass;
|
||||||
if (tp->trace_arg->klass) {
|
|
||||||
return tp->trace_arg->klass;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return Qnil;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
@ -780,7 +780,6 @@ rb_tracepoint_attr_raised_exception(VALUE tpval)
|
|||||||
return tp->trace_arg->data;
|
return tp->trace_arg->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
tp_call_trace(VALUE tpval, rb_trace_arg_t *trace_arg)
|
tp_call_trace(VALUE tpval, rb_trace_arg_t *trace_arg)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user