mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	escape all env properly.
* vm_backtrace.c (rb_debug_inspector_open): escape all env using `rb_vm_stack_to_heap()` before making bindings. [Bug #15105] There is a complicated story of this issue: Without this patch, IFUNC frame does not escaped. A IFUNC frame points to CFUNC ep as previous ep. However, CFUNC ep can be escaped because of making bindings of Ruby level frames. IFUNC's ep can points to invalidated ep and `rb_iter_break()` will fail. This is why `any?` fails. * test/-ext-/debug/test_debug.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64800 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									a810a1a78c
								
							
						
					
					
						commit
						ac4b2d990c
					
				
					 2 changed files with 19 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -56,4 +56,20 @@ class TestDebug < Test::Unit::TestCase
 | 
			
		|||
    binds = inspector_in_eval
 | 
			
		||||
    binds_check binds, bug7635
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  class MyRelation 
 | 
			
		||||
    include Enumerable 
 | 
			
		||||
 
 | 
			
		||||
    def each
 | 
			
		||||
      yield :each_entry
 | 
			
		||||
    end 
 | 
			
		||||
   end 
 | 
			
		||||
 
 | 
			
		||||
  def test_lazy_block
 | 
			
		||||
    x = MyRelation.new.any? do
 | 
			
		||||
      Bug::Debug.inspector
 | 
			
		||||
      true
 | 
			
		||||
    end 
 | 
			
		||||
    assert_equal true, x, '[Bug #15105]'
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1202,6 +1202,9 @@ rb_debug_inspector_open(rb_debug_inspector_func_t func, void *data)
 | 
			
		|||
    enum ruby_tag_type state;
 | 
			
		||||
    volatile VALUE MAYBE_UNUSED(result);
 | 
			
		||||
 | 
			
		||||
    /* escape all env to heap */
 | 
			
		||||
    rb_vm_stack_to_heap(ec);
 | 
			
		||||
 | 
			
		||||
    dbg_context.ec = ec;
 | 
			
		||||
    dbg_context.cfp = dbg_context.ec->cfp;
 | 
			
		||||
    dbg_context.backtrace = ec_backtrace_location_ary(ec, 0, 0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue