From 7f01b6fcec81a0b9f418d837943b194e1414c62c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 26 Jun 2014 13:16:31 +0200 Subject: [PATCH] Bring static scalar arrays in line --- Zend/zend_ast.c | 13 +++++++------ Zend/zend_language_parser.y | 31 +++++++++++++++++-------------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index ee8dd662c1..ec3e9dbc84 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -242,17 +242,18 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s sub_function(result, &op1, &op2 TSRMLS_CC); zval_dtor(&op2); break; - case ZEND_INIT_ARRAY: + case ZEND_AST_ARRAY: array_init(result); { - int i; - for (i = 0; i < ast->children; i+=2) { - if (ast->child[i]) { - zend_ast_evaluate(&op1, ast->child[i], scope TSRMLS_CC); + zend_uint i; + for (i = 0; i < ast->children; i++) { + zend_ast *elem = ast->child[i]; + if (elem->child[1]) { + zend_ast_evaluate(&op1, elem->child[1], scope TSRMLS_CC); } else { ZVAL_UNDEF(&op1); } - zend_ast_evaluate(&op2, ast->child[i+1], scope TSRMLS_CC); + zend_ast_evaluate(&op2, elem->child[0], scope TSRMLS_CC); zend_ast_add_array_element(result, &op1, &op2 TSRMLS_CC); } } diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 8564ad9919..5edc41e597 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -993,9 +993,9 @@ static_scalar_base: static_scalar_value: static_scalar_base { $$.u.ast = zend_ast_create_constant(&$1.u.constant); } | common_scalar { $$.u.ast = $1.u.ast; } - | T_ARRAY '(' static_array_pair_list ')' { $$ = $3; } - | '[' static_array_pair_list ']' { $$ = $2; } - | static_operation { $$ = $1; } + | T_ARRAY '(' static_array_pair_list ')' { $$.u.ast = $3.u.ast; } + | '[' static_array_pair_list ']' { $$.u.ast = $2.u.ast; } + | static_operation { $$.u.ast = $1.u.ast; } ; static_operation: @@ -1088,8 +1088,10 @@ scalar: static_array_pair_list: - /* empty */ { $$.op_type = IS_CONST; array_init(&$$.u.constant); $$.u.ast = zend_ast_create_constant(&$$.u.constant); } - | non_empty_static_array_pair_list possible_comma { zend_ast_dynamic_shrink(&$1.u.ast); $$ = $1; } + /* empty */ + { array_init(&$$.u.constant); $$.u.ast = zend_ast_create_constant(&$$.u.constant); } + | non_empty_static_array_pair_list possible_comma + { zend_ast_dynamic_shrink(&$1.u.ast); $$ = $1; } ; possible_comma: @@ -1098,16 +1100,17 @@ possible_comma: ; non_empty_static_array_pair_list: - 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); } + non_empty_static_array_pair_list ',' static_array_pair + { $$.u.ast = zend_ast_dynamic_add($1.u.ast, $3.u.ast); } + | static_array_pair + { $$.u.ast = zend_ast_create_dynamic_and_add(ZEND_AST_ARRAY, $1.u.ast); } +; + +static_array_pair: + static_scalar_value T_DOUBLE_ARROW static_scalar_value + { $$.u.ast = zend_ast_create_binary(ZEND_AST_ARRAY_ELEM, $3.u.ast, $1.u.ast); } | static_scalar_value - { $$.u.ast = zend_ast_dynamic_add(zend_ast_create_dynamic_and_add( - ZEND_INIT_ARRAY, NULL), $1.u.ast); } + { $$.u.ast = zend_ast_create_binary(ZEND_AST_ARRAY_ELEM, $1.u.ast, NULL); } ; expr: -- 2.50.1