]> granicus.if.org Git - php/commitdiff
Merge remote-tracking branch 'origin/PHP-7.0'
authorBob Weinand <bobwei9@hotmail.com>
Thu, 21 Apr 2016 00:50:14 +0000 (02:50 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Thu, 21 Apr 2016 00:50:14 +0000 (02:50 +0200)
1  2 
Zend/tests/constant_expressions_dynamic.phpt
Zend/zend_compile.c

index 842fa64563d4677eb068d7b42d3040979e04ef76,20575360c3121b955ddc8412543d4a526fd2aa3f..af2d2e95cbafa90c81b92995e6ded1259685eb30
@@@ -7862,10 -7385,28 +7864,30 @@@ void zend_eval_const_expr(zend_ast **as
                                return;
                        }
  
 -                      zend_ct_eval_unary_pm(&result, ast->kind, zend_ast_get_zval(ast->child[0]));
 +                      if (!zend_try_ct_eval_unary_pm(&result, ast->kind, zend_ast_get_zval(ast->child[0]))) {
 +                              return;
 +                      }
                        break;
+               case ZEND_AST_COALESCE:
+                       zend_eval_const_expr(&ast->child[0]);
+                       if (ast->child[0]->kind != ZEND_AST_ZVAL) {
+                               /* ensure everything was compile-time evaluated at least once */
+                               zend_eval_const_expr(&ast->child[1]);
+                               return;
+                       }
+                       if (Z_TYPE_P(zend_ast_get_zval(ast->child[0])) == IS_NULL) {
+                               zend_eval_const_expr(&ast->child[1]);
+                               *ast_ptr = ast->child[1];
+                               ast->child[1] = NULL;
+                               zend_ast_destroy(ast);
+                       } else {
+                               *ast_ptr = ast->child[0];
+                               ast->child[0] = NULL;
+                               zend_ast_destroy(ast);
+                       }
+                       return;
                case ZEND_AST_CONDITIONAL:
                {
                        zend_ast **child, *child_ast;