Skip to content

Commit 84f82d0

Browse files
authored
gen_stub: Fix ce_flags generation for compatibility mode (#18507)
* gen_stub: Fix `ce_flags` generation for compatibility mode Fixes #18506 * gen_stub: Improve output for ce_flags compatibility
1 parent 71ffa95 commit 84f82d0

File tree

4 files changed

+41
-14
lines changed

4 files changed

+41
-14
lines changed

build/gen_stub.php

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3282,18 +3282,13 @@ public function getRegistration(array $allConstInfos): string
32823282

32833283
$code .= "{\n";
32843284

3285-
$flagCodes = generateVersionDependentFlagCode("%s", $this->getFlagsByPhpVersion(), $this->phpVersionIdMinimumCompatibility);
3286-
$flags = implode("", $flagCodes);
3287-
32883285
$classMethods = ($this->funcInfos === []) ? 'NULL' : "class_{$escapedName}_methods";
32893286
if ($this->type === "enum") {
32903287
$name = addslashes((string) $this->name);
32913288
$backingType = $this->enumBackingType
32923289
? $this->enumBackingType->toTypeCode() : "IS_UNDEF";
32933290
$code .= "\tzend_class_entry *class_entry = zend_register_internal_enum(\"$name\", $backingType, $classMethods);\n";
3294-
if ($flags !== "") {
3295-
$code .= "\tclass_entry->ce_flags |= $flags\n";
3296-
}
3291+
$code .= implode("", generateVersionDependentFlagCode("\tclass_entry->ce_flags = %s;\n", $this->getFlagsByPhpVersion(), $this->phpVersionIdMinimumCompatibility));
32973292
} else {
32983293
$code .= "\tzend_class_entry ce, *class_entry;\n\n";
32993294
if (count($this->name->getParts()) > 1) {
@@ -3310,22 +3305,25 @@ public function getRegistration(array $allConstInfos): string
33103305
$code .= "#if (PHP_VERSION_ID >= " . PHP_84_VERSION_ID . ")\n";
33113306
}
33123307

3313-
$code .= "\tclass_entry = zend_register_internal_class_with_flags(&ce, " . (isset($this->extends[0]) ? "class_entry_" . str_replace("\\", "_", $this->extends[0]->toString()) : "NULL") . ", " . ($flags ?: 0) . ");\n";
3308+
$template = "\tclass_entry = zend_register_internal_class_with_flags(&ce, " . (isset($this->extends[0]) ? "class_entry_" . str_replace("\\", "_", $this->extends[0]->toString()) : "NULL") . ", %s);\n";
3309+
$entries = generateVersionDependentFlagCode($template, $this->getFlagsByPhpVersion(), $this->phpVersionIdMinimumCompatibility ? max($this->phpVersionIdMinimumCompatibility, PHP_84_VERSION_ID) : null);
3310+
if ($entries !== []) {
3311+
$code .= implode("", $entries);
3312+
} else {
3313+
$code .= sprintf($template, "0");
3314+
}
33143315

33153316
if (!$php84MinimumCompatibility) {
33163317
$code .= "#else\n";
33173318

33183319
$code .= "\tclass_entry = zend_register_internal_class_ex(&ce, " . (isset($this->extends[0]) ? "class_entry_" . str_replace("\\", "_", $this->extends[0]->toString()) : "NULL") . ");\n";
3319-
if ($flags !== "") {
3320-
$code .= "\tclass_entry->ce_flags |= $flags;\n";
3321-
}
3320+
$code .= implode("", generateVersionDependentFlagCode("\tclass_entry->ce_flags |= %s;\n", $this->getFlagsByPhpVersion(), $this->phpVersionIdMinimumCompatibility));
33223321
$code .= "#endif\n";
33233322
}
33243323
} else {
33253324
$code .= "\tclass_entry = zend_register_internal_interface(&ce);\n";
3326-
if ($flags !== "") {
3327-
$code .= "\tclass_entry->ce_flags |= $flags\n";
3328-
}
3325+
$code .= implode("", generateVersionDependentFlagCode("\tclass_entry->ce_flags |= %s;\n", $this->getFlagsByPhpVersion(), $this->phpVersionIdMinimumCompatibility));
3326+
33293327
}
33303328
}
33313329

ext/zend_test/test.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ ZEND_DECLARE_MODULE_GLOBALS(zend_test)
5454
static zend_class_entry *zend_test_interface;
5555
static zend_class_entry *zend_test_class;
5656
static zend_class_entry *zend_test_child_class;
57+
static zend_class_entry *zend_test_gen_stub_flag_compatibility_test;
5758
static zend_class_entry *zend_attribute_test_class;
5859
static zend_class_entry *zend_test_trait;
5960
static zend_class_entry *zend_test_attribute;
@@ -1271,6 +1272,8 @@ PHP_MINIT_FUNCTION(zend_test)
12711272
memcpy(&zend_test_class_handlers, &std_object_handlers, sizeof(zend_object_handlers));
12721273
zend_test_class_handlers.get_method = zend_test_class_method_get;
12731274

1275+
zend_test_gen_stub_flag_compatibility_test = register_class_ZendTestGenStubFlagCompatibilityTest();
1276+
12741277
zend_attribute_test_class = register_class_ZendAttributeTest();
12751278

12761279
zend_test_trait = register_class__ZendTestTrait();

ext/zend_test/test.stub.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ class _ZendTestChildClass extends _ZendTestClass
8585
public function returnsThrowable(): Exception {}
8686
}
8787

88+
/**
89+
* @not-serializable
90+
*/
91+
final class ZendTestGenStubFlagCompatibilityTest {
92+
93+
}
94+
8895
class ZendAttributeTest {
8996
/** @var int */
9097
#[ZendTestRepeatableAttribute]

ext/zend_test/test_arginfo.h

Lines changed: 20 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)