@@ -8138,9 +8138,10 @@ static uint32_t zend_add_dynamic_func_def(zend_op_array *def) {
8138
8138
return def_offset ;
8139
8139
}
8140
8140
8141
- static zend_string * zend_begin_func_decl (zend_op_array * op_array , zend_ast_decl * decl ) /* {{{ */
8141
+ static zend_string * zend_begin_func_decl (znode * result , zend_op_array * op_array , zend_ast_decl * decl , bool toplevel ) /* {{{ */
8142
8142
{
8143
8143
zend_string * unqualified_name , * name , * lcname ;
8144
+ zend_op * opline ;
8144
8145
8145
8146
if (op_array -> fn_flags & ZEND_ACC_CLOSURE ) {
8146
8147
zend_string * filename = op_array -> filename ;
@@ -8207,7 +8208,19 @@ static zend_string *zend_begin_func_decl(zend_op_array *op_array, zend_ast_decl
8207
8208
}
8208
8209
8209
8210
zend_register_seen_symbol (lcname , ZEND_SYMBOL_FUNCTION );
8210
-
8211
+ if (!toplevel ) {
8212
+ uint32_t func_ref = zend_add_dynamic_func_def (op_array );
8213
+ if (op_array -> fn_flags & ZEND_ACC_CLOSURE ) {
8214
+ opline = zend_emit_op_tmp (result , ZEND_DECLARE_LAMBDA_FUNCTION , NULL , NULL );
8215
+ opline -> op2 .num = func_ref ;
8216
+ } else {
8217
+ opline = get_next_op ();
8218
+ opline -> opcode = ZEND_DECLARE_FUNCTION ;
8219
+ opline -> op1_type = IS_CONST ;
8220
+ LITERAL_STR (opline -> op1 , zend_string_copy (lcname ));
8221
+ opline -> op2 .num = func_ref ;
8222
+ }
8223
+ }
8211
8224
return lcname ;
8212
8225
}
8213
8226
/* }}} */
@@ -8256,29 +8269,10 @@ static zend_op_array *zend_compile_func_decl_ex(
8256
8269
op_array -> scope = ce ;
8257
8270
op_array -> function_name = zend_string_copy (decl -> name );
8258
8271
} else if (is_method ) {
8259
- ZEND_ASSERT (!toplevel );
8260
8272
bool has_body = stmt_ast != NULL ;
8261
8273
lcname = zend_begin_method_decl (op_array , decl -> name , has_body );
8262
8274
} else {
8263
- lcname = zend_begin_func_decl (op_array , decl );
8264
- if (toplevel ) {
8265
- op_array -> fn_flags |= ZEND_ACC_TOP_LEVEL ;
8266
- } else {
8267
- zend_op * opline ;
8268
-
8269
- uint32_t func_ref = zend_add_dynamic_func_def (op_array );
8270
- if (op_array -> fn_flags & ZEND_ACC_CLOSURE ) {
8271
- opline = zend_emit_op_tmp (result , ZEND_DECLARE_LAMBDA_FUNCTION , NULL , NULL );
8272
- opline -> op2 .num = func_ref ;
8273
- } else {
8274
- opline = get_next_op ();
8275
- opline -> opcode = ZEND_DECLARE_FUNCTION ;
8276
- opline -> op1_type = IS_CONST ;
8277
- LITERAL_STR (opline -> op1 , zend_string_copy (lcname ));
8278
- opline -> op2 .num = func_ref ;
8279
- }
8280
- }
8281
-
8275
+ lcname = zend_begin_func_decl (result , op_array , decl , toplevel );
8282
8276
if (decl -> kind == ZEND_AST_ARROW_FUNC ) {
8283
8277
find_implicit_binds (& info , params_ast , stmt_ast );
8284
8278
compile_implicit_lexical_binds (& info , result , op_array );
@@ -8326,6 +8320,10 @@ static zend_op_array *zend_compile_func_decl_ex(
8326
8320
CG (active_class_entry ) = NULL ;
8327
8321
}
8328
8322
8323
+ if (toplevel ) {
8324
+ op_array -> fn_flags |= ZEND_ACC_TOP_LEVEL ;
8325
+ }
8326
+
8329
8327
zend_oparray_context_begin (& orig_oparray_context , op_array );
8330
8328
CG (context ).active_property_info = property_info ;
8331
8329
CG (context ).active_property_hook_kind = hook_kind ;
0 commit comments