]> granicus.if.org Git - php/commitdiff
Fixed function name resolution
authorDmitry Stogov <dmitry@zend.com>
Tue, 30 May 2017 18:48:16 +0000 (21:48 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 30 May 2017 18:48:16 +0000 (21:48 +0300)
Zend/zend_compile.c

index 2bd721e74c6a3fb2f62534a75a0bd9efa9eb0009..309f7005d2e0e7a6e85366e4c96df78275a170fc 100644 (file)
@@ -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;
 }