]> granicus.if.org Git - php/commitdiff
Fix constant expr coaleasce with protected mode opcache
authorBob Weinand <bobwei9@hotmail.com>
Thu, 21 Apr 2016 19:51:00 +0000 (21:51 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Thu, 21 Apr 2016 19:51:00 +0000 (21:51 +0200)
Zend/zend_ast.c
Zend/zend_compile.c

index 4d3678f0b60a7172ce4e35d67a89bdb987cabf2a..37728870920906c10b09b371b487eb2527bac6ed 100644 (file)
@@ -338,10 +338,6 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
                        }
                        break;
                case ZEND_AST_COALESCE:
-                       if (ast->child[0]->kind == ZEND_AST_DIM) {
-                               ast->child[0]->attr = ZEND_DIM_IS;
-                       }
-
                        if (UNEXPECTED(zend_ast_evaluate(&op1, ast->child[0], scope) != SUCCESS)) {
                                ret = FAILURE;
                                break;
@@ -349,10 +345,6 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
                        if (Z_TYPE(op1) > IS_NULL) {
                                *result = op1;
                        } else {
-                               if (ast->child[1]->kind == ZEND_AST_DIM) {
-                                       ast->child[1]->attr = ZEND_DIM_IS;
-                               }
-
                                if (UNEXPECTED(zend_ast_evaluate(result, ast->child[1], scope) != SUCCESS)) {
                                        zval_dtor(&op1);
                                        ret = FAILURE;
@@ -413,10 +405,6 @@ ZEND_API int zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *sc
                                zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for reading");
                        }
 
-                       if (ast->attr == ZEND_DIM_IS && ast->child[0]->kind == ZEND_AST_DIM) {
-                               ast->child[0]->attr = ZEND_DIM_IS;
-                       }
-
                        if (UNEXPECTED(zend_ast_evaluate(&op1, ast->child[0], scope) != SUCCESS)) {
                                ret = FAILURE;
                        } else if (UNEXPECTED(zend_ast_evaluate(&op2, ast->child[1], scope) != SUCCESS)) {
index 20575360c3121b955ddc8412543d4a526fd2aa3f..fb196f04b54a9b4e9bc7a3de58900d6396e52b21 100644 (file)
@@ -7388,6 +7388,10 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
                        zend_ct_eval_unary_pm(&result, ast->kind, zend_ast_get_zval(ast->child[0]));
                        break;
                case ZEND_AST_COALESCE:
+                       /* Set isset fetch indicator here, opcache disallows runtime altering of the AST */
+                       if (ast->child[0]->kind == ZEND_AST_DIM) {
+                               ast->child[0]->attr = ZEND_DIM_IS;
+                       }
                        zend_eval_const_expr(&ast->child[0]);
 
                        if (ast->child[0]->kind != ZEND_AST_ZVAL) {
@@ -7440,6 +7444,11 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
                                zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for reading");
                        }
 
+                       /* Set isset fetch indicator here, opcache disallows runtime altering of the AST */
+                       if (ast->attr == ZEND_DIM_IS && ast->child[0]->kind == ZEND_AST_DIM) {
+                               ast->child[0]->attr = ZEND_DIM_IS;
+                       }
+
                        zend_eval_const_expr(&ast->child[0]);
                        zend_eval_const_expr(&ast->child[1]);
                        if (ast->child[0]->kind != ZEND_AST_ZVAL || ast->child[1]->kind != ZEND_AST_ZVAL) {