diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-07-24 00:59:42 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-07-24 00:59:42 +0400 |
commit | 39740a33e5883e8bba935769032bf87a87bbb238 (patch) | |
tree | 6f129560e7d8c22d276dc2c561b667730026d9bd /Zend | |
parent | 4c37e699573bfe004b73a412fa712083e75ad4e8 (diff) | |
parent | d909b6330e314bb434350317fda5bec185ea12c0 (diff) | |
download | php-git-39740a33e5883e8bba935769032bf87a87bbb238.tar.gz |
Merge branch 'PHP-5.6'
* PHP-5.6:
Fixed crash on self-referencing constant expression (part of a constant AST)
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/tests/constant_expressions_self_referencing_array.phpt | 2 | ||||
-rw-r--r-- | Zend/zend_ast.c | 17 |
2 files changed, 13 insertions, 6 deletions
diff --git a/Zend/tests/constant_expressions_self_referencing_array.phpt b/Zend/tests/constant_expressions_self_referencing_array.phpt index 09f862e048..ae76a08602 100644 --- a/Zend/tests/constant_expressions_self_referencing_array.phpt +++ b/Zend/tests/constant_expressions_self_referencing_array.phpt @@ -1,7 +1,5 @@ --TEST-- Self-referencing constant expression (part of a constant AST) ---XFAIL-- -Not yet fixed, to be fixed for PHP 5.6 --FILE-- <?php class A { diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index fceb940fa3..54448ac286 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -251,10 +251,19 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s zval_dtor(&op2); break; case ZEND_CONST: - *result = *ast->u.val; - zval_copy_ctor(result); - if (IS_CONSTANT_TYPE(Z_TYPE_P(result))) { - zval_update_constant_ex(&result, 1, scope TSRMLS_CC); + /* class constants may be updated in-place */ + if (scope) { + if (IS_CONSTANT_TYPE(Z_TYPE_P(ast->u.val))) { + zval_update_constant_ex(&ast->u.val, 1, scope TSRMLS_CC); + } + *result = *ast->u.val; + zval_copy_ctor(result); + } else { + *result = *ast->u.val; + zval_copy_ctor(result); + if (IS_CONSTANT_TYPE(Z_TYPE_P(result))) { + zval_update_constant_ex(&result, 1, scope TSRMLS_CC); + } } break; case ZEND_BOOL_AND: |