mirror of
https://github.com/status-im/evmc.git
synced 2025-02-22 07:58:19 +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.
|
||||
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;
|
||||
|
||||
// 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> libeee3.x
|
||||
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 touch empty.file
|
||||
)
|
||||
|
@ -6,6 +6,14 @@
|
||||
|
||||
#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)
|
||||
{
|
||||
evmc_loader_error_code ec;
|
||||
@ -121,6 +129,39 @@ TEST(loader, nextto)
|
||||
}
|
||||
#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)
|
||||
{
|
||||
auto path = "unittests/libeee1.so";
|
||||
@ -174,4 +215,32 @@ TEST(loader, eee4)
|
||||
x = evmc_load(path, 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
|
||||
|
||||
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