mirror of
https://github.com/status-im/evmc.git
synced 2025-02-23 00:18:24 +00:00
loader: Fix support for Windows paths
This commit is contained in:
parent
18a96c8d04
commit
6b0ab05d07
@ -71,6 +71,11 @@ evmc_create_fn evmc_load(const char* filename, enum evmc_loader_error_code* erro
|
|||||||
|
|
||||||
// Find filename in the path.
|
// Find filename in the path.
|
||||||
const char* sep_pos = strrchr(filename, '/');
|
const char* sep_pos = strrchr(filename, '/');
|
||||||
|
#if _WIN32
|
||||||
|
// On Windows check also Windows classic path separator.
|
||||||
|
const char* sep_pos_windows = strrchr(filename, '\\');
|
||||||
|
sep_pos = sep_pos_windows > sep_pos ? sep_pos_windows : sep_pos;
|
||||||
|
#endif
|
||||||
const char* name_pos = sep_pos ? sep_pos + 1 : filename;
|
const char* name_pos = sep_pos ? sep_pos + 1 : filename;
|
||||||
|
|
||||||
// Skip "lib" prefix if present.
|
// Skip "lib" prefix if present.
|
||||||
|
@ -21,6 +21,8 @@ add_custom_command(
|
|||||||
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> eee2.so
|
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> eee2.so
|
||||||
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> libeee3.x
|
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> libeee3.x
|
||||||
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> eee4
|
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> eee4
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> _
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> lib_.so
|
||||||
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> ../aaa.evm
|
COMMAND ${CMAKE_COMMAND} -E ${cmd} $<TARGET_FILE:vm-mock> ../aaa.evm
|
||||||
COMMAND ${CMAKE_COMMAND} -E touch empty.file
|
COMMAND ${CMAKE_COMMAND} -E touch empty.file
|
||||||
)
|
)
|
||||||
|
@ -6,6 +6,14 @@
|
|||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
#if _WIN32
|
||||||
|
static constexpr bool is_windows = true;
|
||||||
|
#else
|
||||||
|
static constexpr bool is_windows = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST(loader, nonexistent)
|
TEST(loader, nonexistent)
|
||||||
{
|
{
|
||||||
evmc_loader_error_code ec;
|
evmc_loader_error_code ec;
|
||||||
@ -121,6 +129,39 @@ TEST(loader, nextto)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
TEST(loader, windows_path)
|
||||||
|
{
|
||||||
|
auto paths = {
|
||||||
|
"./aaa.evm",
|
||||||
|
".\\aaa.evm",
|
||||||
|
"./unittests/eee-bbb.dll",
|
||||||
|
"./unittests\\eee-bbb.dll",
|
||||||
|
".\\unittests\\eee-bbb.dll",
|
||||||
|
".\\unittests/eee-bbb.dll",
|
||||||
|
"unittests\\eee-bbb.dll",
|
||||||
|
};
|
||||||
|
|
||||||
|
for (auto& path : paths)
|
||||||
|
{
|
||||||
|
bool is_windows_path = std::strchr(path, '\\') != nullptr;
|
||||||
|
|
||||||
|
if (is_windows_path && !is_windows)
|
||||||
|
{
|
||||||
|
evmc_loader_error_code ec;
|
||||||
|
auto fn = evmc_load(path, &ec);
|
||||||
|
EXPECT_EQ(fn, nullptr);
|
||||||
|
EXPECT_EQ(ec, EVMC_LOADER_CANNOT_OPEN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
evmc_loader_error_code ec;
|
||||||
|
auto fn = evmc_load(path, &ec);
|
||||||
|
EXPECT_NE(fn, nullptr);
|
||||||
|
EXPECT_EQ(ec, EVMC_LOADER_SUCCESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST(loader, eee1)
|
TEST(loader, eee1)
|
||||||
{
|
{
|
||||||
auto path = "unittests/libeee1.so";
|
auto path = "unittests/libeee1.so";
|
||||||
@ -174,4 +215,32 @@ TEST(loader, eee4)
|
|||||||
x = evmc_load(path, nullptr);
|
x = evmc_load(path, nullptr);
|
||||||
EXPECT_EQ(x, nullptr);
|
EXPECT_EQ(x, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(loader, _)
|
||||||
|
{
|
||||||
|
// Windows is not loading DLLs without extensions.
|
||||||
|
auto path = "unittests/_";
|
||||||
|
|
||||||
|
evmc_loader_error_code ec;
|
||||||
|
auto x = evmc_load(path, &ec);
|
||||||
|
EXPECT_EQ(ec, EVMC_LOADER_SYMBOL_NOT_FOUND);
|
||||||
|
EXPECT_EQ(x, nullptr);
|
||||||
|
|
||||||
|
x = evmc_load(path, nullptr);
|
||||||
|
EXPECT_EQ(x, nullptr);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
TEST(loader, lib_)
|
||||||
|
{
|
||||||
|
// Windows is not loading DLLs without extensions.
|
||||||
|
auto path = "unittests/lib_.so";
|
||||||
|
|
||||||
|
evmc_loader_error_code ec;
|
||||||
|
auto x = evmc_load(path, &ec);
|
||||||
|
EXPECT_EQ(ec, EVMC_LOADER_SYMBOL_NOT_FOUND);
|
||||||
|
EXPECT_EQ(x, nullptr);
|
||||||
|
|
||||||
|
x = evmc_load(path, nullptr);
|
||||||
|
EXPECT_EQ(x, nullptr);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user