@@ -350,16 +350,39 @@ public function getArgInfoName(): string {
350
350
}
351
351
}
352
352
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
+
353
365
class FileInfo {
354
366
/** @var FuncInfo[] */
355
367
public $ funcInfos ;
368
+ /** @var ClassInfo[] */
369
+ public $ classInfos ;
356
370
/** @var bool */
357
371
public $ generateFunctionEntries ;
358
372
359
- public function __construct (array $ funcInfos , bool $ generateFunctionEntries ) {
373
+ public function __construct (
374
+ array $ funcInfos , array $ classInfos , bool $ generateFunctionEntries ) {
360
375
$ this ->funcInfos = $ funcInfos ;
376
+ $ this ->classInfos = $ classInfos ;
361
377
$ this ->generateFunctionEntries = $ generateFunctionEntries ;
362
378
}
379
+
380
+ public function getAllFuncInfos (): iterable {
381
+ yield from $ this ->funcInfos ;
382
+ foreach ($ this ->classInfos as $ classInfo ) {
383
+ yield from $ classInfo ->funcInfos ;
384
+ }
385
+ }
363
386
}
364
387
365
388
function parseFunctionLike (
@@ -507,6 +530,7 @@ function parseStubFile(string $fileName): FileInfo {
507
530
}
508
531
509
532
$ funcInfos = [];
533
+ $ classInfos = [];
510
534
$ conds = [];
511
535
foreach ($ stmts as $ stmt ) {
512
536
$ cond = handlePreprocessorConditions ($ conds , $ stmt );
@@ -521,6 +545,7 @@ function parseStubFile(string $fileName): FileInfo {
521
545
522
546
if ($ stmt instanceof Stmt \ClassLike) {
523
547
$ className = $ stmt ->name ->toString ();
548
+ $ methodInfos = [];
524
549
foreach ($ stmt ->stmts as $ classStmt ) {
525
550
$ cond = handlePreprocessorConditions ($ conds , $ classStmt );
526
551
if ($ classStmt instanceof Stmt \Nop) {
@@ -531,16 +556,18 @@ function parseStubFile(string $fileName): FileInfo {
531
556
throw new Exception ("Not implemented {$ classStmt ->getType ()}" );
532
557
}
533
558
534
- $ funcInfos [] = parseFunctionLike (
559
+ $ methodInfos [] = parseFunctionLike (
535
560
$ classStmt ->name ->toString (), $ className , $ classStmt , $ cond );
536
561
}
562
+
563
+ $ classInfos [] = new ClassInfo ($ className , $ methodInfos );
537
564
continue ;
538
565
}
539
566
540
567
throw new Exception ("Unexpected node {$ stmt ->getType ()}" );
541
568
}
542
569
543
- return new FileInfo ($ funcInfos , $ generateFunctionEntries );
570
+ return new FileInfo ($ funcInfos , $ classInfos , $ generateFunctionEntries );
544
571
}
545
572
546
573
function funcInfoToCode (FuncInfo $ funcInfo ): string {
@@ -638,10 +665,11 @@ function findEquivalentFuncInfo(array $generatedFuncInfos, $funcInfo): ?FuncInfo
638
665
return null ;
639
666
}
640
667
668
+ /** @param FuncInfo[] $funcInfos */
641
669
function generateCodeWithConditions (
642
- FileInfo $ fileInfo , string $ separator , Closure $ codeGenerator ): string {
670
+ iterable $ funcInfos , string $ separator , Closure $ codeGenerator ): string {
643
671
$ code = "" ;
644
- foreach ($ fileInfo -> funcInfos as $ funcInfo ) {
672
+ foreach ($ funcInfos as $ funcInfo ) {
645
673
$ funcCode = $ codeGenerator ($ funcInfo );
646
674
if ($ funcCode === null ) {
647
675
continue ;
@@ -665,7 +693,7 @@ function generateArgInfoCode(FileInfo $fileInfo): string {
665
693
$ code = "/* This is a generated file, edit the .stub.php file instead. */ \n" ;
666
694
$ generatedFuncInfos = [];
667
695
$ code .= generateCodeWithConditions (
668
- $ fileInfo , "\n" ,
696
+ $ fileInfo-> getAllFuncInfos () , "\n" ,
669
697
function (FuncInfo $ funcInfo ) use (&$ generatedFuncInfos ) {
670
698
/* If there already is an equivalent arginfo structure, only emit a #define */
671
699
if ($ generatedFuncInfo = findEquivalentFuncInfo ($ generatedFuncInfos , $ funcInfo )) {
@@ -684,20 +712,16 @@ function(FuncInfo $funcInfo) use(&$generatedFuncInfos) {
684
712
685
713
if ($ fileInfo ->generateFunctionEntries ) {
686
714
$ 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 ) {
689
717
return null ;
690
718
}
691
719
692
720
return "ZEND_FUNCTION( $ funcInfo ->name ); \n" ;
693
721
});
694
722
695
723
$ 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 ) {
701
725
if ($ funcInfo ->alias ) {
702
726
return sprintf (
703
727
"\tZEND_FALIAS(%s, %s, %s) \n" ,
0 commit comments