@@ -2277,6 +2277,8 @@ class ClassInfo {
2277
2277
public $ funcInfos ;
2278
2278
/** @var EnumCaseInfo[] */
2279
2279
public $ enumCaseInfos ;
2280
+ /** @var string|null */
2281
+ public $ cond ;
2280
2282
2281
2283
/**
2282
2284
* @param Name[] $extends
@@ -2300,7 +2302,8 @@ public function __construct(
2300
2302
array $ constInfos ,
2301
2303
array $ propertyInfos ,
2302
2304
array $ funcInfos ,
2303
- array $ enumCaseInfos
2305
+ array $ enumCaseInfos ,
2306
+ ?string $ cond
2304
2307
) {
2305
2308
$ this ->name = $ name ;
2306
2309
$ this ->flags = $ flags ;
@@ -2316,6 +2319,7 @@ public function __construct(
2316
2319
$ this ->propertyInfos = $ propertyInfos ;
2317
2320
$ this ->funcInfos = $ funcInfos ;
2318
2321
$ this ->enumCaseInfos = $ enumCaseInfos ;
2322
+ $ this ->cond = $ cond ;
2319
2323
}
2320
2324
2321
2325
/**
@@ -2333,7 +2337,13 @@ public function getRegistration(iterable $allConstInfos): string
2333
2337
2334
2338
$ escapedName = implode ("_ " , $ this ->name ->parts );
2335
2339
2336
- $ code = "static zend_class_entry *register_class_ $ escapedName( " . (empty ($ params ) ? "void " : implode (", " , $ params )) . ") \n" ;
2340
+ $ code = '' ;
2341
+
2342
+ if ($ this ->cond ) {
2343
+ $ code .= "#if {$ this ->cond }\n" ;
2344
+ }
2345
+
2346
+ $ code .= "static zend_class_entry *register_class_ $ escapedName( " . (empty ($ params ) ? "void " : implode (", " , $ params )) . ") \n" ;
2337
2347
2338
2348
$ code .= "{ \n" ;
2339
2349
if ($ this ->type == "enum " ) {
@@ -2390,10 +2400,18 @@ function (Name $item) {
2390
2400
$ code .= $ property ->getDeclaration ($ allConstInfos );
2391
2401
}
2392
2402
2403
+ if ($ attributeInitializationCode = generateAttributeInitialization ($ this ->funcInfos , $ this ->cond )) {
2404
+ $ code .= "\n" . $ attributeInitializationCode ;
2405
+ }
2406
+
2393
2407
$ code .= "\n\treturn class_entry; \n" ;
2394
2408
2395
2409
$ code .= "} \n" ;
2396
2410
2411
+ if ($ this ->cond ) {
2412
+ $ code .= "#endif \n" ;
2413
+ }
2414
+
2397
2415
return $ code ;
2398
2416
}
2399
2417
@@ -3237,7 +3255,8 @@ function parseClass(
3237
3255
array $ consts ,
3238
3256
array $ properties ,
3239
3257
array $ methods ,
3240
- array $ enumCases
3258
+ array $ enumCases ,
3259
+ ?string $ cond
3241
3260
): ClassInfo {
3242
3261
$ flags = $ class instanceof Class_ ? $ class ->flags : 0 ;
3243
3262
$ comment = $ class ->getDocComment ();
@@ -3297,7 +3316,8 @@ function parseClass(
3297
3316
$ consts ,
3298
3317
$ properties ,
3299
3318
$ methods ,
3300
- $ enumCases
3319
+ $ enumCases ,
3320
+ $ cond
3301
3321
);
3302
3322
}
3303
3323
@@ -3447,7 +3467,7 @@ function handleStatements(FileInfo $fileInfo, array $stmts, PrettyPrinterAbstrac
3447
3467
}
3448
3468
3449
3469
$ fileInfo ->classInfos [] = parseClass (
3450
- $ className , $ stmt , $ constInfos , $ propertyInfos , $ methodInfos , $ enumCaseInfos
3470
+ $ className , $ stmt , $ constInfos , $ propertyInfos , $ methodInfos , $ enumCaseInfos, $ cond
3451
3471
);
3452
3472
continue ;
3453
3473
}
@@ -3613,9 +3633,10 @@ function findEquivalentFuncInfo(array $generatedFuncInfos, FuncInfo $funcInfo):
3613
3633
* @template T
3614
3634
* @param iterable<T> $infos
3615
3635
* @param Closure(T): string|null $codeGenerator
3636
+ * @param ?string $parentCond
3616
3637
*/
3617
3638
function generateCodeWithConditions (
3618
- iterable $ infos , string $ separator , Closure $ codeGenerator ): string {
3639
+ iterable $ infos , string $ separator , Closure $ codeGenerator, ? string $ parentCond = null ): string {
3619
3640
$ code = "" ;
3620
3641
foreach ($ infos as $ info ) {
3621
3642
$ infoCode = $ codeGenerator ($ info );
@@ -3624,7 +3645,7 @@ function generateCodeWithConditions(
3624
3645
}
3625
3646
3626
3647
$ code .= $ separator ;
3627
- if ($ info ->cond ) {
3648
+ if ($ info ->cond && $ info -> cond !== $ parentCond ) {
3628
3649
$ code .= "#if {$ info ->cond }\n" ;
3629
3650
$ code .= $ infoCode ;
3630
3651
$ code .= "#endif \n" ;
@@ -3689,21 +3710,15 @@ static function (FuncInfo $funcInfo) use ($fileInfo, &$generatedFunctionDeclarat
3689
3710
}
3690
3711
3691
3712
foreach ($ fileInfo ->classInfos as $ classInfo ) {
3692
- $ code .= generateFunctionEntries ($ classInfo ->name , $ classInfo ->funcInfos );
3713
+ $ code .= generateFunctionEntries ($ classInfo ->name , $ classInfo ->funcInfos , $ classInfo -> cond );
3693
3714
}
3694
3715
}
3695
3716
3696
3717
if ($ fileInfo ->generateClassEntries ) {
3697
- $ classEntriesWithSensitiveParams = [];
3698
- $ attributeInitializationCode = generateAttributeInitialization ($ fileInfo , $ classEntriesWithSensitiveParams );
3718
+ $ attributeInitializationCode = generateAttributeInitialization ($ fileInfo ->funcInfos );
3699
3719
3700
3720
if ($ attributeInitializationCode !== "" || !empty ($ fileInfo ->constInfos )) {
3701
- $ classEntriesWithSensitiveParams = array_unique ($ classEntriesWithSensitiveParams );
3702
- $ code .= "\nstatic void register_ {$ stubFilenameWithoutExtension }_symbols(int module_number " ;
3703
- foreach ($ classEntriesWithSensitiveParams as $ ce ) {
3704
- $ code .= ", zend_class_entry * $ ce " ;
3705
- }
3706
- $ code .= ") \n" ;
3721
+ $ code .= "\nstatic void register_ {$ stubFilenameWithoutExtension }_symbols(int module_number) \n" ;
3707
3722
$ code .= "{ \n" ;
3708
3723
3709
3724
foreach ($ fileInfo ->constInfos as $ constInfo ) {
@@ -3738,30 +3753,40 @@ function generateClassEntryCode(FileInfo $fileInfo, iterable $allConstInfos): st
3738
3753
}
3739
3754
3740
3755
/** @param FuncInfo[] $funcInfos */
3741
- function generateFunctionEntries (?Name $ className , array $ funcInfos ): string {
3742
- $ code = "" ;
3756
+ function generateFunctionEntries (?Name $ className , array $ funcInfos , ?string $ cond = null ): string {
3757
+ $ code = "\n\n" ;
3758
+
3759
+ if ($ cond ) {
3760
+ $ code .= "#if {$ cond }\n" ;
3761
+ }
3743
3762
3744
3763
$ functionEntryName = "ext_functions " ;
3745
3764
if ($ className ) {
3746
3765
$ underscoreName = implode ("_ " , $ className ->parts );
3747
3766
$ functionEntryName = "class_ {$ underscoreName }_methods " ;
3748
3767
}
3749
3768
3750
- $ code .= "\n\n static const zend_function_entry {$ functionEntryName }[] = { \n" ;
3769
+ $ code .= "static const zend_function_entry {$ functionEntryName }[] = { \n" ;
3751
3770
$ code .= generateCodeWithConditions ($ funcInfos , "" , static function (FuncInfo $ funcInfo ) {
3752
3771
return $ funcInfo ->getFunctionEntry ();
3753
- });
3772
+ }, $ cond );
3754
3773
$ code .= "\tZEND_FE_END \n" ;
3755
3774
$ code .= "}; \n" ;
3756
3775
3776
+ if ($ cond ) {
3777
+ $ code .= "#endif \n" ;
3778
+ }
3779
+
3757
3780
return $ code ;
3758
3781
}
3759
-
3760
- function generateAttributeInitialization (FileInfo $ fileInfo , array &$ classEntriesWithSensitiveParams ): string {
3782
+ /**
3783
+ * @param iterable<FuncInfo> $funcInfos
3784
+ */
3785
+ function generateAttributeInitialization (iterable $ funcInfos , ?string $ parentCond = null ): string {
3761
3786
return generateCodeWithConditions (
3762
- $ fileInfo -> getAllFuncInfos () ,
3787
+ $ funcInfos ,
3763
3788
"" ,
3764
- static function (FuncInfo $ funcInfo ) use (& $ classEntriesWithSensitiveParams ) {
3789
+ static function (FuncInfo $ funcInfo ) {
3765
3790
$ code = null ;
3766
3791
3767
3792
foreach ($ funcInfo ->args as $ index => $ arg ) {
@@ -3770,9 +3795,7 @@ static function (FuncInfo $funcInfo) use (&$classEntriesWithSensitiveParams) {
3770
3795
}
3771
3796
3772
3797
if ($ funcInfo ->name instanceof MethodName) {
3773
- $ classEntry = "class_entry_ " . str_replace ("\\" , "_ " , $ funcInfo ->name ->className ->toString ());
3774
- $ functionTable = "& {$ classEntry }->function_table " ;
3775
- $ classEntriesWithSensitiveParams [] = $ classEntry ;
3798
+ $ functionTable = "&class_entry->function_table " ;
3776
3799
} else {
3777
3800
$ functionTable = "CG(function_table) " ;
3778
3801
}
@@ -3781,7 +3804,8 @@ static function (FuncInfo $funcInfo) use (&$classEntriesWithSensitiveParams) {
3781
3804
}
3782
3805
3783
3806
return $ code ;
3784
- }
3807
+ },
3808
+ $ parentCond
3785
3809
);
3786
3810
}
3787
3811
0 commit comments