From: Nikita Popov Date: Sat, 21 Jun 2014 17:26:17 +0000 (+0200) Subject: zend_ast_dynamic_ast returns new node X-Git-Tag: POST_AST_MERGE^2~194 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b6789b1dd6a62c4176b1337658afb34f2e1d973b;p=php zend_ast_dynamic_ast returns new node --- diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 84243c2793..c2a9500feb 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -99,12 +99,13 @@ static inline zend_bool is_power_of_two(unsigned short n) { return n == (n & -n); } -ZEND_API void zend_ast_dynamic_add(zend_ast **ast, zend_ast *op) +ZEND_API zend_ast *zend_ast_dynamic_add(zend_ast *ast, zend_ast *op) { - if ((*ast)->children >= 4 && is_power_of_two((*ast)->children)) { - *ast = erealloc(*ast, sizeof(zend_ast) + sizeof(zend_ast *) * ((*ast)->children * 2 - 1)); + if (ast->children >= 4 && is_power_of_two(ast->children)) { + ast = erealloc(ast, sizeof(zend_ast) + sizeof(zend_ast *) * (ast->children * 2 - 1)); } - (*ast)->child[(*ast)->children++] = op; + ast->child[ast->children++] = op; + return ast; } ZEND_API void zend_ast_dynamic_shrink(zend_ast **ast) diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index cfe0ffae14..d789d909d2 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -110,8 +110,8 @@ ZEND_API zend_ast *zend_ast_create_binary_ex( ZEND_API zend_ast *zend_ast_create_ternary_ex( zend_ast_kind kind, zend_ast_attr attr, zend_ast *op0, zend_ast *op1, zend_ast *op2); -ZEND_API zend_ast* zend_ast_create_dynamic(zend_ast_kind kind); -ZEND_API void zend_ast_dynamic_add(zend_ast **ast, zend_ast *op); +ZEND_API zend_ast *zend_ast_create_dynamic(zend_ast_kind kind); +ZEND_API zend_ast *zend_ast_dynamic_add(zend_ast *ast, zend_ast *op); ZEND_API void zend_ast_dynamic_shrink(zend_ast **ast); ZEND_API int zend_ast_is_ct_constant(zend_ast *ast); @@ -136,6 +136,10 @@ static inline zend_ast *zend_ast_create_ternary( return zend_ast_create_ternary_ex(kind, 0, op0, op1, op2); } +static inline zend_ast *zend_ast_create_dynamic_and_add(zend_ast_kind kind, zend_ast *op) { + return zend_ast_dynamic_add(zend_ast_create_dynamic(kind), op); +} + static inline zend_ast *zend_ast_create_var(zval *name) { return zend_ast_create_unary(ZEND_AST_VAR, zend_ast_create_constant(name)); } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index c720196f66..017967ec23 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7618,8 +7618,7 @@ void zend_compile_shell_exec(znode *result, zend_ast *ast TSRMLS_DC) { ZVAL_STRING(&fn_name, "shell_exec"); name_ast = zend_ast_create_zval(&fn_name); - params_ast = zend_ast_create_dynamic(ZEND_AST_PARAMS); - zend_ast_dynamic_add(¶ms_ast, expr_ast); + params_ast = zend_ast_dynamic_add(zend_ast_create_dynamic(ZEND_AST_PARAMS), expr_ast); call_ast = zend_ast_create_binary(ZEND_AST_CALL, name_ast, params_ast); zend_compile_expr(result, call_ast TSRMLS_CC); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 94fa29727b..1b6433ddff 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -584,10 +584,9 @@ function_call_parameter_list: non_empty_function_call_parameter_list: function_call_parameter - { $$.u.ast = zend_ast_create_dynamic(ZEND_AST_PARAMS); - zend_ast_dynamic_add(&$$.u.ast, $1.u.ast); } + { $$.u.ast = zend_ast_create_dynamic_and_add(ZEND_AST_PARAMS, $1.u.ast); } | non_empty_function_call_parameter_list ',' function_call_parameter - { zend_ast_dynamic_add(&$1.u.ast, $3.u.ast); $$.u.ast = $1.u.ast; } + { $$.u.ast = zend_ast_dynamic_add($1.u.ast, $3.u.ast); } ; function_call_parameter: @@ -1070,10 +1069,16 @@ possible_comma: ; non_empty_static_array_pair_list: - non_empty_static_array_pair_list ',' static_scalar_value T_DOUBLE_ARROW static_scalar_value { zend_ast_dynamic_add(&$$.u.ast, $3.u.ast); zend_ast_dynamic_add(&$$.u.ast, $5.u.ast); } - | non_empty_static_array_pair_list ',' static_scalar_value { zend_ast_dynamic_add(&$$.u.ast, NULL); zend_ast_dynamic_add(&$$.u.ast, $3.u.ast); } - | static_scalar_value T_DOUBLE_ARROW static_scalar_value { $$.u.ast = zend_ast_create_dynamic(ZEND_INIT_ARRAY); zend_ast_dynamic_add(&$$.u.ast, $1.u.ast); zend_ast_dynamic_add(&$$.u.ast, $3.u.ast); } - | static_scalar_value { $$.u.ast = zend_ast_create_dynamic(ZEND_INIT_ARRAY); zend_ast_dynamic_add(&$$.u.ast, NULL); zend_ast_dynamic_add(&$$.u.ast, $1.u.ast); } + non_empty_static_array_pair_list ',' static_scalar_value T_DOUBLE_ARROW static_scalar_value + { $$.u.ast = zend_ast_dynamic_add(zend_ast_dynamic_add($1.u.ast, $3.u.ast), $5.u.ast); } + | non_empty_static_array_pair_list ',' static_scalar_value + { $$.u.ast = zend_ast_dynamic_add(zend_ast_dynamic_add($1.u.ast, NULL), $3.u.ast); } + | static_scalar_value T_DOUBLE_ARROW static_scalar_value + { $$.u.ast = zend_ast_dynamic_add(zend_ast_create_dynamic_and_add( + ZEND_INIT_ARRAY, $1.u.ast), $3.u.ast); } + | static_scalar_value + { $$.u.ast = zend_ast_dynamic_add(zend_ast_create_dynamic_and_add( + ZEND_INIT_ARRAY, NULL), $1.u.ast); } ; expr: @@ -1166,10 +1171,9 @@ member_name: assignment_list: assignment_list ',' assignment_list_element - { zend_ast_dynamic_add(&$1.u.ast, $3.u.ast); $$.u.ast = $1.u.ast; } + { $$.u.ast = zend_ast_dynamic_add($1.u.ast, $3.u.ast); } | assignment_list_element - { $$.u.ast = zend_ast_create_dynamic(ZEND_AST_LIST); - zend_ast_dynamic_add(&$$.u.ast, $1.u.ast); } + { $$.u.ast = zend_ast_create_dynamic_and_add(ZEND_AST_LIST, $1.u.ast); } ; assignment_list_element: @@ -1186,10 +1190,9 @@ array_pair_list: non_empty_array_pair_list: non_empty_array_pair_list ',' array_pair - { zend_ast_dynamic_add(&$1.u.ast, $3.u.ast); $$.u.ast = $1.u.ast; } + { $$.u.ast = zend_ast_dynamic_add($1.u.ast, $3.u.ast); } | array_pair - { $$.u.ast = zend_ast_create_dynamic(ZEND_AST_ARRAY); - zend_ast_dynamic_add(&$$.u.ast, $1.u.ast); } + { $$.u.ast = zend_ast_create_dynamic_and_add(ZEND_AST_ARRAY, $1.u.ast); } ; array_pair: