Skip to content

Commit 3fbfefb

Browse files
committed
Replace matchVersion comparing full std::smatch structure
While this looked correct and we looked at this for the SDK 54 release in September, we again found warnings when the patch versions mismatch, and assume that when we reviewed this, we missed something. Coming back to this and looking closer, the old code compared `std::smatch` directly against each other from both searches. However, `std::smatch` is an iterator, and, presumably, the comparison is iterating all values and comparing them. The string at the zero-index, like in JS, is a full match string. If that match string contains the full `version` string, then the comparison can never succeed. This means that this was always comparing exact version matches rather than allowing patch versions to differ. Instead, the new version matches two explicit groups on major and minor versions for clarity, then compares index 1 and 2's (match 1 and 2's ) strings.
1 parent fd07ac6 commit 3fbfefb

2 files changed

Lines changed: 10 additions & 38 deletions

File tree

packages/react-native-reanimated/Common/cpp/reanimated/Tools/ReanimatedVersion.cpp

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,11 @@ void injectReanimatedCppVersion(jsi::Runtime &rnRuntime) {
2626

2727
#ifndef NDEBUG
2828
bool matchVersion(const std::string &version1, const std::string &version2) {
29-
std::regex pattern("^\\d+\\.\\d+\\.\\d+$");
30-
if (std::regex_match(version1, pattern) && std::regex_match(version2, pattern)) {
31-
auto majorPattern = std::regex("^\\d+");
32-
std::smatch major1;
33-
std::smatch major2;
34-
std::regex_search(version1, major1, majorPattern);
35-
std::regex_search(version2, major2, majorPattern);
36-
if (major1 != major2) {
37-
return false;
38-
}
39-
auto minorPattern = std::regex("\\.\\d+\\.");
40-
std::smatch minor1;
41-
std::smatch minor2;
42-
std::regex_search(version1, minor1, minorPattern);
43-
std::regex_search(version2, minor2, minorPattern);
44-
if (minor1 != minor2) {
45-
return false;
46-
}
47-
return true;
29+
std::regex pattern("^(\\d+)\\.(\\d+)\\.\\d+$");
30+
std::smatch mv1;
31+
std::smatch mv2;
32+
if (std::regex_match(version1, mv1, pattern) && std::regex_match(version2, mv2, pattern)) {
33+
return mv1[1].str() == mv2[1].str() && mv1[2].str() == mv2[2].str();
4834
} else {
4935
return version1 == version2;
5036
}

packages/react-native-worklets/Common/cpp/worklets/Tools/VersionUtils.cpp

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,11 @@ using namespace facebook;
1010
namespace worklets {
1111

1212
bool matchVersion(const std::string &version1, const std::string &version2) {
13-
std::regex pattern("^\\d+\\.\\d+\\.\\d+$");
14-
if (std::regex_match(version1, pattern) && std::regex_match(version2, pattern)) {
15-
auto majorPattern = std::regex("^\\d+");
16-
std::smatch major1;
17-
std::smatch major2;
18-
std::regex_search(version1, major1, majorPattern);
19-
std::regex_search(version2, major2, majorPattern);
20-
if (major1 != major2) {
21-
return false;
22-
}
23-
auto minorPattern = std::regex("\\.\\d+\\.");
24-
std::smatch minor1;
25-
std::smatch minor2;
26-
std::regex_search(version1, minor1, minorPattern);
27-
std::regex_search(version2, minor2, minorPattern);
28-
if (minor1 != minor2) {
29-
return false;
30-
}
31-
return true;
13+
std::regex pattern("^(\\d+)\\.(\\d+)\\.\\d+$");
14+
std::smatch mv1;
15+
std::smatch mv2;
16+
if (std::regex_match(version1, mv1, pattern) && std::regex_match(version2, mv2, pattern)) {
17+
return mv1[1].str() == mv2[1].str() && mv1[2].str() == mv2[2].str();
3218
} else {
3319
return version1 == version2;
3420
}

0 commit comments

Comments
 (0)