diff --git a/build/gen_stub.php b/build/gen_stub.php index d3ffc04c3f890..1919d2e702a27 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)