@@ -350,16 +350,39 @@ public function getArgInfoName(): string {
350350 }
351351}
352352
353+ class ClassInfo {
354+ /** @var string */
355+ public $ name ;
356+ /** @var FuncInfo[] */
357+ public $ funcInfos ;
358+
359+ public function __construct (string $ name , array $ funcInfos ) {
360+ $ this ->name = $ name ;
361+ $ this ->funcInfos = $ funcInfos ;
362+ }
363+ }
364+
353365class FileInfo {
354366 /** @var FuncInfo[] */
355367 public $ funcInfos ;
368+ /** @var ClassInfo[] */
369+ public $ classInfos ;
356370 /** @var bool */
357371 public $ generateFunctionEntries ;
358372
359- public function __construct (array $ funcInfos , bool $ generateFunctionEntries ) {
373+ public function __construct (
374+ array $ funcInfos , array $ classInfos , bool $ generateFunctionEntries ) {
360375 $ this ->funcInfos = $ funcInfos ;
376+ $ this ->classInfos = $ classInfos ;
361377 $ this ->generateFunctionEntries = $ generateFunctionEntries ;
362378 }
379+
380+ public function getAllFuncInfos (): iterable {
381+ yield from $ this ->funcInfos ;
382+ foreach ($ this ->classInfos as $ classInfo ) {
383+ yield from $ classInfo ->funcInfos ;
384+ }
385+ }
363386}
364387
365388function parseFunctionLike (
@@ -507,6 +530,7 @@ function parseStubFile(string $fileName): FileInfo {
507530 }
508531
509532 $ funcInfos = [];
533+ $ classInfos = [];
510534 $ conds = [];
511535 foreach ($ stmts as $ stmt ) {
512536 $ cond = handlePreprocessorConditions ($ conds , $ stmt );
@@ -521,6 +545,7 @@ function parseStubFile(string $fileName): FileInfo {
521545
522546 if ($ stmt instanceof Stmt \ClassLike) {
523547 $ className = $ stmt ->name ->toString ();
548+ $ methodInfos = [];
524549 foreach ($ stmt ->stmts as $ classStmt ) {
525550 $ cond = handlePreprocessorConditions ($ conds , $ classStmt );
526551 if ($ classStmt instanceof Stmt \Nop) {
@@ -531,16 +556,18 @@ function parseStubFile(string $fileName): FileInfo {
531556 throw new Exception ("Not implemented {$ classStmt ->getType ()}" );
532557 }
533558
534- $ funcInfos [] = parseFunctionLike (
559+ $ methodInfos [] = parseFunctionLike (
535560 $ classStmt ->name ->toString (), $ className , $ classStmt , $ cond );
536561 }
562+
563+ $ classInfos [] = new ClassInfo ($ className , $ methodInfos );
537564 continue ;
538565 }
539566
540567 throw new Exception ("Unexpected node {$ stmt ->getType ()}" );
541568 }
542569
543- return new FileInfo ($ funcInfos , $ generateFunctionEntries );
570+ return new FileInfo ($ funcInfos , $ classInfos , $ generateFunctionEntries );
544571}
545572
546573function funcInfoToCode (FuncInfo $ funcInfo ): string {
@@ -638,10 +665,11 @@ function findEquivalentFuncInfo(array $generatedFuncInfos, $funcInfo): ?FuncInfo
638665 return null ;
639666}
640667
668+ /** @param FuncInfo[] $funcInfos */
641669function generateCodeWithConditions (
642- FileInfo $ fileInfo , string $ separator , Closure $ codeGenerator ): string {
670+ iterable $ funcInfos , string $ separator , Closure $ codeGenerator ): string {
643671 $ code = "" ;
644- foreach ($ fileInfo -> funcInfos as $ funcInfo ) {
672+ foreach ($ funcInfos as $ funcInfo ) {
645673 $ funcCode = $ codeGenerator ($ funcInfo );
646674 if ($ funcCode === null ) {
647675 continue ;
@@ -665,7 +693,7 @@ function generateArgInfoCode(FileInfo $fileInfo): string {
665693 $ code = "/* This is a generated file, edit the .stub.php file instead. */ \n" ;
666694 $ generatedFuncInfos = [];
667695 $ code .= generateCodeWithConditions (
668- $ fileInfo , "\n" ,
696+ $ fileInfo-> getAllFuncInfos () , "\n" ,
669697 function (FuncInfo $ funcInfo ) use (&$ generatedFuncInfos ) {
670698 /* If there already is an equivalent arginfo structure, only emit a #define */
671699 if ($ generatedFuncInfo = findEquivalentFuncInfo ($ generatedFuncInfos , $ funcInfo )) {
@@ -684,20 +712,16 @@ function(FuncInfo $funcInfo) use(&$generatedFuncInfos) {
684712
685713 if ($ fileInfo ->generateFunctionEntries ) {
686714 $ code .= "\n\n" ;
687- $ code .= generateCodeWithConditions ($ fileInfo , "" , function (FuncInfo $ funcInfo ) {
688- if ($ funcInfo ->className || $ funcInfo -> alias ) {
715+ $ code .= generateCodeWithConditions ($ fileInfo-> funcInfos , "" , function (FuncInfo $ funcInfo ) {
716+ if ($ funcInfo ->alias ) {
689717 return null ;
690718 }
691719
692720 return "ZEND_FUNCTION( $ funcInfo ->name ); \n" ;
693721 });
694722
695723 $ code .= "\n\nstatic const zend_function_entry ext_functions[] = { \n" ;
696- $ code .= generateCodeWithConditions ($ fileInfo , "" , function (FuncInfo $ funcInfo ) {
697- if ($ funcInfo ->className ) {
698- return null ;
699- }
700-
724+ $ code .= generateCodeWithConditions ($ fileInfo ->funcInfos , "" , function (FuncInfo $ funcInfo ) {
701725 if ($ funcInfo ->alias ) {
702726 return sprintf (
703727 "\tZEND_FALIAS(%s, %s, %s) \n" ,
0 commit comments