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

ruby-changes:31158

From: ko1 <ko1@a...>
Date: Thu, 10 Oct 2013 17:31:55 +0900 (JST)
Subject: [ruby-changes:31158] ko1:r43237 (trunk): * vm.c (vm_exec): support :b_return event for "lambda{return}.call".

ko1	2013-10-10 17:31:48 +0900 (Thu, 10 Oct 2013)

  New Revision: 43237

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

  Log:
    * vm.c (vm_exec): support :b_return event for "lambda{return}.call".
      [Bug #8622]
    * test/ruby/test_settracefunc.rb: add a test.

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_settracefunc.rb
    trunk/vm.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 43236)
+++ ChangeLog	(revision 43237)
@@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Thu Oct 10 17:25:28 2013  Koichi Sasada  <ko1@a...>
+
+	* vm.c (vm_exec): support :b_return event for "lambda{return}.call".
+	  [Bug #8622]
+
+	* test/ruby/test_settracefunc.rb: add a test.
+
 Thu Oct 10 13:52:37 2013  Koichi Sasada  <ko1@a...>
 
 	* vm_trace.c (postponed_job): use preallocated buffer.
Index: vm.c
===================================================================
--- vm.c	(revision 43236)
+++ vm.c	(revision 43237)
@@ -1290,6 +1290,13 @@ vm_exec(rb_thread_t *th) https://github.com/ruby/ruby/blob/trunk/vm.c#L1290
 			if (!catch_iseqval) {
 			    result = GET_THROWOBJ_VAL(err);
 			    th->errinfo = Qnil;
+
+			    switch (VM_FRAME_TYPE(cfp)) {
+			      case VM_FRAME_MAGIC_LAMBDA:
+				EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_B_RETURN, th->cfp->self, 0, 0, Qnil);
+				break;
+			    }
+
 			    vm_pop_frame(th);
 			    goto finish_vme;
 			}
@@ -1435,6 +1442,7 @@ vm_exec(rb_thread_t *th) https://github.com/ruby/ruby/blob/trunk/vm.c#L1442
 		EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_RETURN, th->cfp->self, 0, 0, Qnil);
 		break;
 	      case VM_FRAME_MAGIC_BLOCK:
+	      case VM_FRAME_MAGIC_LAMBDA:
 		EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_B_RETURN, th->cfp->self, 0, 0, Qnil);
 		break;
 	      case VM_FRAME_MAGIC_CLASS:
Index: test/ruby/test_settracefunc.rb
===================================================================
--- test/ruby/test_settracefunc.rb	(revision 43236)
+++ test/ruby/test_settracefunc.rb	(revision 43237)
@@ -966,4 +966,29 @@ class TestSetTraceFunc < Test::Unit::Tes https://github.com/ruby/ruby/blob/trunk/test/ruby/test_settracefunc.rb#L966
 
     assert_equal 4, n
   end
+
+  def test_tracepoint_b_return_with_lambda
+    n = 0
+    TracePoint.new(:b_return){
+      n+=1
+    }.enable{
+      lambda{
+        return
+      }.call     # n += 1 #=> 1
+      3.times{
+        lambda{
+          return # n += 3 #=> 4
+        }.call
+      }          # n += 3 #=> 7
+      begin
+        lambda{
+          raise
+        }.call   # n += 1 #=> 8
+      rescue
+        # ignore
+      end        # n += 1 #=> 9
+    }
+
+    assert_equal 9, n
+  end
 end

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

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