Allow for exceptions to not be used.

This commit is contained in:
ThePhD 2016-03-02 08:44:07 -05:00
parent c350af8544
commit b24d17df31
4 changed files with 28 additions and 3 deletions

1
.gitignore vendored
View File

@ -53,3 +53,4 @@ lib/liblua5.2.a
# Windows Crap
desktop.ini
*.sublime-workspace

View File

@ -42,4 +42,11 @@
#define SOL_LUA_VERSION 502
#endif // Lua Version 502, 501 || luajit, 500
#ifdef _MSC_VER
#if _HAS_EXCEPTIONS == 0
// This means VC++ has no exceptions
// Maybe: automatically define SOL_NO_EXCEPTIONS ?
#endif // Automatic Exception Detection
#endif // VC++ Exception Mechanism
#endif // SOL_VERSION_HPP

View File

@ -163,15 +163,16 @@ private:
int firstreturn = std::max(1, stacksize - static_cast<int>(n) - 1);
int returncount = 0;
call_status code = call_status::ok;
#ifdef SOL_NO_EXCEPTIONS
try {
#endif // No Exceptions
code = static_cast<call_status>(luacall(n, LUA_MULTRET, h));
int poststacksize = lua_gettop(lua_state());
returncount = poststacksize - firstreturn;
#ifdef SOL_NO_EXCEPTIONS
}
// Handle C++ errors thrown from C++ functions bound inside of lua
catch (const char* error) {
h.stackindex = 0;
stack::push(lua_state(), error);
firstreturn = lua_gettop(lua_state());
return protected_function_result(lua_state(), firstreturn, 0, 1, call_status::runtime);
@ -185,6 +186,7 @@ private:
catch (...) {
throw;
}
#endif // No Exceptions
return protected_function_result(lua_state(), firstreturn + ( handlerpushed ? 0 : 1 ), returncount, returncount, code);
}

View File

@ -28,7 +28,7 @@
namespace sol {
namespace detail {
#ifdef SOL_NO_EXCEPTIONS
template <lua_CFunction f>
inline int static_trampoline (lua_State* L) {
try {
@ -66,6 +66,21 @@ inline int trampoline(lua_State* L, Fx&& f) {
inline int c_trampoline(lua_State* L, lua_CFunction f) {
return trampoline(L, f);
}
#else
template <lua_CFunction f>
inline int static_trampoline (lua_State* L) {
return f(L);
}
template <typename Fx>
inline int trampoline(lua_State* L, Fx&& f) {
return f(L);
}
inline int c_trampoline(lua_State* L, lua_CFunction f) {
return trampoline(L, f);
}
#endif // Exceptions vs. No Exceptions
}
struct nil_t {};
const nil_t nil {};