diff options
author | Anatol Belski <ab@php.net> | 2015-07-10 12:06:56 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2015-07-10 12:06:56 +0200 |
commit | ad8a73dd55c087de465ad80e8715611693bb1460 (patch) | |
tree | f76e6e2950a1e1cd958dab53e4100ab93c640938 /ext/opcache/Optimizer/zend_optimizer.c | |
parent | ceefc0947a12376eb6612376fd750744ac054f5c (diff) | |
download | php-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.c | 40 |
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: |