aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository/platform_repository.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-07 20:51:59 +0900
committernsfisis <nsfisis@gmail.com>2026-08-07 20:51:59 +0900
commitae365645730b95d5b01b0df7382b91668d5fa24e (patch)
tree962e3abb51132097ff11a79d453e058945ae699c /crates/shirabe/src/repository/platform_repository.rs
parentf749a47804cd296a3059cd3f8079c62dbaa5fdc0 (diff)
downloadphp-shirabe-ae365645730b95d5b01b0df7382b91668d5fa24e.tar.gz
php-shirabe-ae365645730b95d5b01b0df7382b91668d5fa24e.tar.zst
php-shirabe-ae365645730b95d5b01b0df7382b91668d5fa24e.zip
refactor(platform-repository): fetch the PHP runtime in one RPC call
The RuntimeInterface seam asked the worker one question at a time: a round trip per loaded extension, per ReflectionExtension::info() output and per constant, so a single `show --platform` cost 70 to 100 of them. A `platform` dispatch entry now answers all of it as one PHP array, which shirabe-php-rpc decodes into a OnceLock-cached PlatformInfo, the way the diagnose command already works. Composer\Platform\Runtime therefore has no Rust counterpart any more. Its work belongs to the running interpreter, and invoke()/construct() could only be ported as a whitelist that panicked on anything unlisted; it is ported as PHP into the worker instead, and PlatformRepository reads the answers off PlatformInfo. Accessors panic on a name the payload does not carry, so the worker and its consumers cannot drift apart unnoticed. The tests describe the runtime as payload data where they used to mock the seam, with the datasets unchanged. The one loss is the call-count assertion of test_inet_pton_regression: the payload reports the result of `@inet_pton('::')` rather than answering a call. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/repository/platform_repository.rs')
-rw-r--r--crates/shirabe/src/repository/platform_repository.rs251
1 files changed, 107 insertions, 144 deletions
diff --git a/crates/shirabe/src/repository/platform_repository.rs b/crates/shirabe/src/repository/platform_repository.rs
index 5b205ba0..944bb4db 100644
--- a/crates/shirabe/src/repository/platform_repository.rs
+++ b/crates/shirabe/src/repository/platform_repository.rs
@@ -11,16 +11,14 @@ use crate::package::PackageInterfaceHandle;
use crate::package::version::VersionParser;
use crate::platform::HhvmDetector;
use crate::platform::HhvmDetectorInterface;
-use crate::platform::Runtime;
-use crate::platform::RuntimeInterface;
use crate::platform::Version;
use crate::plugin::plugin_interface::{self};
use crate::repository::ArrayRepository;
use crate::repository::RepositoryInterface;
-use crate::util::Silencer;
use indexmap::IndexMap;
use shirabe_external_packages::composer::pcre::{CaptureKey, Preg};
use shirabe_external_packages::composer::xdebug_handler::XdebugHandler;
+use shirabe_php_rpc::PlatformInfo;
use shirabe_php_shim::{
InvalidArgumentException, PhpMixed, UnexpectedValueException, array_map_str_fn,
array_slice_strs, explode, get_class, implode, in_array_strict, is_string, php_regex,
@@ -47,27 +45,21 @@ pub struct PlatformRepository {
pub(crate) version_parser: Option<VersionParser>,
pub(crate) overrides: IndexMap<String, PlatformOverride>,
pub(crate) disabled_packages: IndexMap<String, CompletePackageInterfaceHandle>,
- pub(crate) runtime: Box<dyn RuntimeInterface>,
+ pub(crate) platform_info: Option<PlatformInfo>,
pub(crate) hhvm_detector: Box<dyn HhvmDetectorInterface>,
}
impl PlatformRepository {
const PLATFORM_PACKAGE_REGEX: &'static str = "{^(?:php(?:-64bit|-ipv6|-zts|-debug)?|hhvm|(?:ext|lib)-[a-z0-9](?:[_.-]?[a-z0-9]+)*|composer(?:-(?:plugin|runtime)-api)?)$}iD";
+ /// A `None` `platform_info` is resolved from the PHP worker on the first `initialize()`, so
+ /// constructing the repository on its own never starts the worker.
pub fn new(
packages: Vec<PackageInterfaceHandle>,
overrides: IndexMap<String, PhpMixed>,
- ) -> anyhow::Result<Self> {
- Self::new4(packages, overrides, None, None)
- }
-
- pub fn new4(
- packages: Vec<PackageInterfaceHandle>,
- overrides: IndexMap<String, PhpMixed>,
- runtime: Option<Box<dyn RuntimeInterface>>,
+ platform_info: Option<PlatformInfo>,
hhvm_detector: Option<Box<dyn HhvmDetectorInterface>>,
) -> anyhow::Result<Self> {
- let runtime: Box<dyn RuntimeInterface> = runtime.unwrap_or_else(|| Box::new(Runtime));
let hhvm_detector: Box<dyn HhvmDetectorInterface> =
hhvm_detector.unwrap_or_else(|| Box::new(HhvmDetector::new(None, None)));
let mut overrides_map: IndexMap<String, PlatformOverride> = IndexMap::new();
@@ -107,7 +99,7 @@ impl PlatformRepository {
version_parser: None,
overrides: overrides_map,
disabled_packages: IndexMap::new(),
- runtime,
+ platform_info,
hhvm_detector,
};
for package in packages {
@@ -139,6 +131,11 @@ impl PlatformRepository {
pub(crate) fn initialize(&mut self) -> anyhow::Result<()> {
self.inner.initialize();
+ let platform_info = self
+ .platform_info
+ .get_or_insert_with(|| shirabe_php_rpc::get_platform_info().clone())
+ .clone();
+
let mut libraries: IndexMap<String, bool> = IndexMap::new();
self.version_parser = Some(VersionParser::new());
@@ -214,7 +211,7 @@ impl PlatformRepository {
CompletePackageHandle::from_complete_package(composer_runtime_api).into(),
)?;
- let php_version_const = self.runtime.get_constant("PHP_VERSION", None);
+ let php_version_const = platform_info.get_constant("PHP_VERSION", None);
let php_version_str = match &php_version_const {
PhpMixed::String(s) => s.clone(),
_ => "".to_string(),
@@ -245,8 +242,7 @@ impl PlatformRepository {
php.set_description("The PHP interpreter".to_string());
self.add_package(CompletePackageHandle::from_complete_package(php).into())?;
- if self
- .runtime
+ if platform_info
.get_constant("PHP_DEBUG", None)
.as_bool()
.unwrap_or(false)
@@ -260,9 +256,8 @@ impl PlatformRepository {
self.add_package(CompletePackageHandle::from_complete_package(phpdebug).into())?;
}
- if self.runtime.has_constant("PHP_ZTS", None)
- && self
- .runtime
+ if platform_info.has_constant("PHP_ZTS", None)
+ && platform_info
.get_constant("PHP_ZTS", None)
.as_bool()
.unwrap_or(false)
@@ -276,8 +271,7 @@ impl PlatformRepository {
self.add_package(CompletePackageHandle::from_complete_package(phpzts).into())?;
}
- if self
- .runtime
+ if platform_info
.get_constant("PHP_INT_SIZE", None)
.as_int()
.map(|v| v == 8)
@@ -294,15 +288,8 @@ impl PlatformRepository {
// The AF_INET6 constant is only defined if ext-sockets is available but
// IPv6 support might still be available.
- let has_inet6 = self.runtime.has_constant("AF_INET6", None);
- // PHP: Silencer::call([$this->runtime, 'invoke'], 'inet_pton', ['::'])
- let inet_pton_check = Silencer::call(|| {
- Ok::<PhpMixed, anyhow::Error>(self.runtime.invoke(
- PhpMixed::String("inet_pton".to_string()),
- vec![PhpMixed::String("::".to_string())],
- ))
- })
- .unwrap_or(PhpMixed::Bool(false));
+ let has_inet6 = platform_info.has_constant("AF_INET6", None);
+ let inet_pton_check = &platform_info.inet_pton_ipv6;
if has_inet6 || !matches!(inet_pton_check, PhpMixed::Bool(false)) {
let mut php_ipv6 =
CompletePackage::new("php-ipv6".to_string(), version, pretty_version);
@@ -310,7 +297,7 @@ impl PlatformRepository {
self.add_package(CompletePackageHandle::from_complete_package(php_ipv6).into())?;
}
- let loaded_extensions = self.runtime.get_extensions();
+ let loaded_extensions = platform_info.get_extensions().to_vec();
// Extensions scanning
for name in &loaded_extensions {
@@ -318,7 +305,7 @@ impl PlatformRepository {
continue;
}
- self.add_extension(name, &self.runtime.get_extension_version(name))?;
+ self.add_extension(name, platform_info.get_extension_version(name))?;
}
// Check for Xdebug in a restarted process
@@ -340,13 +327,13 @@ impl PlatformRepository {
for name in &loaded_extensions {
match name.as_str() {
"amqp" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
// librabbitmq version => 0.9.0
let mut librabbitmq_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^librabbitmq version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut librabbitmq_matches),
) {
self.add_library(
@@ -365,7 +352,7 @@ impl PlatformRepository {
let mut protocol_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^AMQP protocol version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut protocol_matches),
) {
let version_str = protocol_matches
@@ -384,13 +371,13 @@ impl PlatformRepository {
}
"bz2" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
// BZip2 Version => 1.0.6, 6-Sept-2010
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^BZip2 Version => (?<version>.*),/im"),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -407,9 +394,7 @@ impl PlatformRepository {
}
"curl" => {
- let curl_version = self
- .runtime
- .invoke(PhpMixed::String("curl_version".to_string()), vec![]);
+ let curl_version = &platform_info.curl_version;
let curl_version_str = curl_version
.as_array()
.and_then(|m| m.get("version"))
@@ -419,13 +404,13 @@ impl PlatformRepository {
self.add_library(&mut libraries, name, Some(cv), None, &[], &[])?;
}
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
// SSL Version => OpenSSL/1.0.1t
let mut ssl_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("{^SSL Version => (?<library>[^/]+)/(?<version>.+)$}im"),
- &info,
+ info,
Some(&mut ssl_matches),
) {
let ssl_library_raw = ssl_matches
@@ -495,7 +480,7 @@ impl PlatformRepository {
php_regex!(
"{^libSSH Version => (?<library>[^/]+)/(?<version>.+?)(?:/.*)?$}im"
),
- &info,
+ info,
Some(&mut ssh_matches),
) {
let ssh_library = ssh_matches
@@ -520,7 +505,7 @@ impl PlatformRepository {
let mut zlib_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("{^ZLib Version => (?<version>.+)$}im"),
- &info,
+ info,
Some(&mut zlib_matches),
) {
self.add_library(
@@ -537,13 +522,13 @@ impl PlatformRepository {
}
"date" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
// timelib version => 2018.03
let mut timelib_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^timelib version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut timelib_matches),
) {
self.add_library(
@@ -562,7 +547,7 @@ impl PlatformRepository {
let mut zoneinfo_source_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^Timezone Database => (?<source>internal|external)$/im"),
- &info,
+ info,
Some(&mut zoneinfo_source_matches),
) {
let external = zoneinfo_source_matches
@@ -574,7 +559,7 @@ impl PlatformRepository {
php_regex!(
"/^\"Olson\" Timezone Database Version => (?<version>.+?)(?:\\.system)?$/im"
),
- &info,
+ info,
Some(&mut zoneinfo_matches),
) {
let zoneinfo_version = zoneinfo_matches
@@ -608,13 +593,13 @@ impl PlatformRepository {
}
"fileinfo" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
// libmagic => 537
let mut magic_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^libmagic => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut magic_matches),
) {
self.add_library(
@@ -631,7 +616,7 @@ impl PlatformRepository {
}
"gd" => {
- let gd_version = self.runtime.get_constant("GD_VERSION", None);
+ let gd_version = platform_info.get_constant("GD_VERSION", None);
let gd_version_str = match &gd_version {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -645,12 +630,12 @@ impl PlatformRepository {
&[],
)?;
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
let mut libjpeg_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^libJPEG Version => (?<version>.+?)(?: compatible)?$/im"),
- &info,
+ info,
Some(&mut libjpeg_matches),
) {
let libjpeg_version = libjpeg_matches
@@ -671,7 +656,7 @@ impl PlatformRepository {
let mut libpng_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^libPNG Version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut libpng_matches),
) {
self.add_library(
@@ -689,7 +674,7 @@ impl PlatformRepository {
let mut freetype_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^FreeType Version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut freetype_matches),
) {
self.add_library(
@@ -707,7 +692,7 @@ impl PlatformRepository {
let mut libxpm_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^libXpm Version => (?<versionId>\\d+)$/im"),
- &info,
+ info,
Some(&mut libxpm_matches),
) {
let version_id: i64 = libxpm_matches
@@ -727,7 +712,7 @@ impl PlatformRepository {
}
"gmp" => {
- let gmp_version = self.runtime.get_constant("GMP_VERSION", None);
+ let gmp_version = platform_info.get_constant("GMP_VERSION", None);
let gmp_version_str = match &gmp_version {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -743,7 +728,7 @@ impl PlatformRepository {
}
"iconv" => {
- let iconv_version = self.runtime.get_constant("ICONV_VERSION", None);
+ let iconv_version = platform_info.get_constant("ICONV_VERSION", None);
let iconv_version_str = match &iconv_version {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -759,12 +744,12 @@ impl PlatformRepository {
}
"intl" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
let description = "The ICU unicode and globalization support library";
// Truthy check is for testing only so we can make the condition fail
- if self.runtime.has_constant("INTL_ICU_VERSION", None) {
- let intl_icu_version = self.runtime.get_constant("INTL_ICU_VERSION", None);
+ if platform_info.has_constant("INTL_ICU_VERSION", None) {
+ let intl_icu_version = platform_info.get_constant("INTL_ICU_VERSION", None);
let intl_icu_str = match &intl_icu_version {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -781,7 +766,7 @@ impl PlatformRepository {
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^ICU version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -801,7 +786,7 @@ impl PlatformRepository {
let mut zoneinfo_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^ICU TZData version => (?<version>.*)$/im"),
- &info,
+ info,
Some(&mut zoneinfo_matches),
) {
let zi_version = zoneinfo_matches
@@ -821,22 +806,11 @@ impl PlatformRepository {
}
// Add a separate version for the CLDR library version
- if self.runtime.has_class("ResourceBundle") {
- let resource_bundle = self.runtime.invoke(
- PhpMixed::List(vec![
- PhpMixed::String("ResourceBundle".to_string()),
- PhpMixed::String("create".to_string()),
- ]),
- vec![
- PhpMixed::String("root".to_string()),
- PhpMixed::String("ICUDATA".to_string()),
- PhpMixed::Bool(false),
- ],
- );
+ if platform_info.has_class("ResourceBundle") {
+ let resource_bundle = &platform_info.resource_bundle;
if !matches!(resource_bundle, PhpMixed::Null) {
- // TODO(plugin): `$resourceBundle->get('Version')` dynamic method call
let version_value =
- Self::resource_bundle_get(&resource_bundle, "Version");
+ Self::resource_bundle_get(resource_bundle, "Version");
let version_str = match version_value {
PhpMixed::String(s) => Some(s),
_ => None,
@@ -852,16 +826,10 @@ impl PlatformRepository {
}
}
- if self.runtime.has_class("IntlChar") {
- let intl_char_versions = self.runtime.invoke(
- PhpMixed::List(vec![
- PhpMixed::String("IntlChar".to_string()),
- PhpMixed::String("getUnicodeVersion".to_string()),
- ]),
- vec![],
- );
+ if platform_info.has_class("IntlChar") {
+ let intl_char_versions = &platform_info.intl_char_unicode_version;
let sliced =
- shirabe_php_shim::array_slice_mixed(&intl_char_versions, 0, Some(3));
+ shirabe_php_shim::array_slice_mixed(intl_char_versions, 0, Some(3));
let joined = implode(".", &Self::php_array_to_string_vec(&sliced));
self.add_library(
&mut libraries,
@@ -875,10 +843,9 @@ impl PlatformRepository {
}
"imagick" => {
- let image_magick_version = self.runtime.construct("Imagick", Vec::new())?;
- // TODO(plugin): `->getVersion()` is a dynamic method call on Imagick
+ let image_magick_version = &platform_info.imagick;
let image_magick_version_str =
- Self::imagick_get_version_string(&image_magick_version);
+ Self::imagick_get_version_string(image_magick_version);
// 6.x: ImageMagick 6.2.9 08/24/06 Q16 http://www.imagemagick.org
// 7.x: ImageMagick 7.0.8-34 Q16 x86_64 2019-03-23 https://imagemagick.org
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
@@ -907,17 +874,17 @@ impl PlatformRepository {
}
"ldap" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
let mut vendor_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^Vendor Version => (?<versionId>\\d+)$/im"),
- &info,
+ info,
Some(&mut matches),
) && Preg::is_match3(
php_regex!("/^Vendor Name => (?<vendor>.+)$/im"),
- &info,
+ info,
Some(&mut vendor_matches),
) {
let version_id: i64 = matches
@@ -950,7 +917,7 @@ impl PlatformRepository {
.collect();
let libxml_provides: Vec<String> =
array_map_str_fn(|extension| format!("{}-libxml", extension), &intersected);
- let libxml_dotted = self.runtime.get_constant("LIBXML_DOTTED_VERSION", None);
+ let libxml_dotted = platform_info.get_constant("LIBXML_DOTTED_VERSION", None);
let libxml_dotted_str = match &libxml_dotted {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -966,13 +933,13 @@ impl PlatformRepository {
}
"mbstring" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
// libmbfl version => 1.3.2
let mut libmbfl_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^libmbfl version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut libmbfl_matches),
) {
self.add_library(
@@ -987,8 +954,8 @@ impl PlatformRepository {
)?;
}
- if self.runtime.has_constant("MB_ONIGURUMA_VERSION", None) {
- let oniguruma = self.runtime.get_constant("MB_ONIGURUMA_VERSION", None);
+ if platform_info.has_constant("MB_ONIGURUMA_VERSION", None) {
+ let oniguruma = platform_info.get_constant("MB_ONIGURUMA_VERSION", None);
let oniguruma_str = match &oniguruma {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -1010,7 +977,7 @@ impl PlatformRepository {
php_regex!(
"/^(?:oniguruma|Multibyte regex \\(oniguruma\\)) version => (?<version>.+)$/im"
),
- &info,
+ info,
Some(&mut oniguruma_matches),
) {
self.add_library(
@@ -1028,13 +995,13 @@ impl PlatformRepository {
}
"memcached" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
// libmemcached version => 1.0.18
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^libmemcached version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -1051,7 +1018,7 @@ impl PlatformRepository {
}
"openssl" => {
- let openssl_text = self.runtime.get_constant("OPENSSL_VERSION_TEXT", None);
+ let openssl_text = platform_info.get_constant("OPENSSL_VERSION_TEXT", None);
let openssl_text_str = match &openssl_text {
PhpMixed::String(s) => s.clone(),
_ => "".to_string(),
@@ -1086,7 +1053,7 @@ impl PlatformRepository {
}
"pcre" => {
- let pcre_version = self.runtime.get_constant("PCRE_VERSION", None);
+ let pcre_version = platform_info.get_constant("PCRE_VERSION", None);
let pcre_version_str = match &pcre_version {
PhpMixed::String(s) => s.clone(),
_ => "".to_string(),
@@ -1095,13 +1062,13 @@ impl PlatformRepository {
Preg::replace(php_regex!("{^(\\S+).*}"), "$1", &pcre_version_str);
self.add_library(&mut libraries, name, Some(&stripped), None, &[], &[])?;
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
// PCRE Unicode Version => 12.1.0
let mut pcre_unicode_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^PCRE Unicode Version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut pcre_unicode_matches),
) {
self.add_library(
@@ -1118,14 +1085,14 @@ impl PlatformRepository {
}
"mysqlnd" | "pdo_mysql" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!(
"/^(?:Client API version|Version) => mysqlnd (?<version>.+?) /mi"
),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -1142,12 +1109,12 @@ impl PlatformRepository {
}
"mongodb" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
let mut libmongoc_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^libmongoc bundled version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut libmongoc_matches),
) {
self.add_library(
@@ -1165,7 +1132,7 @@ impl PlatformRepository {
let mut libbson_matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^libbson bundled version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut libbson_matches),
) {
self.add_library(
@@ -1182,8 +1149,8 @@ impl PlatformRepository {
}
"pgsql" => {
- if self.runtime.has_constant("PGSQL_LIBPQ_VERSION", None) {
- let pq_version = self.runtime.get_constant("PGSQL_LIBPQ_VERSION", None);
+ if platform_info.has_constant("PGSQL_LIBPQ_VERSION", None) {
+ let pq_version = platform_info.get_constant("PGSQL_LIBPQ_VERSION", None);
let pq_version_str = match &pq_version {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -1198,12 +1165,12 @@ impl PlatformRepository {
)?;
} else {
// intentional fall-through to next case...
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^PostgreSQL\\(libpq\\) Version => (?<version>.*)$/im"),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -1221,12 +1188,12 @@ impl PlatformRepository {
}
"pdo_pgsql" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^PostgreSQL\\(libpq\\) Version => (?<version>.*)$/im"),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -1243,14 +1210,14 @@ impl PlatformRepository {
}
"pq" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
// Used Library => Compiled => Linked
// libpq => 14.3 (Ubuntu 14.3-1.pgdg22.04+1) => 15.0.2
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^libpq => (?<compiled>.+) => (?<linked>.+)$/im"),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -1267,7 +1234,7 @@ impl PlatformRepository {
}
"rdkafka" => {
- if self.runtime.has_constant("RD_KAFKA_VERSION", None) {
+ if platform_info.has_constant("RD_KAFKA_VERSION", None) {
// Interpreted as hex MM.mm.rr.xx:
// - MM = Major
// - mm = minor
@@ -1275,8 +1242,7 @@ impl PlatformRepository {
// - xx = pre-release id (0xff is the final release)
//
// pre-release ID in practice is always 0xff even for RCs etc, so we ignore it
- let lib_rd_kafka_version_int = self
- .runtime
+ let lib_rd_kafka_version_int = platform_info
.get_constant("RD_KAFKA_VERSION", None)
.as_int()
.unwrap_or(0);
@@ -1298,8 +1264,8 @@ impl PlatformRepository {
}
"libsodium" | "sodium" => {
- if self.runtime.has_constant("SODIUM_LIBRARY_VERSION", None) {
- let sodium = self.runtime.get_constant("SODIUM_LIBRARY_VERSION", None);
+ if platform_info.has_constant("SODIUM_LIBRARY_VERSION", None) {
+ let sodium = platform_info.get_constant("SODIUM_LIBRARY_VERSION", None);
let sodium_str = match &sodium {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -1324,12 +1290,12 @@ impl PlatformRepository {
}
"sqlite3" | "pdo_sqlite" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^SQLite Library => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -1346,12 +1312,12 @@ impl PlatformRepository {
}
"ssh2" => {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^libssh2 version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -1368,7 +1334,8 @@ impl PlatformRepository {
}
"xsl" => {
- let libxslt_version = self.runtime.get_constant("LIBXSLT_DOTTED_VERSION", None);
+ let libxslt_version =
+ platform_info.get_constant("LIBXSLT_DOTTED_VERSION", None);
let libxslt_str = match &libxslt_version {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -1382,13 +1349,13 @@ impl PlatformRepository {
&[],
)?;
- let info = self.runtime.get_extension_info("xsl")?;
+ let info = platform_info.get_extension_info("xsl");
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!(
"/^libxslt compiled against libxml Version => (?<version>.+)$/im"
),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -1405,12 +1372,12 @@ impl PlatformRepository {
}
"yaml" => {
- let info = self.runtime.get_extension_info("yaml")?;
+ let info = platform_info.get_extension_info("yaml");
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^LibYAML Version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -1427,13 +1394,9 @@ impl PlatformRepository {
}
"zip" => {
- if self
- .runtime
- .has_constant("LIBZIP_VERSION", Some("ZipArchive".to_string()))
- {
- let libzip = self
- .runtime
- .get_constant("LIBZIP_VERSION", Some("ZipArchive".to_string()));
+ if platform_info.has_constant("LIBZIP_VERSION", Some("ZipArchive")) {
+ let libzip =
+ platform_info.get_constant("LIBZIP_VERSION", Some("ZipArchive"));
let libzip_str = match &libzip {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -1450,8 +1413,8 @@ impl PlatformRepository {
}
"zlib" => {
- if self.runtime.has_constant("ZLIB_VERSION", None) {
- let zlib = self.runtime.get_constant("ZLIB_VERSION", None);
+ if platform_info.has_constant("ZLIB_VERSION", None) {
+ let zlib = platform_info.get_constant("ZLIB_VERSION", None);
let zlib_str = match &zlib {
PhpMixed::String(s) => Some(s.clone()),
_ => None,
@@ -1467,11 +1430,11 @@ impl PlatformRepository {
// Linked Version => 1.2.8
} else {
- let info = self.runtime.get_extension_info(name)?;
+ let info = platform_info.get_extension_info(name);
let mut matches: IndexMap<CaptureKey, String> = IndexMap::new();
if Preg::is_match3(
php_regex!("/^Linked Version => (?<version>.+)$/im"),
- &info,
+ info,
Some(&mut matches),
) {
self.add_library(
@@ -1840,7 +1803,7 @@ impl PlatformRepository {
}
/// PHP `$resourceBundle->get($key)`. A live PHP object has no `PhpMixed` counterpart, so
- /// [`RuntimeInterface`] answers with the entries the caller reads instead of the object.
+ /// [`PlatformInfo`] carries the entries the caller reads instead of the object.
fn resource_bundle_get(value: &PhpMixed, key: &str) -> PhpMixed {
Self::php_object_field(value, key).unwrap_or(PhpMixed::Null)
}