From: Dmitry Stogov Date: Tue, 30 May 2017 18:48:16 +0000 (+0300) Subject: Fixed function name resolution X-Git-Tag: php-7.2.0alpha1~37 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a916bed8f84b916f344062c524f6412036fe957a;p=php Fixed function name resolution --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 2bd721e74c..309f7005d2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3556,13 +3556,14 @@ int zend_compile_func_cufa(znode *result, zend_ast_list *args, zend_string *lcna zend_compile_init_user_func(args->child[0], 0, lcname); if (args->child[1]->kind == ZEND_AST_CALL && args->child[1]->child[0]->kind == ZEND_AST_ZVAL + && Z_TYPE_P(zend_ast_get_zval(args->child[1]->child[0])) == IS_STRING && args->child[1]->child[1]->kind == ZEND_AST_ARG_LIST) { - zval *name = zend_ast_get_zval(args->child[1]->child[0]); + zend_string *orig_name = zend_ast_get_str(args->child[1]->child[0]); zend_ast_list *list = zend_ast_get_list(args->child[1]->child[1]); + zend_bool is_fully_qualified; + zend_string *name = zend_resolve_function_name(orig_name, args->child[1]->child[0]->attr, &is_fully_qualified); - if (Z_TYPE_P(name) == IS_STRING - && zend_string_equals_literal_ci(Z_STR_P(name), "array_slice") - && (!FC(current_namespace) || args->child[1]->child[0]->attr == ZEND_NAME_FQ) + if (zend_string_equals_literal_ci(name, "array_slice") && list->children == 3 && list->child[1]->kind == ZEND_AST_ZVAL) { zval *zv = zend_ast_get_zval(list->child[1]); @@ -3578,9 +3579,11 @@ int zend_compile_func_cufa(znode *result, zend_ast_list *args, zend_string *lcna opline = zend_emit_op(NULL, ZEND_SEND_ARRAY, &arg_node, &len_node); opline->extended_value = Z_LVAL_P(zv); zend_emit_op(result, ZEND_DO_FCALL, NULL, NULL); + zend_string_release(name); return SUCCESS; } } + zend_string_release(name); } zend_compile_expr(&arg_node, args->child[1]); zend_emit_op(NULL, ZEND_SEND_ARRAY, &arg_node, NULL); @@ -3836,25 +3839,28 @@ int zend_compile_func_array_slice(znode *result, zend_ast_list *args) /* {{{ */ && args->children == 2 && args->child[0]->kind == ZEND_AST_CALL && args->child[0]->child[0]->kind == ZEND_AST_ZVAL + && Z_TYPE_P(zend_ast_get_zval(args->child[0]->child[0])) == IS_STRING && args->child[0]->child[1]->kind == ZEND_AST_ARG_LIST && args->child[1]->kind == ZEND_AST_ZVAL) { - zval *name = zend_ast_get_zval(args->child[0]->child[0]); + zend_string *orig_name = zend_ast_get_str(args->child[0]->child[0]); + zend_bool is_fully_qualified; + zend_string *name = zend_resolve_function_name(orig_name, args->child[0]->child[0]->attr, &is_fully_qualified); zend_ast_list *list = zend_ast_get_list(args->child[0]->child[1]); zval *zv = zend_ast_get_zval(args->child[1]); znode first; - if (Z_TYPE_P(name) == IS_STRING - && zend_string_equals_literal_ci(Z_STR_P(name), "func_get_args") - && (!FC(current_namespace) || args->child[0]->child[0]->attr == ZEND_NAME_FQ) + if (zend_string_equals_literal_ci(name, "func_get_args") && list->children == 0 && Z_TYPE_P(zv) == IS_LONG && Z_LVAL_P(zv) >= 0) { first.op_type = IS_CONST; ZVAL_LONG(&first.u.constant, Z_LVAL_P(zv)); zend_emit_op_tmp(result, ZEND_FUNC_GET_ARGS, &first, NULL); + zend_string_release(name); return SUCCESS; } + zend_string_release(name); } return FAILURE; }