@@ -3718,9 +3718,14 @@ static void zend_traits_duplicate_function(zend_function *fe, zend_class_entry *
3718
3718
for (i = 0 ; i < fe -> op_array .last ; i ++ ) {
3719
3719
opcode_copy [i ] = fe -> op_array .opcodes [i ];
3720
3720
if (opcode_copy [i ].op1_type != IS_CONST ) {
3721
- if (opcode_copy [i ].op1 .jmp_addr >= fe -> op_array .opcodes &&
3722
- opcode_copy [i ].op1 .jmp_addr < fe -> op_array .opcodes + fe -> op_array .last ) {
3723
- opcode_copy [i ].op1 .jmp_addr = opcode_copy + (fe -> op_array .opcodes [i ].op1 .jmp_addr - fe -> op_array .opcodes );
3721
+ switch (opcode_copy [i ].opcode ) {
3722
+ case ZEND_GOTO :
3723
+ case ZEND_JMP :
3724
+ if (opcode_copy [i ].op1 .jmp_addr && opcode_copy [i ].op1 .jmp_addr >= fe -> op_array .opcodes &&
3725
+ opcode_copy [i ].op1 .jmp_addr < fe -> op_array .opcodes + fe -> op_array .last ) {
3726
+ opcode_copy [i ].op1 .jmp_addr = opcode_copy + (fe -> op_array .opcodes [i ].op1 .jmp_addr - fe -> op_array .opcodes );
3727
+ }
3728
+ break ;
3724
3729
}
3725
3730
} else {
3726
3731
/* if __CLASS__ i.e. T_CLASS_C was used, we need to fix it up here */
@@ -3739,9 +3744,18 @@ static void zend_traits_duplicate_function(zend_function *fe, zend_class_entry *
3739
3744
}
3740
3745
3741
3746
if (opcode_copy [i ].op2_type != IS_CONST ) {
3742
- if (opcode_copy [i ].op2 .jmp_addr >= fe -> op_array .opcodes &&
3743
- opcode_copy [i ].op2 .jmp_addr < fe -> op_array .opcodes + fe -> op_array .last ) {
3744
- opcode_copy [i ].op2 .jmp_addr = opcode_copy + (fe -> op_array .opcodes [i ].op2 .jmp_addr - fe -> op_array .opcodes );
3747
+ switch (opcode_copy [i ].opcode ) {
3748
+ case ZEND_JMPZ :
3749
+ case ZEND_JMPNZ :
3750
+ case ZEND_JMPZ_EX :
3751
+ case ZEND_JMPNZ_EX :
3752
+ case ZEND_JMP_SET :
3753
+ case ZEND_JMP_SET_VAR :
3754
+ if (opcode_copy [i ].op2 .jmp_addr && opcode_copy [i ].op2 .jmp_addr >= fe -> op_array .opcodes &&
3755
+ opcode_copy [i ].op2 .jmp_addr < fe -> op_array .opcodes + fe -> op_array .last ) {
3756
+ opcode_copy [i ].op2 .jmp_addr = opcode_copy + (fe -> op_array .opcodes [i ].op2 .jmp_addr - fe -> op_array .opcodes );
3757
+ }
3758
+ break ;
3745
3759
}
3746
3760
} else {
3747
3761
/* if __CLASS__ i.e. T_CLASS_C was used, we need to fix it up here */
0 commit comments