mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* vm_insnhelper.c (vm_invoke_block): returning from lambda proc
now always exits from the Proc. [ruby-core:56193] [Feature #8693] * NEWS, test/ruby/test_lambda.rb: ditto. Patch by nobu. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42455 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									4a7afb71ec
								
							
						
					
					
						commit
						214cbdc943
					
				
					 4 changed files with 37 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,10 @@
 | 
			
		|||
Fri Aug  9 10:42:11 2013  Kazuki Tsujimoto  <kazuki@callcc.net>
 | 
			
		||||
 | 
			
		||||
	* vm_insnhelper.c (vm_invoke_block): returning from lambda proc
 | 
			
		||||
	  now always exits from the Proc. [ruby-core:56193] [Feature #8693]
 | 
			
		||||
 | 
			
		||||
	* NEWS, test/ruby/test_lambda.rb: ditto. Patch by nobu.
 | 
			
		||||
 | 
			
		||||
Fri Aug  9 00:10:32 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* enumerator.c (lazy_zip_func): fix non-single argument.  fix
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								NEWS
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								NEWS
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -97,6 +97,11 @@ with all sufficient information, see the ChangeLog file.
 | 
			
		|||
  * Raises TypeError instead of ArgumentError if the receiver doesn't have
 | 
			
		||||
    to_r method.
 | 
			
		||||
 | 
			
		||||
* Proc
 | 
			
		||||
  * Returning from lambda proc now always exits from the Proc, not from the
 | 
			
		||||
    method where the lambda is created.  Returing from non-lambda proc exits
 | 
			
		||||
    from the method, same as the former behavior.
 | 
			
		||||
 | 
			
		||||
=== Stdlib updates (outstanding ones only)
 | 
			
		||||
 | 
			
		||||
* Digest
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,4 +89,24 @@ class TestLambdaParameters < Test::Unit::TestCase
 | 
			
		|||
    assert_send([e.backtrace.first, :start_with?, "#{__FILE__}:#{line}:"], bug6151)
 | 
			
		||||
    assert_equal(0, called)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def return_in_current(val)
 | 
			
		||||
    1.tap &->(*) {return 0}
 | 
			
		||||
    val
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def yield_block
 | 
			
		||||
    yield
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def return_in_callee(val)
 | 
			
		||||
    yield_block &->(*) {return 0}
 | 
			
		||||
    val
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_return
 | 
			
		||||
    feature8693 = '[ruby-core:56193] [Feature #8693]'
 | 
			
		||||
    assert_equal(42, return_in_current(42), feature8693)
 | 
			
		||||
    assert_equal(42, return_in_callee(42), feature8693)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2328,12 +2328,15 @@ vm_invoke_block(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_call_info_t *ci
 | 
			
		|||
    if (BUILTIN_TYPE(iseq) != T_NODE) {
 | 
			
		||||
	int opt_pc;
 | 
			
		||||
	const int arg_size = iseq->arg_size;
 | 
			
		||||
	int is_lambda = block_proc_is_lambda(block->proc);
 | 
			
		||||
	VALUE * const rsp = GET_SP() - ci->argc;
 | 
			
		||||
	SET_SP(rsp);
 | 
			
		||||
 | 
			
		||||
	opt_pc = vm_yield_setup_args(th, iseq, ci->argc, rsp, 0, block_proc_is_lambda(block->proc));
 | 
			
		||||
	opt_pc = vm_yield_setup_args(th, iseq, ci->argc, rsp, 0, is_lambda);
 | 
			
		||||
 | 
			
		||||
	vm_push_frame(th, iseq, VM_FRAME_MAGIC_BLOCK, block->self,
 | 
			
		||||
	vm_push_frame(th, iseq,
 | 
			
		||||
		      is_lambda ? VM_FRAME_MAGIC_LAMBDA : VM_FRAME_MAGIC_BLOCK,
 | 
			
		||||
		      block->self,
 | 
			
		||||
		      block->klass,
 | 
			
		||||
		      VM_ENVVAL_PREV_EP_PTR(block->ep),
 | 
			
		||||
		      iseq->iseq_encoded + opt_pc,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue