@@ -5274,6 +5274,28 @@ vm_invoke_iseq_block(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp,
52745274 return Qundef ;
52755275}
52765276
5277+ static VALUE
5278+ vm_invoke_iseq_block_cc_param_1_local_1 (rb_execution_context_t * ec , rb_control_frame_t * reg_cfp ,
5279+ struct rb_calling_info * calling ) {
5280+ VALUE block_handler = VM_CF_BLOCK_HANDLER (GET_CFP ());
5281+ const struct rb_captured_block * captured = VM_BH_TO_ISEQ_BLOCK (block_handler );
5282+ const rb_iseq_t * iseq = rb_iseq_check (captured -> code .iseq );
5283+ const int arg_size = 1 ;
5284+ VALUE * const rsp = GET_SP () - 1 ;
5285+
5286+ SET_SP (rsp );
5287+
5288+ vm_push_frame (ec , iseq ,
5289+ VM_FRAME_MAGIC_BLOCK ,
5290+ captured -> self ,
5291+ VM_GUARDED_PREV_EP (captured -> ep ), 0 ,
5292+ ISEQ_BODY (iseq )-> iseq_encoded ,
5293+ rsp + arg_size ,
5294+ 1 - arg_size , ISEQ_BODY (iseq )-> stack_max );
5295+
5296+ return Qundef ;
5297+ }
5298+
52775299static VALUE
52785300vm_invoke_iseq_block_cc (rb_execution_context_t * ec , rb_control_frame_t * reg_cfp ,
52795301 struct rb_calling_info * calling ) {
@@ -5999,8 +6021,9 @@ vm_invokeblock_fastpath(struct rb_execution_context_struct *ec,
59996021 else {
60006022 if (rb_simple_iseq_p (callee_iseq ) &&
60016023 (vm_ci_flag (ci ) & VM_CALL_ARGS_SIMPLE ) &&
6002- vm_ci_argc (ci ) == (unsigned int )ISEQ_BODY (callee_iseq )-> param .lead_num &&
6024+ vm_ci_argc (ci ) == (unsigned int )ISEQ_BODY (callee_iseq )-> param .size &&
60036025 ISEQ_BODY (callee_iseq )-> param .flags .ambiguous_param0 ) {
6026+
60046027 if (!ISEQ_BODY (callee_iseq )-> block_ccs ) {
60056028 ISEQ_BODY (callee_iseq )-> block_ccs = ZALLOC (struct rb_class_cc_entries );
60066029 }
@@ -6014,7 +6037,14 @@ vm_invokeblock_fastpath(struct rb_execution_context_struct *ec,
60146037 return ccs -> entries [i ].cc ;
60156038 }
60166039 }
6017- ret = vm_cc_new ((VALUE )callee_iseq , NULL , vm_invoke_iseq_block_cc , cc_type_block );
6040+
6041+ if (argc == 1 && ISEQ_BODY (callee_iseq )-> local_table_size == 1 ) {
6042+ ret = vm_cc_new ((VALUE )callee_iseq , NULL , vm_invoke_iseq_block_cc_param_1_local_1 , cc_type_block );
6043+ }
6044+ else {
6045+ ret = vm_cc_new ((VALUE )callee_iseq , NULL , vm_invoke_iseq_block_cc , cc_type_block );
6046+ }
6047+
60186048 cd -> cc = ret ;
60196049 RB_OBJ_WRITTEN (reg_cfp -> iseq , Qundef , ret );
60206050 vm_ccs_push ((VALUE )callee_iseq , ISEQ_BODY (callee_iseq )-> block_ccs , ci , ret );
0 commit comments