|
|
|
@ -388,6 +388,58 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
#if ZEND_EXTENSION_API_NO >= PHP_5_5_X_API_NO |
|
|
|
case ZEND_FETCH_R: |
|
|
|
case ZEND_FETCH_W: |
|
|
|
case ZEND_FETCH_RW: |
|
|
|
case ZEND_FETCH_FUNC_ARG: |
|
|
|
case ZEND_FETCH_IS: |
|
|
|
case ZEND_FETCH_UNSET: |
|
|
|
if (opline != op_array->opcodes && |
|
|
|
(opline-1)->opcode == ZEND_BEGIN_SILENCE && |
|
|
|
(opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_LOCAL && |
|
|
|
opline->op1_type == IS_CONST && |
|
|
|
opline->op2_type == IS_UNUSED && |
|
|
|
Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING && |
|
|
|
(Z_STRLEN(ZEND_OP1_LITERAL(opline)) != sizeof("this")-1 || |
|
|
|
memcmp(Z_STRVAL(ZEND_OP1_LITERAL(opline)), "this", sizeof("this")) != 0)) { |
|
|
|
|
|
|
|
int var = opline->result.var; |
|
|
|
int level = 0; |
|
|
|
zend_op *op = opline + 1; |
|
|
|
|
|
|
|
while (op < end) { |
|
|
|
if (op->opcode == ZEND_BEGIN_SILENCE) { |
|
|
|
level++; |
|
|
|
} else if (op->opcode == ZEND_END_SILENCE) { |
|
|
|
if (level == 0) { |
|
|
|
break; |
|
|
|
} else { |
|
|
|
level--; |
|
|
|
} |
|
|
|
} |
|
|
|
if (op->op1_type == IS_VAR && op->op1.var == var) { |
|
|
|
op->op1_type = IS_CV; |
|
|
|
op->op1.var = zend_optimizer_lookup_cv(op_array, |
|
|
|
Z_STRVAL(ZEND_OP1_LITERAL(opline)), |
|
|
|
Z_STRLEN(ZEND_OP1_LITERAL(opline))); |
|
|
|
MAKE_NOP(opline); |
|
|
|
break; |
|
|
|
} else if (op->op2_type == IS_VAR && op->op2.var == var) { |
|
|
|
op->op2_type = IS_CV; |
|
|
|
op->op2.var = zend_optimizer_lookup_cv(op_array, |
|
|
|
Z_STRVAL(ZEND_OP1_LITERAL(opline)), |
|
|
|
Z_STRLEN(ZEND_OP1_LITERAL(opline))); |
|
|
|
MAKE_NOP(opline); |
|
|
|
break; |
|
|
|
} |
|
|
|
op++; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
#endif |
|
|
|
|
|
|
|
} |
|
|
|
opline++; |
|
|
|
i++; |
|
|
|
|