Skip to content

Commit 26b7eb7

Browse files
committed
defer compiling inner classes
1 parent 7465d26 commit 26b7eb7

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

Zend/zend_compile.c

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9296,6 +9296,22 @@ static void zend_compile_class_decl(znode *result, zend_ast *ast, bool toplevel)
92969296
zend_verify_abstract_class(ce);
92979297
}
92989298

9299+
if (inner_class_queue == NULL) {
9300+
CG(active_class_entry) = original_ce;
9301+
} else {
9302+
HashTable *queue = inner_class_queue;
9303+
inner_class_queue = NULL;
9304+
9305+
ZEND_HASH_FOREACH_PTR(queue, ast) {
9306+
zend_compile_class_decl(NULL, ast, 0);
9307+
} ZEND_HASH_FOREACH_END();
9308+
9309+
CG(active_class_entry) = original_ce;
9310+
9311+
zend_hash_destroy(queue);
9312+
FREE_HASHTABLE(queue);
9313+
}
9314+
92999315
if (toplevel) {
93009316
ce->ce_flags |= ZEND_ACC_TOP_LEVEL;
93019317
}
@@ -9316,7 +9332,7 @@ static void zend_compile_class_decl(znode *result, zend_ast *ast, bool toplevel)
93169332
&& !zend_compile_ignore_class(parent_ce, ce->info.user.filename)) {
93179333
if (zend_try_early_bind(ce, parent_ce, lcname, NULL)) {
93189334
zend_string_release(lcname);
9319-
goto compile_inner_classes;
9335+
return;
93209336
}
93219337
}
93229338
} else if (EXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL)) {
@@ -9325,7 +9341,7 @@ static void zend_compile_class_decl(znode *result, zend_ast *ast, bool toplevel)
93259341
zend_inheritance_check_override(ce);
93269342
ce->ce_flags |= ZEND_ACC_LINKED;
93279343
zend_observer_class_linked_notify(ce, lcname);
9328-
goto compile_inner_classes;
9344+
return;
93299345
} else {
93309346
goto link_unbound;
93319347
}
@@ -9395,24 +9411,6 @@ static void zend_compile_class_decl(znode *result, zend_ast *ast, bool toplevel)
93959411
opline->result.opline_num = -1;
93969412
}
93979413
}
9398-
compile_inner_classes:
9399-
9400-
if (inner_class_queue == NULL) {
9401-
CG(active_class_entry) = original_ce;
9402-
return;
9403-
}
9404-
9405-
HashTable *queue = inner_class_queue;
9406-
inner_class_queue = NULL;
9407-
9408-
ZEND_HASH_FOREACH_PTR(queue, ast) {
9409-
zend_compile_class_decl(NULL, ast, 0);
9410-
} ZEND_HASH_FOREACH_END();
9411-
9412-
CG(active_class_entry) = original_ce;
9413-
9414-
zend_hash_destroy(queue);
9415-
FREE_HASHTABLE(queue);
94169414
}
94179415
/* }}} */
94189416

@@ -11683,6 +11681,10 @@ static void zend_compile_stmt(zend_ast *ast) /* {{{ */
1168311681
zend_compile_use_trait(ast);
1168411682
break;
1168511683
case ZEND_AST_CLASS:
11684+
if (CG(active_class_entry)) {
11685+
zend_defer_class_decl(ast);
11686+
break;
11687+
}
1168611688
zend_compile_class_decl(NULL, ast, 0);
1168711689
break;
1168811690
case ZEND_AST_GROUP_USE:

0 commit comments

Comments
 (0)