Skip to content

Commit a9bc2ce

Browse files
author
tony2001
committed
use jmp_addr only when it's initialized
git-svn-id: http://svn.php.net/repository/php/php-src/trunk@318723 c90b9560-bf6c-de11-be94-00142212c4b1
1 parent 1da566b commit a9bc2ce

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed

Zend/zend_compile.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3718,9 +3718,14 @@ static void zend_traits_duplicate_function(zend_function *fe, zend_class_entry *
37183718
for(i = 0; i < fe->op_array.last; i++) {
37193719
opcode_copy[i] = fe->op_array.opcodes[i];
37203720
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;
37243729
}
37253730
} else {
37263731
/* 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 *
37393744
}
37403745

37413746
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;
37453759
}
37463760
} else {
37473761
/* if __CLASS__ i.e. T_CLASS_C was used, we need to fix it up here */

0 commit comments

Comments
 (0)