diff --git a/include/sol/demangle.hpp b/include/sol/demangle.hpp index 2161585a..dc861fbf 100644 --- a/include/sol/demangle.hpp +++ b/include/sol/demangle.hpp @@ -1,4 +1,4 @@ -// sol3 +// sol3 // The MIT License (MIT) @@ -49,11 +49,9 @@ namespace detail { #if defined(__GNUC__) || defined(__clang__) - template - inline std::string ctti_get_type_name() { + inline std::string ctti_get_type_name_from_sig(std::string name) { // cardinal sins from MINGW using namespace std; - std::string name = __PRETTY_FUNCTION__; std::size_t start = name.find_first_of('['); start = name.find_first_of('=', start); std::size_t end = name.find_last_of(']'); @@ -83,10 +81,13 @@ namespace detail { return name; } + + template + inline std::string ctti_get_type_name() { + return ctti_get_type_name_from_sig(__PRETTY_FUNCTION__); + } #elif defined(_MSC_VER) - template - std::string ctti_get_type_name() { - std::string name = __FUNCSIG__; + inline std::string ctti_get_type_name_from_sig(std::string name) { std::size_t start = name.find("get_type_name"); if (start == std::string::npos) start = 0; @@ -117,6 +118,11 @@ namespace detail { return name; } + + template + std::string ctti_get_type_name() { + return ctti_get_type_name_from_sig(__FUNCSIG__); + } #else #error Compiler not supported for demangling #endif // compilers @@ -127,9 +133,7 @@ namespace detail { return realname; } - template - std::string short_demangle_once() { - std::string realname = ctti_get_type_name(); + inline std::string short_demangle_from_type_name(std::string realname) { // This isn't the most complete but it'll do for now...? static const std::array ops = {{"operator<", "operator<<", "operator<<=", "operator<=", "operator>", "operator>>", "operator>>=", "operator>=", "operator->", "operator->*"}}; int level = 0; @@ -165,6 +169,12 @@ namespace detail { return realname; } + template + std::string short_demangle_once() { + std::string realname = ctti_get_type_name(); + return short_demangle_from_type_name(realname); + } + template const std::string& demangle() { static const std::string d = demangle_once(); diff --git a/include/sol/stack_check_unqualified.hpp b/include/sol/stack_check_unqualified.hpp index 435fef59..de8768d0 100644 --- a/include/sol/stack_check_unqualified.hpp +++ b/include/sol/stack_check_unqualified.hpp @@ -38,9 +38,7 @@ namespace sol { namespace stack { namespace stack_detail { - template - inline bool check_metatable(lua_State* L, int index = -2) { - const auto& metakey = usertype_traits::metatable(); + inline bool impl_check_metatable(lua_State* L, int index, const std::string& metakey, bool poptable) { luaL_getmetatable(L, &metakey[0]); const type expectedmetatabletype = static_cast(lua_type(L, -1)); if (expectedmetatabletype != type::lua_nil) { @@ -53,6 +51,11 @@ namespace sol { namespace stack { return false; } + template + inline bool check_metatable(lua_State* L, int index = -2) { + return impl_check_metatable(L, index, usertype_traits::metatable(), poptable); + } + template struct basic_check { template diff --git a/include/sol/trampoline.hpp b/include/sol/trampoline.hpp index d0cdad1d..6c685529 100644 --- a/include/sol/trampoline.hpp +++ b/include/sol/trampoline.hpp @@ -99,8 +99,8 @@ namespace sol { return trampoline(L, f); } #else - template - int static_trampoline(lua_State* L) { + + inline int impl_static_trampoline(lua_State* L, lua_CFunction f) { #if defined(SOL_EXCEPTIONS_SAFE_PROPAGATION) && !defined(SOL_LUAJIT) return f(L); @@ -119,7 +119,7 @@ namespace sol { } #if !defined(SOL_EXCEPTIONS_SAFE_PROPAGATION) // LuaJIT cannot have the catchall when the safe propagation is on - // but LuaJIT will swallow all C++ errors + // but LuaJIT will swallow all C++ errors // if we don't at least catch std::exception ones catch (...) { call_exception_handler(L, optional(nullopt), "caught (...) exception"); @@ -129,6 +129,11 @@ namespace sol { #endif // Safe exceptions } + template + int static_trampoline(lua_State* L) { + return impl_static_trampoline(L, f); + } + #ifdef SOL_NOEXCEPT_FUNCTION_TYPE #if 0 // impossible: g++/clang++ choke as they think this function is ambiguous: diff --git a/single/single.py b/single/single.py index 6fea5018..5f96df1e 100644 --- a/single/single.py +++ b/single/single.py @@ -39,7 +39,7 @@ forward_single_file = '' single_file = os.path.normpath(args.output[0]) if len(args.output) > 1: - forward_single_file = args.output[1] + forward_single_file = os.path.normpath(args.output[1]) else: a, b = os.path.splitext(single_file) a = os.path.dirname(single_file) @@ -49,7 +49,7 @@ else: single_file_dir = os.path.dirname(single_file) forward_single_file_dir = os.path.dirname(forward_single_file) -script_path = args.input +script_path = os.path.normpath(args.input) working_dir = os.getcwd() os.chdir(script_path)