[#50466] [ruby-trunk - Bug #7492][Open] Segmentation fault at DL::TestDL#test_call_double on x64 Windows 8 — "phasis68 (Heesob Park)" <phasis@...>

23 messages 2012/12/02

[#50558] [ruby-trunk - Feature #7511][Open] short-circuiting logical implication operator — "rits (First Last)" <redmine@...>

12 messages 2012/12/04

[#50575] [ruby-trunk - Feature #7517][Open] Fixnum::MIN,MAX — "matz (Yukihiro Matsumoto)" <matz@...>

20 messages 2012/12/05

[#50755] Becoming a committer — Charlie Somerville <charlie@...>

Hi ruby-core,

21 messages 2012/12/11
[#50759] Re: Becoming a committer — Yukihiro Matsumoto <matz@...> 2012/12/11

Hi,

[#50784] Re: Becoming a committer — Charles Oliver Nutter <headius@...> 2012/12/11

It's really this easy? If so, I'll send over my public key today :)

[#50795] Re: Becoming a committer — Yukihiro Matsumoto <matz@...> 2012/12/11

Hi,

[#50806] [ruby-trunk - Feature #7548][Open] Load and Require Callbacks — "trans (Thomas Sawyer)" <transfire@...>

12 messages 2012/12/12

[#50810] [ruby-trunk - Feature #7549][Open] A Ruby Design Process — "brixen (Brian Ford)" <brixen@...>

34 messages 2012/12/12

[#50867] [ruby-trunk - Bug #7556][Assigned] test error on refinement — "usa (Usaku NAKAMURA)" <usa@...>

14 messages 2012/12/13

[#50900] [ruby-trunk - Bug #7564][Open] r38175 introduces incompatibility — "tenderlovemaking (Aaron Patterson)" <aaron@...>

14 messages 2012/12/14

[#50951] [ruby-trunk - Bug #7584][Open] Ruby hangs when shutting down an ssl connection in gc finalization — "bpot (Bob Potter)" <bobby.potter@...>

12 messages 2012/12/17

[#51076] [ruby-trunk - Feature #7604][Open] Make === comparison operator ability to delegate comparison to an argument — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

12 messages 2012/12/22

[#51170] [ruby-trunk - Bug #7629][Open] Segmentation fault — "atd (Antonio Tapiador)" <atapiador@...>

13 messages 2012/12/28

[ruby-core:50564] Re: [ruby-trunk - Bug #7513][Open] TracePoint#enable/disable should not cause error

From: SASADA Koichi <ko1@...>
Date: 2012-12-05 04:07:17 UTC
List: ruby-core #50564
(2012/12/05 11:52), ko1 (Koichi Sasada) wrote:
> TracePoint#enable/disable should not cause error if it is enabled or disabled.

Patch:
---

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 38200)
+++ ChangeLog	(working copy)
@@ -1,3 +1,11 @@
+Wed Dec  5 12:45:30 2012  Koichi Sasada  <ko1@atdot.net>
+
+	* vm_trace.c: TracePoint#enable should not cause an error
+	  when it is already enabled. TracePoint#disable is too.
+	  [Bug #7513]
+
+	* test/ruby/test_settracefunc.rb: fix tests.
+
 Wed Dec  5 11:42:38 2012  Koichi Sasada  <ko1@atdot.net>

 	* test/ruby/test_settracefunc.rb: disable trace.
Index: vm_trace.c
===================================================================
--- vm_trace.c	(revision 38199)
+++ vm_trace.c	(working copy)
@@ -952,17 +952,20 @@ rb_tracepoint_disable(VALUE tpval)

 /*
  * call-seq:
- *	trace.enable		-> trace
+ *	trace.enable		-> bool
  *	trace.enable { block }	-> obj
  *
  * Activates the trace
  *
- * Will raise a RuntimeError if the trace is already activated
+ * Return true if trace was enabled.
+ * Return false if trace was disabled.
  *
  *	trace.enabled?  #=> false
- *	trace.enable    #=> #<TracePoint:0x007fa3fad4aaa8>
+ *	trace.enable    #=> false (previous state)
+ *                      #   trace is enabled
  *	trace.enabled?  #=> true
- *	trace.enable    #=> RuntimeError
+ *	trace.enable    #=> true (previous state)
+ *                      #   trace is still enabled
  *
  * If a block is given, the trace will only be enabled within the scope
of the
  * block. Note: You cannot access event hooks within the block.
@@ -986,17 +989,16 @@ static VALUE
 tracepoint_enable_m(VALUE tpval)
 {
     rb_tp_t *tp = tpptr(tpval);
-
-    if (tp->tracing) {
-	rb_raise(rb_eRuntimeError, "trace is already enable");
-    }
-
+    int previous_tracing = tp->tracing;
     rb_tracepoint_enable(tpval);
+
     if (rb_block_given_p()) {
-	return rb_ensure(rb_yield, Qnil, rb_tracepoint_disable, tpval);
+	return rb_ensure(rb_yield, Qnil,
+			 previous_tracing ? rb_tracepoint_enable : rb_tracepoint_disable,
+			 tpval);
     }
     else {
-	return tpval;
+	return previous_tracing ? Qtrue : Qfalse;
     }
 }

@@ -1007,12 +1009,13 @@ tracepoint_enable_m(VALUE tpval)
  *
  * Deactivates the trace
  *
- * Will raise a RuntimeError if the trace is already deactivated
+ * Return true if trace was enabled.
+ * Return false if trace was disabled.
  *
  *	trace.enabled?	#=> true
- *	trace.disable	#=> #<TracePoint:0x007fa3fad4aaa8>
+ *	trace.disable	#=> false (previous status)
  *	trace.enabled?	#=> false
- *	trace.disable	#=> RuntimeError
+ *	trace.disable	#=> false
  *
  * If a block is given, the trace will only be disable within the scope
of the
  * block. Note: You cannot access event hooks within the block.
@@ -1028,25 +1031,21 @@ tracepoint_enable_m(VALUE tpval)
  *	trace.enabled?
  *	#=> true
  *
- *	trace.enable { p trace.lineno }
- *	#=> RuntimeError: access from outside
- *
  */
 static VALUE
 tracepoint_disable_m(VALUE tpval)
 {
     rb_tp_t *tp = tpptr(tpval);
-
-    if (!tp->tracing) {
-	rb_raise(rb_eRuntimeError, "trace is not enable");
-    }
-
+    int previous_tracing = tp->tracing;
     rb_tracepoint_disable(tpval);
+
     if (rb_block_given_p()) {
-	return rb_ensure(rb_yield, Qnil, rb_tracepoint_enable, tpval);
+	return rb_ensure(rb_yield, Qnil,
+			 previous_tracing ? rb_tracepoint_enable : rb_tracepoint_disable,
+			 tpval);
     }
     else {
-	return tpval;
+	return previous_tracing ? Qtrue : Qfalse;
     }
 }

Index: test/ruby/test_settracefunc.rb
===================================================================
--- test/ruby/test_settracefunc.rb	(revision 38200)
+++ test/ruby/test_settracefunc.rb	(working copy)
@@ -619,6 +619,16 @@ class TestSetTraceFunc < Test::Unit::Tes
     }
     foo
     assert_equal([:foo], ary)
+
+    trace = TracePoint.new{}
+    begin
+      assert_equal(false, trace.enable)
+      assert_equal(true, trace.enable)
+      trace.enable{}
+      assert_equal(true, trace.enable)
+    ensure
+      trace.disable
+    end
   end

   def test_tracepoint_disable
@@ -633,6 +643,14 @@ class TestSetTraceFunc < Test::Unit::Tes
     foo
     trace.disable
     assert_equal([:foo, :foo], ary)
+
+    trace = TracePoint.new{}
+    trace.enable{
+      assert_equal(true, trace.disable)
+      assert_equal(false, trace.disable)
+      trace.disable{}
+      assert_equal(false, trace.disable)
+    }
   end

   def test_tracepoint_enabled


-- 
// SASADA Koichi at atdot dot net

In This Thread