From: <sv...@op...> - 2025-03-14 14:49:47
|
Author: manx Date: Fri Mar 14 15:49:35 2025 New Revision: 23025 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23025 Log: [Ref] mpt/library/library.hpp: Add bind_data(), and rename bind() to bind_function(). Modified: trunk/OpenMPT/misc/mptLibrary.cpp trunk/OpenMPT/misc/mptOS.cpp trunk/OpenMPT/misc/mptWine.cpp trunk/OpenMPT/src/mpt/library/library.hpp Modified: trunk/OpenMPT/misc/mptLibrary.cpp ============================================================================== --- trunk/OpenMPT/misc/mptLibrary.cpp Fri Mar 14 15:21:58 2025 (r23024) +++ trunk/OpenMPT/misc/mptLibrary.cpp Fri Mar 14 15:49:35 2025 (r23025) @@ -120,7 +120,7 @@ return nullptr; } FuncPtr result = nullptr; - lib->bind(result, symbol); + lib->bind_function(result, symbol); return result; } Modified: trunk/OpenMPT/misc/mptOS.cpp ============================================================================== --- trunk/OpenMPT/misc/mptOS.cpp Fri Mar 14 15:21:58 2025 (r23024) +++ trunk/OpenMPT/misc/mptOS.cpp Fri Mar 14 15:49:35 2025 (r23025) @@ -381,7 +381,7 @@ if(kernel32.has_value()) { BOOL (WINAPI * fIsWow64Process2)(HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine) = NULL; - if(kernel32->bind(fIsWow64Process2, "IsWow64Process2")) + if(kernel32->bind_function(fIsWow64Process2, "IsWow64Process2")) { USHORT ProcessMachine = 0; USHORT NativeMachine = 0; @@ -617,9 +617,9 @@ const char * (__cdecl * wine_get_version)(void) = nullptr; const char * (__cdecl * wine_get_build_id)(void) = nullptr; void (__cdecl * wine_get_host_version)(const char * *, const char * *) = nullptr; - NTDLL->bind(wine_get_version, "wine_get_version"); - NTDLL->bind(wine_get_build_id, "wine_get_build_id"); - NTDLL->bind(wine_get_host_version, "wine_get_host_version"); + NTDLL->bind_function(wine_get_version, "wine_get_version"); + NTDLL->bind_function(wine_get_build_id, "wine_get_build_id"); + NTDLL->bind_function(wine_get_host_version, "wine_get_host_version"); const char * wine_version = nullptr; const char * wine_build_id = nullptr; const char * wine_host_sysname = nullptr; Modified: trunk/OpenMPT/misc/mptWine.cpp ============================================================================== --- trunk/OpenMPT/misc/mptWine.cpp Fri Mar 14 15:21:58 2025 (r23024) +++ trunk/OpenMPT/misc/mptWine.cpp Fri Mar 14 15:49:35 2025 (r23025) @@ -61,11 +61,11 @@ { throw mpt::Wine::Exception("Could not load Wine kernel32.dll."); } - if(!(*m_Kernel32)->bind(wine_get_unix_file_name, "wine_get_unix_file_name")) + if(!(*m_Kernel32)->bind_function(wine_get_unix_file_name, "wine_get_unix_file_name")) { throw mpt::Wine::Exception("Could not bind Wine kernel32.dll:wine_get_unix_file_name."); } - if(!(*m_Kernel32)->bind(wine_get_dos_file_name, "wine_get_dos_file_name")) + if(!(*m_Kernel32)->bind_function(wine_get_dos_file_name, "wine_get_dos_file_name")) { throw mpt::Wine::Exception("Could not bind Wine kernel32.dll:wine_get_dos_file_name."); } Modified: trunk/OpenMPT/src/mpt/library/library.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/library/library.hpp Fri Mar 14 15:21:58 2025 (r23024) +++ trunk/OpenMPT/src/mpt/library/library.hpp Fri Mar 14 15:49:35 2025 (r23025) @@ -481,7 +481,7 @@ #endif template <typename Tfunc> - bool bind(Tfunc *& f, const std::string & symbol) const { + bool bind_function(Tfunc * & f, const std::string & symbol) const { #if !defined(MPT_LIBCXX_QUIRK_INCOMPLETE_IS_FUNCTION) // MinGW64 std::is_function is always false for non __cdecl functions. // Issue is similar to <https://connect.microsoft.com/VisualStudio/feedback/details/774720/stl-is-function-bug>. @@ -495,6 +495,22 @@ } return (sym_ptr != nullptr); } + + template <typename Tdata> + bool bind_data(Tdata * & d, const std::string & symbol) const { +#if !defined(MPT_LIBCXX_QUIRK_INCOMPLETE_IS_FUNCTION) + // MinGW64 std::is_function is always false for non __cdecl functions. + // Issue is similar to <https://connect.microsoft.com/VisualStudio/feedback/details/774720/stl-is-function-bug>. + static_assert(!std::is_function<Tdata>::value); +#endif + auto sym_ptr = get_address(symbol); + if constexpr (std::is_same<decltype(sym_ptr), void *>::value) { + d = static_cast<Tdata *>(sym_ptr); + } else { + d = reinterpret_cast<Tdata *>(sym_ptr); + } + return (sym_ptr != nullptr); + } }; |