[前][次][番号順一覧][スレッド一覧]

ruby-changes:25817

From: ko1 <ko1@a...>
Date: Tue, 27 Nov 2012 08:09:37 +0900 (JST)
Subject: [ruby-changes:25817] ko1:r37874 (trunk): * vm_core.h: add members to rb_trace_arg_t:

ko1	2012-11-27 08:01:45 +0900 (Tue, 27 Nov 2012)

  New Revision: 37874

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37874

  Log:
    * 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.

  Modified files:
    trunk/ChangeLog
    trunk/vm_core.h
    trunk/vm_trace.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37873)
+++ ChangeLog	(revision 37874)
@@ -1,3 +1,14 @@
+Tue Nov 27 07:58:03 2012  Koichi Sasada  <ko1@a...>
+
+	* 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@g...>
 
 	* thread.c (rb_thread_terminate_all): add RUBY_VM_CHECK_INTS_BLOCKING().
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 37873)
+++ vm_core.h	(revision 37874)
@@ -905,6 +905,12 @@
     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 @@
 	    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); \
 	} \
     } \
Index: vm_trace.c
===================================================================
--- vm_trace.c	(revision 37873)
+++ vm_trace.c	(revision 37874)
@@ -642,51 +642,62 @@
 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_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_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 @@
     return tp->trace_arg->data;
 }
 
-
 static void
 tp_call_trace(VALUE tpval, rb_trace_arg_t *trace_arg)
 {

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]