summaryrefslogtreecommitdiff
path: root/vm_trace.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-26 23:01:45 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-26 23:01:45 +0000
commit8c138db3d28828365f86f276ec753a248d2e0a19 (patch)
treead65c7238ae7fc7ee494465a4f45eca531377060 /vm_trace.c
parent253938067a37d7ba9751ec1afbbd6033f886cab4 (diff)
* 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
Diffstat (limited to 'vm_trace.c')
-rw-r--r--vm_trace.c77
1 files changed, 38 insertions, 39 deletions
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)
{