]> granicus.if.org Git - php/commitdiff
Revert "Fixed bug #78903: Conflict in RTD key for closures results in crash"
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 11 Dec 2019 13:38:48 +0000 (14:38 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 11 Dec 2019 13:38:48 +0000 (14:38 +0100)
This reverts commit b55033fa18afd9bb60fc4537270266d808ec0868.

This breaks ext/opcache/tests/bug65915.phpt.

NEWS
Zend/zend_compile.c

diff --git a/NEWS b/NEWS
index cb95b827571c74385381b91e73faf70730faf386..18cf640d67c731d5e9552476518f87a5d5b2b107 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,9 +3,6 @@ PHP                                                                        NEWS
 
 ?? ??? ????, PHP 7.4.2
 
-- Core:
-  . Fixed bug #78903 (Conflict in RTD key for closures results in crash).
-    (Nikita)
 
 19 Dec 2019, PHP 7.4.1
 
index 47ed1608ba84aee3eb13737bdfcc06cc9007d1e4..b6a120c94b2328bea8e2d603eaad4310d7018c93 100644 (file)
@@ -5874,7 +5874,7 @@ void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_boo
 }
 /* }}} */
 
-static int zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast_decl *decl, zend_bool toplevel) /* {{{ */
+static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast_decl *decl, zend_bool toplevel) /* {{{ */
 {
        zend_ast *params_ast = decl->child[0];
        zend_string *unqualified_name, *name, *lcname, *key;
@@ -5914,10 +5914,12 @@ static int zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast
                        do_bind_function_error(lcname, op_array, 1);
                }
                zend_string_release_ex(lcname, 0);
-               return SUCCESS;
+               return;
        }
 
        key = zend_build_runtime_definition_key(lcname, decl->lex_pos);
+       zend_hash_update_ptr(CG(function_table), key, op_array);
+
        if (op_array->fn_flags & ZEND_ACC_CLOSURE) {
                opline = zend_emit_op_tmp(result, ZEND_DECLARE_LAMBDA_FUNCTION, NULL, NULL);
                opline->extended_value = zend_alloc_cache_slot();
@@ -5932,8 +5934,6 @@ static int zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast
                zend_add_literal_string(&key);
        }
        zend_string_release_ex(lcname, 0);
-
-       return zend_hash_add_ptr(CG(function_table), key, op_array) != NULL ? SUCCESS : FAILURE;
 }
 /* }}} */
 
@@ -5979,13 +5979,7 @@ void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /*
                zend_bool has_body = stmt_ast != NULL;
                zend_begin_method_decl(op_array, decl->name, has_body);
        } else {
-               if (zend_begin_func_decl(result, op_array, decl, toplevel) == FAILURE) {
-                       /* A function with this RTD key is already registered.
-                        * Fail gracefully by reusing the existing function. */
-                       destroy_op_array(op_array);
-                       return;
-               }
-
+               zend_begin_func_decl(result, op_array, decl, toplevel);
                if (decl->kind == ZEND_AST_ARROW_FUNC) {
                        find_implicit_binds(&info, params_ast, stmt_ast);
                        compile_implicit_lexical_binds(&info, result, op_array);