From 8c138db3d28828365f86f276ec753a248d2e0a19 Mon Sep 17 00:00:00 2001 From: ko1 Date: Mon, 26 Nov 2012 23:01:45 +0000 Subject: * 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 --- ChangeLog | 11 +++++++++ vm_core.h | 8 +++++++ vm_trace.c | 77 +++++++++++++++++++++++++++++++------------------------------- 3 files changed, 57 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index 432a3dc7c5..50b31c1582 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Tue Nov 27 07:58:03 2012 Koichi Sasada + + * 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 * thread.c (rb_thread_terminate_all): add RUBY_VM_CHECK_INTS_BLOCKING(). diff --git a/vm_core.h b/vm_core.h index f9b6181f54..511e324a29 100644 --- a/vm_core.h +++ b/vm_core.h @@ -905,6 +905,12 @@ typedef struct rb_trace_arg_struct { ID id; VALUE klass; VALUE data; + + int klass_solved; + + /* calc from cfp */ + int line; + VALUE file; } rb_trace_arg_t; 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.klass = (klass_); \ trace_arg.data = (data_); \ + trace_arg.file = Qundef; \ + trace_arg.klass_solved = 0; \ rb_threadptr_exec_event_hooks(&trace_arg); \ } \ } \ diff --git a/vm_trace.c b/vm_trace.c index 23f412e541..e02376324c 100644 --- a/vm_trace.c +++ b/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); 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 rb_tracepoint_attr_line(VALUE tpval) { rb_tp_t *tp = tpptr(tpval); - rb_control_frame_t *cfp; tp_attr_check_active(tp); - - cfp = rb_vm_get_ruby_level_next_cfp(tp->trace_arg->th, tp->trace_arg->cfp); - if (cfp) { - return INT2FIX(rb_vm_get_sourceline(cfp)); - } - else { - return INT2FIX(0); - } + fill_file_and_line(tp->trace_arg); + return INT2FIX(tp->trace_arg->line); } VALUE rb_tracepoint_attr_file(VALUE tpval) { rb_tp_t *tp = tpptr(tpval); - rb_control_frame_t *cfp; tp_attr_check_active(tp); - - cfp = rb_vm_get_ruby_level_next_cfp(tp->trace_arg->th, tp->trace_arg->cfp); - if (cfp) { - return cfp->iseq->location.path; - } - else { - return Qnil; - } + fill_file_and_line(tp->trace_arg); + return tp->trace_arg->file; } static void fill_id_and_klass(rb_trace_arg_t *trace_arg) { - if (!trace_arg->klass) - rb_vm_control_frame_id_and_class(trace_arg->cfp, &trace_arg->id, &trace_arg->klass); + if (!trace_arg->klass_solved) { + 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 (RB_TYPE_P(trace_arg->klass, T_ICLASS)) { - trace_arg->klass = RBASIC(trace_arg->klass)->klass; + if (trace_arg->klass) { + if (RB_TYPE_P(trace_arg->klass, T_ICLASS)) { + 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)) { - trace_arg->klass = rb_iv_get(trace_arg->klass, "__attached__"); + else { + 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); tp_attr_check_active(tp); fill_id_and_klass(tp->trace_arg); - if (tp->trace_arg->id) { - return ID2SYM(tp->trace_arg->id); - } - else { - return Qnil; - } + return tp->trace_arg->id ? ID2SYM(tp->trace_arg->id) : Qnil; } VALUE @@ -710,13 +716,7 @@ rb_tracepoint_attr_klass(VALUE tpval) rb_tp_t *tp = tpptr(tpval); tp_attr_check_active(tp); fill_id_and_klass(tp->trace_arg); - - if (tp->trace_arg->klass) { - return tp->trace_arg->klass; - } - else { - return Qnil; - } + return tp->trace_arg->klass; } VALUE @@ -780,7 +780,6 @@ rb_tracepoint_attr_raised_exception(VALUE tpval) return tp->trace_arg->data; } - static void tp_call_trace(VALUE tpval, rb_trace_arg_t *trace_arg) { -- cgit v1.2.3