]> granicus.if.org Git - php/commitdiff
Fix block pass leaks
authorNikita Popov <nikic@php.net>
Thu, 10 Nov 2016 20:42:05 +0000 (21:42 +0100)
committerNikita Popov <nikic@php.net>
Thu, 10 Nov 2016 21:28:32 +0000 (22:28 +0100)
ext/opcache/Optimizer/block_pass.c
ext/opcache/tests/block_pass_001.phpt

index aea670beb37c0a73b1b6d34a0d8ade287123884f..77b02cc99f0f0997f6d61643ff1f2e698fada03e 100644 (file)
@@ -254,12 +254,9 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
                                        src = VAR_SOURCE(opline->op1);
                                        if (src &&
                                            (src->opcode == ZEND_BOOL || src->opcode == ZEND_BOOL_NOT)) {
-                                               /* T = BOOL(X), FREE(T) => NOP */
-                                               if (ZEND_OP1_TYPE(src) == IS_CONST) {
-                                                       literal_dtor(&ZEND_OP1_LITERAL(src));
-                                               }
+                                               /* T = BOOL(X), FREE(T) => T = BOOL(X) */
+                                               /* The remaining BOOL is removed by a separate optimization */
                                                VAR_SOURCE(opline->op1) = NULL;
-                                               MAKE_NOP(src);
                                                MAKE_NOP(opline);
                                        }
                                } else if (opline->op1_type == IS_VAR) {
@@ -1660,7 +1657,7 @@ static void zend_t_usage(zend_cfg *cfg, zend_op_array *op_array, zend_bitset use
                                                        if (ZEND_OP1_TYPE(opline) == IS_CV) {
                                                                opline->opcode = ZEND_CHECK_VAR;
                                                                SET_UNUSED(opline->result);
-                                                       } else if (ZEND_OP1_TYPE(opline) == IS_TMP_VAR) {
+                                                       } else if (ZEND_OP1_TYPE(opline) & (IS_TMP_VAR|IS_VAR)) {
                                                                opline->opcode = ZEND_FREE;
                                                                SET_UNUSED(opline->result);
                                                        } else {
index 8a1b6911455b640de697c5028f2b59f2360c9404..556e76f543b5ddf4595842682b46b52e4aed26c7 100644 (file)
@@ -1,8 +1,10 @@
 --TEST--
-Block pass: Don't suppress undefined variable notice
+Block pass: Bugs in BOOL/QM_ASSIGN elision
 --FILE--
 <?php
 (bool) (true ? $x : $y);
+(bool) (true ? new stdClass : null);
+(bool) new stdClass;
 ?>
 --EXPECTF--
 Notice: Undefined variable: x in %s on line %d