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)
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);
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));
}
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:
;
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:
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:
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: