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

ruby-changes:34929

From: nagachika <ko1@a...>
Date: Thu, 31 Jul 2014 01:21:13 +0900 (JST)
Subject: [ruby-changes:34929] nagachika:r47012 (ruby_2_1): merge revision(s) r46463: [Backport #9957]

nagachika	2014-07-31 01:21:05 +0900 (Thu, 31 Jul 2014)

  New Revision: 47012

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

  Log:
    merge revision(s) r46463: [Backport #9957]
    
    * vm_core.h: add VM_FRAME_MAGIC_RESCUE to recognize normal block or
      rescue clause.
    
    * vm.c (vm_exec): use VM_FRAME_MAGIC_RESCUE on at rescue/ensure.
    
    * test/ruby/test_settracefunc.rb: should not invoke b_return at rescue
      clause.
      [Bug #9957]
    
    * vm_dump.c (control_frame_dump): check VM_FRAME_MAGIC_RESCUE.
    
    * vm_dump.c (vm_stack_dump_each): ditto.

  Modified directories:
    branches/ruby_2_1/
  Modified files:
    branches/ruby_2_1/ChangeLog
    branches/ruby_2_1/test/ruby/test_settracefunc.rb
    branches/ruby_2_1/version.h
    branches/ruby_2_1/vm.c
    branches/ruby_2_1/vm_core.h
    branches/ruby_2_1/vm_dump.c
Index: ruby_2_1/ChangeLog
===================================================================
--- ruby_2_1/ChangeLog	(revision 47011)
+++ ruby_2_1/ChangeLog	(revision 47012)
@@ -1,3 +1,18 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_1/ChangeLog#L1
+Thu Jul 31 01:12:55 2014  Koichi Sasada  <ko1@a...>
+
+	* vm_core.h: add VM_FRAME_MAGIC_RESCUE to recognize normal block or
+	  rescue clause.
+
+	* vm.c (vm_exec): use VM_FRAME_MAGIC_RESCUE on at rescue/ensure.
+
+	* test/ruby/test_settracefunc.rb: should not invoke b_return at rescue
+	  clause.
+	  [Bug #9957]
+
+	* vm_dump.c (control_frame_dump): check VM_FRAME_MAGIC_RESCUE.
+
+	* vm_dump.c (vm_stack_dump_each): ditto.
+
 Thu Jul 31 00:44:34 2014  Koichi Sasada  <ko1@a...>
 
 	* vm_trace.c: clear and restore recursive checking thread local data
Index: ruby_2_1/vm_core.h
===================================================================
--- ruby_2_1/vm_core.h	(revision 47011)
+++ ruby_2_1/vm_core.h	(revision 47012)
@@ -764,7 +764,8 @@ enum vm_special_object_type { https://github.com/ruby/ruby/blob/trunk/ruby_2_1/vm_core.h#L764
 #define VM_FRAME_MAGIC_IFUNC  0x81
 #define VM_FRAME_MAGIC_EVAL   0x91
 #define VM_FRAME_MAGIC_LAMBDA 0xa1
-#define VM_FRAME_MAGIC_MASK_BITS   8
+#define VM_FRAME_MAGIC_RESCUE 0xb1
+#define VM_FRAME_MAGIC_MASK_BITS 8
 #define VM_FRAME_MAGIC_MASK   (~(~0<<VM_FRAME_MAGIC_MASK_BITS))
 
 #define VM_FRAME_TYPE(cfp) ((cfp)->flag & VM_FRAME_MAGIC_MASK)
Index: ruby_2_1/vm.c
===================================================================
--- ruby_2_1/vm.c	(revision 47011)
+++ ruby_2_1/vm.c	(revision 47012)
@@ -1214,6 +1214,7 @@ vm_frametype_name(const rb_control_frame https://github.com/ruby/ruby/blob/trunk/ruby_2_1/vm.c#L1214
       case VM_FRAME_MAGIC_IFUNC:  return "ifunc";
       case VM_FRAME_MAGIC_EVAL:   return "eval";
       case VM_FRAME_MAGIC_LAMBDA: return "lambda";
+      case VM_FRAME_MAGIC_RESCUE: return "rescue";
       default:
 	rb_bug("unknown frame");
     }
@@ -1518,7 +1519,7 @@ vm_exec(rb_thread_t *th) https://github.com/ruby/ruby/blob/trunk/ruby_2_1/vm.c#L1519
 
 	    /* push block frame */
 	    cfp->sp[0] = err;
-	    vm_push_frame(th, catch_iseq, VM_FRAME_MAGIC_BLOCK,
+	    vm_push_frame(th, catch_iseq, VM_FRAME_MAGIC_RESCUE,
 			  cfp->self, cfp->klass,
 			  VM_ENVVAL_PREV_EP_PTR(cfp->ep),
 			  catch_iseq->iseq_encoded,
Index: ruby_2_1/version.h
===================================================================
--- ruby_2_1/version.h	(revision 47011)
+++ ruby_2_1/version.h	(revision 47012)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_1/version.h#L1
 #define RUBY_VERSION "2.1.2"
 #define RUBY_RELEASE_DATE "2014-07-31"
-#define RUBY_PATCHLEVEL 183
+#define RUBY_PATCHLEVEL 184
 
 #define RUBY_RELEASE_YEAR 2014
 #define RUBY_RELEASE_MONTH 7
Index: ruby_2_1/vm_dump.c
===================================================================
--- ruby_2_1/vm_dump.c	(revision 47011)
+++ ruby_2_1/vm_dump.c	(revision 47012)
@@ -73,6 +73,9 @@ control_frame_dump(rb_thread_t *th, rb_c https://github.com/ruby/ruby/blob/trunk/ruby_2_1/vm_dump.c#L73
       case VM_FRAME_MAGIC_EVAL:
 	magic = "EVAL";
 	break;
+      case VM_FRAME_MAGIC_RESCUE:
+	magic = "RESCUE";
+	break;
       case 0:
 	magic = "------";
 	break;
@@ -268,15 +271,17 @@ vm_stack_dump_each(rb_thread_t *th, rb_c https://github.com/ruby/ruby/blob/trunk/ruby_2_1/vm_dump.c#L271
 
     /* stack trace header */
 
-    if (VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_METHOD ||
-	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_TOP ||
+    if (VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_METHOD||
+	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_TOP   ||
 	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_BLOCK ||
 	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CLASS ||
-	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_PROC ||
-	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_LAMBDA ||
+	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_PROC  ||
+	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_LAMBDA||
 	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CFUNC ||
 	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_IFUNC ||
-	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_EVAL) {
+	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_EVAL  ||
+	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_RESCUE)
+      {
 
 	VALUE *ptr = ep - local_size;
 
Index: ruby_2_1/test/ruby/test_settracefunc.rb
===================================================================
--- ruby_2_1/test/ruby/test_settracefunc.rb	(revision 47011)
+++ ruby_2_1/test/ruby/test_settracefunc.rb	(revision 47012)
@@ -1196,4 +1196,40 @@ class TestSetTraceFunc < Test::Unit::Tes https://github.com/ruby/ruby/blob/trunk/ruby_2_1/test/ruby/test_settracefunc.rb#L1196
       raise if stack != [:p, :hash, :inspect]
     }, '[Bug #9940]'
   end
+
+  def method_test_rescue_should_not_cause_b_return
+    begin
+      raise
+    rescue
+      return
+    end
+  end
+
+  def method_test_ensure_should_not_cause_b_return
+    begin
+      raise
+    ensure
+      return
+    end
+  end
+
+  def test_rescue_and_ensure_should_not_cause_b_return
+    curr_thread = Thread.current
+    trace = TracePoint.new(:b_call, :b_return){
+      next if curr_thread != Thread.current
+      flunk("Should not reach here because there is no block.")
+    }
+
+    begin
+      trace.enable
+      method_test_rescue_should_not_cause_b_return
+      begin
+        method_test_ensure_should_not_cause_b_return
+      rescue
+        # ignore
+      end
+    ensure
+      trace.disable
+    end
+  end
 end

Property changes on: ruby_2_1
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r46463


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

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