Allow unloading plugins that use std::regex
parent
ee999ccbdf
commit
8a3a05de24
@ -0,0 +1,32 @@
|
|||||||
|
#include <regex>
|
||||||
|
|
||||||
|
namespace DFHack {
|
||||||
|
namespace neverCalled {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gcc/linstdc++ seems to generate code that links libstdc++ back to first
|
||||||
|
* shared object using std::regex. To allow plugins unload with std::regex in
|
||||||
|
* the code we need the std::regex functions inside libdfhack.so.
|
||||||
|
*
|
||||||
|
* If your plugin decides to use any overloads that aren't listed here it may
|
||||||
|
* stay in memory after dlclose.
|
||||||
|
*/
|
||||||
|
std::regex stdRegexPluginUnloadWorkaround()
|
||||||
|
{
|
||||||
|
std::regex fake("foo");
|
||||||
|
std::string haystack("bar is foo in the world");
|
||||||
|
std::regex fake2(std::string("bar"));
|
||||||
|
if (std::regex_match(haystack, fake))
|
||||||
|
std::swap(fake, fake2);
|
||||||
|
if (std::regex_search(haystack, fake))
|
||||||
|
std::swap(fake, fake2);
|
||||||
|
const char* haystack2 = "foo";
|
||||||
|
if (std::regex_match(haystack2, fake))
|
||||||
|
std::swap(fake, fake2);
|
||||||
|
if (std::regex_search(haystack2, fake))
|
||||||
|
std::swap(fake, fake2);
|
||||||
|
return fake;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue