From c2f5a574034cacd938d5af888646585c850f2747 Mon Sep 17 00:00:00 2001 From: ko1 Date: Thu, 6 Dec 2012 03:13:50 +0000 Subject: * vm_trace.c: TracePoint#enable should not cause an error when it is already enabled. TracePoint#disable is too. [ruby-core:50561] [ruby-trunk - Bug #7513] * test/ruby/test_settracefunc.rb: add tests. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38227 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_trace.c | 57 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 26 deletions(-) (limited to 'vm_trace.c') diff --git a/vm_trace.c b/vm_trace.c index bedf41a9b6..d4c31ec941 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -952,20 +952,23 @@ rb_tracepoint_disable(VALUE tpval) /* * call-seq: - * trace.enable -> trace + * trace.enable -> true or false * 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 #=> # + * 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. + * block. * * trace.enabled? * #=> false @@ -978,6 +981,8 @@ rb_tracepoint_disable(VALUE tpval) * trace.enabled? * #=> false * + * Note: You cannot access event hooks within the block. + * * trace.enable { p tp.lineno } * #=> RuntimeError: access from outside * @@ -986,36 +991,36 @@ 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; } } /* * call-seq: - * trace.disable -> trace + * trace.disable -> tru eo rfalse * trace.disable { block } -> obj * * 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 #=> # + * 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. + * block. * * trace.enabled? * #=> true @@ -1028,25 +1033,25 @@ tracepoint_enable_m(VALUE tpval) * trace.enabled? * #=> true * - * trace.enable { p trace.lineno } - * #=> RuntimeError: access from outside + * Note: You cannot access event hooks within the block. * + * trace.disable { p tp.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; } } -- cgit v1.2.3