Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 84f82d0

Browse files
gen_stub: Fix ce_flags generation for compatibility mode (php#18507)
* gen_stub: Fix `ce_flags` generation for compatibility mode Fixes php#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)

AltStyle によって変換されたページ (->オリジナル) /