diff options
Diffstat (limited to 'Zend')
| -rw-r--r-- | Zend/zend_execute.c | 4 | ||||
| -rw-r--r-- | Zend/zend_opcode.c | 15 |
2 files changed, 12 insertions, 7 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 7709d4bab0..1e2bbec0b7 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1939,7 +1939,7 @@ int zend_jmpz_ex_handler(ZEND_OPCODE_HANDLER_ARGS) #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", EX(opline)->op2.u.opline_num); #endif - EX(opline) = &op_array->opcodes[EX(opline)->op2.u.opline_num]; + EX(opline) = EX(opline)->op2.u.jmp_addr; return 0; /* CHECK_ME */ } NEXT_OPCODE(); @@ -1957,7 +1957,7 @@ int zend_jmpnz_ex_handler(ZEND_OPCODE_HANDLER_ARGS) #if DEBUG_ZEND>=2 printf("Conditional jmp to %d\n", EX(opline)->op2.u.opline_num); #endif - EX(opline) = &op_array->opcodes[EX(opline)->op2.u.opline_num]; + EX(opline) = EX(opline)->op2.u.jmp_addr; return 0; /* CHECK_ME */ } NEXT_OPCODE(); diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index fb7b8b2787..5feb705996 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -309,11 +309,16 @@ int pass_two(zend_op_array *op_array TSRMLS_DC) opline->op2.u.constant.is_ref = 1; opline->op2.u.constant.refcount = 2; } - if (opline->opcode == ZEND_JMP) { - opline->op1.u.jmp_addr = &op_array->opcodes[opline->op1.u.opline_num]; - } - if (opline->opcode == ZEND_JMPZ || opline->opcode == ZEND_JMPNZ) { - opline->op2.u.jmp_addr = &op_array->opcodes[opline->op2.u.opline_num]; + switch (opline->opcode) { + case ZEND_JMP: + opline->op1.u.jmp_addr = &op_array->opcodes[opline->op1.u.opline_num]; + break; + case ZEND_JMPZ: + case ZEND_JMPNZ: + case ZEND_JMPZ_EX: + case ZEND_JMPNZ_EX: + opline->op2.u.jmp_addr = &op_array->opcodes[opline->op2.u.opline_num]; + break; } opline->handler = zend_opcode_handlers[opline->opcode]; opline++; |
