@@ -467,6 +467,7 @@ mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p)
467
467
{
468
468
mrb_callinfo * ci = mrb -> c -> ci ;
469
469
470
+ mrb -> c -> stack [0 ] = self ;
470
471
ci -> proc = p ;
471
472
ci -> target_class = p -> target_class ;
472
473
if (MRB_PROC_CFUNC_P (p )) {
@@ -562,7 +563,8 @@ eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c)
562
563
}
563
564
ci = mrb -> c -> ci ;
564
565
if (ci -> acc == CI_ACC_DIRECT ) {
565
- return mrb_yield_with_class (mrb , blk , 1 , & self , self , c );
566
+ ci -> target_class = c ;
567
+ return mrb_yield_cont (mrb , blk , self , 1 , & self );
566
568
}
567
569
ci -> target_class = c ;
568
570
p = mrb_proc_ptr (blk );
@@ -726,6 +728,29 @@ mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg)
726
728
return mrb_yield_with_class (mrb , b , 1 , & arg , p -> env -> stack [0 ], p -> target_class );
727
729
}
728
730
731
+ mrb_value
732
+ mrb_yield_cont (mrb_state * mrb , mrb_value b , mrb_value self , mrb_int argc , const mrb_value * argv )
733
+ {
734
+ struct RProc * p ;
735
+ mrb_callinfo * ci ;
736
+
737
+ if (mrb_nil_p (b )) {
738
+ mrb_raise (mrb , E_ARGUMENT_ERROR , "no block given" );
739
+ }
740
+ if (mrb_type (b ) != MRB_TT_PROC ) {
741
+ mrb_raise (mrb , E_TYPE_ERROR , "not a block" );
742
+ }
743
+
744
+ p = mrb_proc_ptr (b );
745
+ ci = mrb -> c -> ci ;
746
+
747
+ stack_extend (mrb , 3 );
748
+ mrb -> c -> stack [1 ] = mrb_ary_new_from_values (mrb , argc , argv );
749
+ mrb -> c -> stack [2 ] = mrb_nil_value ();
750
+ ci -> argc = -1 ;
751
+ return mrb_exec_irep (mrb , self , p );
752
+ }
753
+
729
754
typedef enum {
730
755
LOCALJUMP_ERROR_RETURN = 0 ,
731
756
LOCALJUMP_ERROR_BREAK = 1 ,
0 commit comments