@@ -3743,6 +3743,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
3743
3743
VALUE argc ;
3744
3744
unsigned long flag = 0 ;
3745
3745
ID id = node -> nd_mid ;
3746
+ int boff = 0 ;
3746
3747
3747
3748
/*
3748
3749
* a[x] (op)= y
@@ -3771,15 +3772,18 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
3771
3772
ADD_INSN (ret , nd_line (node ), putnil );
3772
3773
}
3773
3774
COMPILE (ret , "NODE_OP_ASGN1 recv" , node -> nd_recv );
3774
- if (nd_type (node -> nd_args -> nd_head ) != NODE_ZARRAY ) {
3775
+ switch (nd_type (node -> nd_args -> nd_head )) {
3776
+ case NODE_ZARRAY :
3777
+ argc = INT2FIX (0 );
3778
+ break ;
3779
+ case NODE_BLOCK_PASS :
3780
+ boff = 1 ;
3781
+ default :
3775
3782
INIT_ANCHOR (args );
3776
3783
argc = setup_args (iseq , args , node -> nd_args -> nd_head , & flag );
3777
3784
ADD_SEQ (ret , args );
3778
3785
}
3779
- else {
3780
- argc = INT2FIX (0 );
3781
- }
3782
- ADD_INSN1 (ret , nd_line (node ), dupn , FIXNUM_INC (argc , 1 ));
3786
+ ADD_INSN1 (ret , nd_line (node ), dupn , FIXNUM_INC (argc , 1 + boff ));
3783
3787
ADD_SEND_R (ret , nd_line (node ), ID2SYM (idAREF ), argc , Qfalse , LONG2FIX (flag ));
3784
3788
3785
3789
if (id == 0 || id == 1 ) {
@@ -3808,40 +3812,64 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
3808
3812
3809
3813
COMPILE (ret , "NODE_OP_ASGN1 args->body: " , node -> nd_args -> nd_body );
3810
3814
if (!poped ) {
3811
- ADD_INSN1 (ret , nd_line (node ), setn , FIXNUM_INC (argc , 2 ));
3815
+ ADD_INSN1 (ret , nd_line (node ), setn , FIXNUM_INC (argc , 2 + boff ));
3812
3816
}
3813
3817
if (flag & VM_CALL_ARGS_SPLAT_BIT ) {
3814
3818
ADD_INSN1 (ret , nd_line (node ), newarray , INT2FIX (1 ));
3819
+ if (boff > 0 ) {
3820
+ ADD_INSN1 (ret , nd_line (node ), dupn , INT2FIX (3 ));
3821
+ ADD_INSN (ret , nd_line (node ), swap );
3822
+ ADD_INSN (ret , nd_line (node ), pop );
3823
+ }
3815
3824
ADD_INSN (ret , nd_line (node ), concatarray );
3825
+ if (boff > 0 ) {
3826
+ ADD_INSN1 (ret , nd_line (node ), setn , INT2FIX (3 ));
3827
+ ADD_INSN (ret , nd_line (node ), pop );
3828
+ ADD_INSN (ret , nd_line (node ), pop );
3829
+ }
3816
3830
ADD_SEND_R (ret , nd_line (node ), ID2SYM (idASET ),
3817
3831
argc , Qfalse , LONG2FIX (flag ));
3818
3832
}
3819
3833
else {
3834
+ if (boff > 0 )
3835
+ ADD_INSN (ret , nd_line (node ), swap );
3820
3836
ADD_SEND_R (ret , nd_line (node ), ID2SYM (idASET ),
3821
3837
FIXNUM_INC (argc , 1 ), Qfalse , LONG2FIX (flag ));
3822
3838
}
3823
3839
ADD_INSN (ret , nd_line (node ), pop );
3824
3840
ADD_INSNL (ret , nd_line (node ), jump , lfin );
3825
3841
ADD_LABEL (ret , label );
3826
3842
if (!poped ) {
3827
- ADD_INSN1 (ret , nd_line (node ), setn , FIXNUM_INC (argc , 2 ));
3843
+ ADD_INSN1 (ret , nd_line (node ), setn , FIXNUM_INC (argc , 2 + boff ));
3828
3844
}
3829
- ADD_INSN1 (ret , nd_line (node ), adjuststack , FIXNUM_INC (argc , 2 ));
3845
+ ADD_INSN1 (ret , nd_line (node ), adjuststack , FIXNUM_INC (argc , 2 + boff ));
3830
3846
ADD_LABEL (ret , lfin );
3831
3847
}
3832
3848
else {
3833
3849
COMPILE (ret , "NODE_OP_ASGN1 args->body: " , node -> nd_args -> nd_body );
3834
3850
ADD_SEND (ret , nd_line (node ), ID2SYM (id ), INT2FIX (1 ));
3835
3851
if (!poped ) {
3836
- ADD_INSN1 (ret , nd_line (node ), setn , FIXNUM_INC (argc , 2 ));
3852
+ ADD_INSN1 (ret , nd_line (node ), setn , FIXNUM_INC (argc , 2 + boff ));
3837
3853
}
3838
3854
if (flag & VM_CALL_ARGS_SPLAT_BIT ) {
3839
3855
ADD_INSN1 (ret , nd_line (node ), newarray , INT2FIX (1 ));
3856
+ if (boff > 0 ) {
3857
+ ADD_INSN1 (ret , nd_line (node ), dupn , INT2FIX (3 ));
3858
+ ADD_INSN (ret , nd_line (node ), swap );
3859
+ ADD_INSN (ret , nd_line (node ), pop );
3860
+ }
3840
3861
ADD_INSN (ret , nd_line (node ), concatarray );
3862
+ if (boff > 0 ) {
3863
+ ADD_INSN1 (ret , nd_line (node ), setn , INT2FIX (3 ));
3864
+ ADD_INSN (ret , nd_line (node ), pop );
3865
+ ADD_INSN (ret , nd_line (node ), pop );
3866
+ }
3841
3867
ADD_SEND_R (ret , nd_line (node ), ID2SYM (idASET ),
3842
3868
argc , Qfalse , LONG2FIX (flag ));
3843
3869
}
3844
3870
else {
3871
+ if (boff > 0 )
3872
+ ADD_INSN (ret , nd_line (node ), swap );
3845
3873
ADD_SEND_R (ret , nd_line (node ), ID2SYM (idASET ),
3846
3874
FIXNUM_INC (argc , 1 ), Qfalse , LONG2FIX (flag ));
3847
3875
}
0 commit comments