summaryrefslogtreecommitdiff
path: root/ext/opcache/Optimizer/zend_optimizer.c
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2015-07-10 12:06:56 +0200
committerAnatol Belski <ab@php.net>2015-07-10 12:06:56 +0200
commitad8a73dd55c087de465ad80e8715611693bb1460 (patch)
treef76e6e2950a1e1cd958dab53e4100ab93c640938 /ext/opcache/Optimizer/zend_optimizer.c
parentceefc0947a12376eb6612376fd750744ac054f5c (diff)
downloadphp-git-php-7.0.0beta1.tar.gz
Revert "Fixed bug #62210 (Exceptions can leak temporary variables. As a part of the fix serious refactoring was done. op_array->brk_cont_array was removed, and replaced with more general and speed efficient op_array->T_liveliness. ZEND_GOTO opcode is always replaced by ZEND_JMP at compile time). (Bob, Dmitry, Laruence)"php-7.0.0beta1
This reverts commit 5ee841325901a4b040cfea56292a24702fe224d9.
Diffstat (limited to 'ext/opcache/Optimizer/zend_optimizer.c')
-rw-r--r--ext/opcache/Optimizer/zend_optimizer.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c
index 86b0837137..dc69d2511e 100644
--- a/ext/opcache/Optimizer/zend_optimizer.c
+++ b/ext/opcache/Optimizer/zend_optimizer.c
@@ -340,11 +340,29 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
*/
case ZEND_FREE:
case ZEND_CASE: {
- zend_op *m = opline;
- zend_op *end = op_array->opcodes + op_array->last;
+ zend_op *m, *n;
+ int brk = op_array->last_brk_cont;
+ zend_bool in_switch = 0;
+ while (brk--) {
+ if (op_array->brk_cont_array[brk].start <= (opline - op_array->opcodes) &&
+ op_array->brk_cont_array[brk].brk > (opline - op_array->opcodes)) {
+ in_switch = 1;
+ break;
+ }
+ }
- while (m < end) {
- if (ZEND_OP1_TYPE(m) == type && ZEND_OP1(m).var == var) {
+ if (!in_switch) {
+ ZEND_ASSERT(opline->opcode == ZEND_FREE);
+ MAKE_NOP(opline);
+ zval_dtor(val);
+ return 1;
+ }
+
+ m = opline;
+ n = op_array->opcodes + op_array->brk_cont_array[brk].brk + 1;
+ while (m < n) {
+ if (ZEND_OP1_TYPE(m) == type &&
+ ZEND_OP1(m).var == var) {
if (m->opcode == ZEND_CASE) {
zval old_val;
ZVAL_COPY_VALUE(&old_val, val);
@@ -353,7 +371,6 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
ZVAL_COPY_VALUE(val, &old_val);
} else if (m->opcode == ZEND_FREE) {
MAKE_NOP(m);
- break;
} else {
ZEND_ASSERT(0);
}
@@ -458,17 +475,6 @@ static void zend_optimize(zend_op_array *op_array,
if (ZEND_OPTIMIZER_PASS_11 & OPTIMIZATION_LEVEL) {
zend_optimizer_compact_literals(op_array, ctx);
}
-
- if ((ZEND_OPTIMIZER_PASS_1
- |ZEND_OPTIMIZER_PASS_2
- |ZEND_OPTIMIZER_PASS_3
- |ZEND_OPTIMIZER_PASS_4
- |ZEND_OPTIMIZER_PASS_5
- |ZEND_OPTIMIZER_PASS_9
- |ZEND_OPTIMIZER_PASS_10
- |ZEND_OPTIMIZER_PASS_11) & OPTIMIZATION_LEVEL) {
- zend_regenerate_var_liveliness_info(op_array);
- }
}
static void zend_accel_optimize(zend_op_array *op_array,
@@ -488,6 +494,7 @@ static void zend_accel_optimize(zend_op_array *op_array,
}
switch (opline->opcode) {
case ZEND_JMP:
+ case ZEND_GOTO:
case ZEND_FAST_CALL:
case ZEND_DECLARE_ANON_CLASS:
case ZEND_DECLARE_ANON_INHERITED_CLASS:
@@ -532,6 +539,7 @@ static void zend_accel_optimize(zend_op_array *op_array,
}
switch (opline->opcode) {
case ZEND_JMP:
+ case ZEND_GOTO:
case ZEND_FAST_CALL:
case ZEND_DECLARE_ANON_CLASS:
case ZEND_DECLARE_ANON_INHERITED_CLASS: