diff options
author | Nikita Popov <nikic@php.net> | 2016-03-29 19:29:55 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2016-03-29 19:29:55 +0200 |
commit | e514d859150aa60b425e960b6467b4b124b466dd (patch) | |
tree | 429079bb3818cd5b668d1d25d4ce50c1d99c3351 | |
parent | 32294a25c84106e3f34c64137acfecbe3e16aef2 (diff) | |
parent | ed06d130f70691cb50bed9dc7b9db38970a9d408 (diff) | |
download | php-git-e514d859150aa60b425e960b6467b4b124b466dd.tar.gz |
Merge branch 'PHP-7.0'
-rw-r--r-- | Zend/tests/bug71922.phpt | 21 | ||||
-rw-r--r-- | Zend/zend_ast.c | 47 |
2 files changed, 52 insertions, 16 deletions
diff --git a/Zend/tests/bug71922.phpt b/Zend/tests/bug71922.phpt new file mode 100644 index 0000000000..986254cab7 --- /dev/null +++ b/Zend/tests/bug71922.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #71922: Crash on assert(new class{}); +--INI-- +zend.assertions=1 +assert.exception=1 +--FILE-- +<?php + +try { + assert(0 && new class { + } && new class(42) extends stdclass { + }); +} catch (AssertionError $e) { + echo "Assertion failure: ", $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +Assertion failure: assert(0 && new class { +} && new class(42) extends stdclass { +}) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 6540f82c6b..cfcd636269 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -922,6 +922,21 @@ static void zend_ast_export_zval(smart_str *str, zval *zv, int priority, int ind } } +static void zend_ast_export_class_no_header(smart_str *str, zend_ast_decl *decl, int indent) { + if (decl->child[0]) { + smart_str_appends(str, " extends "); + zend_ast_export_ns_name(str, decl->child[0], 0, indent); + } + if (decl->child[1]) { + smart_str_appends(str, " implements "); + zend_ast_export_ex(str, decl->child[1], 0, indent); + } + smart_str_appends(str, " {\n"); + zend_ast_export_stmt(str, decl->child[2], indent + 1); + zend_ast_export_indent(str, indent); + smart_str_appends(str, "}"); +} + #define BINARY_OP(_op, _p, _pl, _pr) do { \ op = _op; \ p = _p; \ @@ -1048,18 +1063,8 @@ tail_call: smart_str_appends(str, "class "); } smart_str_appendl(str, ZSTR_VAL(decl->name), ZSTR_LEN(decl->name)); - if (decl->child[0]) { - smart_str_appends(str, " extends "); - zend_ast_export_ns_name(str, decl->child[0], 0, indent); - } - if (decl->child[1]) { - smart_str_appends(str, " implements "); - zend_ast_export_ex(str, decl->child[1], 0, indent); - } - smart_str_appends(str, " {\n"); - zend_ast_export_stmt(str, decl->child[2], indent + 1); - zend_ast_export_indent(str, indent); - smart_str_appends(str, "}\n"); + zend_ast_export_class_no_header(str, decl, indent); + smart_str_appendc(str, '\n'); break; /* list nodes */ @@ -1344,10 +1349,20 @@ simple_list: break; case ZEND_AST_NEW: smart_str_appends(str, "new "); - zend_ast_export_ns_name(str, ast->child[0], 0, indent); - smart_str_appendc(str, '('); - zend_ast_export_ex(str, ast->child[1], 0, indent); - smart_str_appendc(str, ')'); + if (ast->child[0]->kind == ZEND_AST_CLASS) { + smart_str_appends(str, "class"); + if (zend_ast_get_list(ast->child[1])->children) { + smart_str_appendc(str, '('); + zend_ast_export_ex(str, ast->child[1], 0, indent); + smart_str_appendc(str, ')'); + } + zend_ast_export_class_no_header(str, (zend_ast_decl *) ast->child[0], indent); + } else { + zend_ast_export_ns_name(str, ast->child[0], 0, indent); + smart_str_appendc(str, '('); + zend_ast_export_ex(str, ast->child[1], 0, indent); + smart_str_appendc(str, ')'); + } break; case ZEND_AST_INSTANCEOF: zend_ast_export_ex(str, ast->child[0], 0, indent); |