summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2011-11-03 08:39:12 +0000
committerAntony Dovgal <tony2001@php.net>2011-11-03 08:39:12 +0000
commit36103d1236c7290223fad40221344bd76a2ad45b (patch)
tree97f4812b57ab0a375d0b48060add0bd3567dc079
parentd4b90b47881a8a7738f01c33dc8fe4827d193273 (diff)
downloadphp-git-36103d1236c7290223fad40221344bd76a2ad45b.tar.gz
use jmp_addr only when it's initialized
-rw-r--r--Zend/zend_compile.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 567bc5f792..24636d2336 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -3718,9 +3718,14 @@ static void zend_traits_duplicate_function(zend_function *fe, zend_class_entry *
for(i = 0; i < fe->op_array.last; i++) {
opcode_copy[i] = fe->op_array.opcodes[i];
if (opcode_copy[i].op1_type != IS_CONST) {
- if (opcode_copy[i].op1.jmp_addr >= fe->op_array.opcodes &&
- opcode_copy[i].op1.jmp_addr < fe->op_array.opcodes + fe->op_array.last) {
- opcode_copy[i].op1.jmp_addr = opcode_copy + (fe->op_array.opcodes[i].op1.jmp_addr - fe->op_array.opcodes);
+ switch (opcode_copy[i].opcode) {
+ case ZEND_GOTO:
+ case ZEND_JMP:
+ if (opcode_copy[i].op1.jmp_addr && opcode_copy[i].op1.jmp_addr >= fe->op_array.opcodes &&
+ opcode_copy[i].op1.jmp_addr < fe->op_array.opcodes + fe->op_array.last) {
+ opcode_copy[i].op1.jmp_addr = opcode_copy + (fe->op_array.opcodes[i].op1.jmp_addr - fe->op_array.opcodes);
+ }
+ break;
}
} else {
/* 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 *
}
if (opcode_copy[i].op2_type != IS_CONST) {
- if (opcode_copy[i].op2.jmp_addr >= fe->op_array.opcodes &&
- opcode_copy[i].op2.jmp_addr < fe->op_array.opcodes + fe->op_array.last) {
- opcode_copy[i].op2.jmp_addr = opcode_copy + (fe->op_array.opcodes[i].op2.jmp_addr - fe->op_array.opcodes);
+ switch (opcode_copy[i].opcode) {
+ case ZEND_JMPZ:
+ case ZEND_JMPNZ:
+ case ZEND_JMPZ_EX:
+ case ZEND_JMPNZ_EX:
+ case ZEND_JMP_SET:
+ case ZEND_JMP_SET_VAR:
+ if (opcode_copy[i].op2.jmp_addr && opcode_copy[i].op2.jmp_addr >= fe->op_array.opcodes &&
+ opcode_copy[i].op2.jmp_addr < fe->op_array.opcodes + fe->op_array.last) {
+ opcode_copy[i].op2.jmp_addr = opcode_copy + (fe->op_array.opcodes[i].op2.jmp_addr - fe->op_array.opcodes);
+ }
+ break;
}
} else {
/* if __CLASS__ i.e. T_CLASS_C was used, we need to fix it up here */