From a993e63b4bd7ea451dde937f19ce80f15bf5c799 Mon Sep 17 00:00:00 2001 From: Daniel Scherzer Date: Tue, 29 Apr 2025 18:54:56 -0700 Subject: [PATCH 1/2] gen_stub: ZEND_ACC_NODISCARD is for PHP 8.5+ --- build/gen_stub.php | 35 +++++++++++++++++++++++++++++------ ext/zend_test/test_arginfo.h | 12 ++++++++++-- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/build/gen_stub.php b/build/gen_stub.php index d3ffc04c3f890..9118804baee46 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -1390,7 +1390,13 @@ public function getFunctionEntry(): string { $name = "zim_" . $this->name->getDeclarationClassName() . "_" . $this->name->methodName; if ($isVanillaEntry) { - $functionEntryCode = "\tZEND_ME(" . $this->name->getDeclarationClassName() . ", " . $this->name->methodName . ", $argInfoName, " . implode("|", reset($flagsByPhpVersions)) . ")"; + $template = "\tZEND_ME(" . $this->name->getDeclarationClassName() . ", " . $this->name->methodName . ", $argInfoName, %s)\n"; + $flagsCode = generateVersionDependentFlagCode( + $template, + $flagsByPhpVersions, + $this->minimumPhpVersionIdCompatibility + ); + $functionEntryCode = rtrim( implode("", $flagsCode) ); } } } @@ -1406,7 +1412,15 @@ public function getFunctionEntry(): string { $zendName = '"' . $functionName . '"'; $name = "zif_$declarationName"; - if ($isVanillaEntry && reset($flagsByPhpVersions) === ["0"]) { + // Can only use ZEND_FE() if we have no flags for *all* versions + $hasFlags = false; + foreach ($flagsByPhpVersions as $flags) { + if ($flags !== ['0']) { + $hasFlags = true; + break; + } + } + if ($isVanillaEntry && !$hasFlags) { $functionEntryCode = "\tZEND_FE($declarationName, $argInfoName)"; } } @@ -1523,9 +1537,6 @@ private function getArginfoFlagsByPhpVersions(): array case "Deprecated": $flags[] = "ZEND_ACC_DEPRECATED"; break; - case "NoDiscard": - $flags[] = "ZEND_ACC_NODISCARD"; - break; } } @@ -1534,12 +1545,24 @@ private function getArginfoFlagsByPhpVersions(): array $php82AndAboveFlags[] = "ZEND_ACC_COMPILE_TIME_EVAL"; } + $php85AndAboveFlags = $php82AndAboveFlags; + foreach ($this->attributes as $attr) { + switch ($attr->class) { + case "NoDiscard": + $php85AndAboveFlags[] = "ZEND_ACC_NODISCARD"; + break; + } + } + if (empty($flags)) { $flags[] = "0"; } if (empty($php82AndAboveFlags)) { $php82AndAboveFlags[] = "0"; } + if (empty($php85AndAboveFlags)) { + $php85AndAboveFlags[] = "0"; + } return [ PHP_70_VERSION_ID => $flags, @@ -1548,7 +1571,7 @@ private function getArginfoFlagsByPhpVersions(): array PHP_82_VERSION_ID => $php82AndAboveFlags, PHP_83_VERSION_ID => $php82AndAboveFlags, PHP_84_VERSION_ID => $php82AndAboveFlags, - PHP_85_VERSION_ID => $php82AndAboveFlags, + PHP_85_VERSION_ID => $php85AndAboveFlags, ]; } diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 14a634f197d46..cb39e871a4666 100644 --- a/ext/zend_test/test_arginfo.h +++ b/ext/zend_test/test_arginfo.h @@ -368,14 +368,22 @@ static const zend_function_entry ext_functions[] = { ZEND_RAW_FENTRY("zend_test_deprecated_attr", zif_zend_test_deprecated_attr, arginfo_zend_test_deprecated_attr, ZEND_ACC_DEPRECATED) #endif #if (PHP_VERSION_ID >= 80400) +#if (PHP_VERSION_ID >= 80500) ZEND_RAW_FENTRY("zend_test_nodiscard", zif_zend_test_nodiscard, arginfo_zend_test_nodiscard, ZEND_ACC_NODISCARD, NULL, NULL) +#elif (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("zend_test_nodiscard", zif_zend_test_nodiscard, arginfo_zend_test_nodiscard, 0, NULL, NULL) +#endif #else - ZEND_RAW_FENTRY("zend_test_nodiscard", zif_zend_test_nodiscard, arginfo_zend_test_nodiscard, ZEND_ACC_NODISCARD) + ZEND_RAW_FENTRY("zend_test_nodiscard", zif_zend_test_nodiscard, arginfo_zend_test_nodiscard, 0) #endif #if (PHP_VERSION_ID >= 80400) +#if (PHP_VERSION_ID >= 80500) ZEND_RAW_FENTRY("zend_test_deprecated_nodiscard", zif_zend_test_deprecated_nodiscard, arginfo_zend_test_deprecated_nodiscard, ZEND_ACC_DEPRECATED|ZEND_ACC_NODISCARD, NULL, NULL) +#elif (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("zend_test_deprecated_nodiscard", zif_zend_test_deprecated_nodiscard, arginfo_zend_test_deprecated_nodiscard, ZEND_ACC_DEPRECATED, NULL, NULL) +#endif #else - ZEND_RAW_FENTRY("zend_test_deprecated_nodiscard", zif_zend_test_deprecated_nodiscard, arginfo_zend_test_deprecated_nodiscard, ZEND_ACC_DEPRECATED|ZEND_ACC_NODISCARD) + ZEND_RAW_FENTRY("zend_test_deprecated_nodiscard", zif_zend_test_deprecated_nodiscard, arginfo_zend_test_deprecated_nodiscard, ZEND_ACC_DEPRECATED) #endif #if (PHP_VERSION_ID >= 80400) ZEND_RAW_FENTRY("zend_test_aliased", zif_zend_test_void_return, arginfo_zend_test_aliased, 0, NULL, NULL) From 153afe96a373029bf6fed63774fea4891b464b47 Mon Sep 17 00:00:00 2001 From: DanielEScherzer Date: Sun, 4 May 2025 14:05:27 -0700 Subject: [PATCH 2/2] gen_stub: remove extra spaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Máté Kocsis --- build/gen_stub.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gen_stub.php b/build/gen_stub.php index 9118804baee46..1919d2e702a27 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -1396,7 +1396,7 @@ public function getFunctionEntry(): string { $flagsByPhpVersions, $this->minimumPhpVersionIdCompatibility ); - $functionEntryCode = rtrim( implode("", $flagsCode) ); + $functionEntryCode = rtrim(implode("", $flagsCode)); } } }