diff --git a/luabind/luabind/detail/call_function.hpp b/luabind/luabind/detail/call_function.hpp index e053c02df..e3ac2b761 100644 --- a/luabind/luabind/detail/call_function.hpp +++ b/luabind/luabind/detail/call_function.hpp @@ -347,8 +347,7 @@ namespace luabind , luabind::detail::proxy_function_void_caller > , luabind::detail::proxy_function_caller > >::type proxy_type; - lua_pushstring(L, name); - lua_gettable(L, LUA_GLOBALSINDEX); + lua_getglobal(L, name); return proxy_type(L, 1, &detail::pcall, args); } @@ -390,8 +389,7 @@ namespace luabind , luabind::detail::proxy_function_void_caller > , luabind::detail::proxy_function_caller > >::type proxy_type; - lua_pushstring(L, name); - lua_gettable(L, LUA_GLOBALSINDEX); + lua_getglobal(L, name); return proxy_type(L, 1, &detail::resume_impl, args); } diff --git a/luabind/luabind/detail/policy.hpp b/luabind/luabind/detail/policy.hpp index 689c73399..79577c9a4 100644 --- a/luabind/luabind/detail/policy.hpp +++ b/luabind/luabind/detail/policy.hpp @@ -65,6 +65,7 @@ #include #include #include +#include namespace luabind { diff --git a/luabind/luabind/lua502.hpp b/luabind/luabind/lua502.hpp new file mode 100644 index 000000000..5006128ec --- /dev/null +++ b/luabind/luabind/lua502.hpp @@ -0,0 +1,56 @@ +// Copyright (c) 2004 Daniel Wallin and Arvid Norberg + +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +// OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef LUA_502_HPP +#define LUA_502_HPP + +#if LUA_VERSION_NUM >= 502 + +inline LUA_API int lua_equal(lua_State *L, int idx1, int idx2) +{ + return lua_compare(L, idx1, idx2, LUA_OPEQ); +} + +inline LUA_API int lua_lessthan(lua_State *L, int idx1, int idx2) +{ + return lua_compare(L, idx1, idx2, LUA_OPLT); +} + +#undef lua_strlen +#define lua_strlen lua_rawlen + +#undef lua_getfenv +#define lua_getfenv lua_getuservalue + +#undef lua_setfenv +#define lua_setfenv lua_setuservalue + +#undef lua_open +#define lua_open luaL_newstate + +#else // LUA_VERSION_NUM >= 502 + +#define lua_pushglobaltable(L) lua_pushvalue(L, LUA_GLOBALSINDEX) + +#endif // LUA_VERSION_NUM >= 502 + +#endif \ No newline at end of file diff --git a/luabind/luabind/object.hpp b/luabind/luabind/object.hpp index f7b7ca50d..ea12bf272 100644 --- a/luabind/luabind/object.hpp +++ b/luabind/luabind/object.hpp @@ -1207,7 +1207,7 @@ inline object newtable(lua_State* interpreter) // this could be optimized by returning a proxy inline object globals(lua_State* interpreter) { - lua_pushvalue(interpreter, LUA_GLOBALSINDEX); + lua_pushglobaltable(interpreter); detail::stack_pop pop(interpreter, 1); return object(from_stack(interpreter, -1)); } diff --git a/luabind/src/class_rep.cpp b/luabind/src/class_rep.cpp index 70bb6231c..5f03f3931 100644 --- a/luabind/src/class_rep.cpp +++ b/luabind/src/class_rep.cpp @@ -146,11 +146,10 @@ int luabind::detail::class_rep::constructor_dispatcher(lua_State* L) && cls->get_class_type() == class_rep::lua_class && !cls->bases().empty()) { - lua_pushstring(L, "super"); lua_pushvalue(L, 1); - lua_pushvalue(L, -3); + lua_pushvalue(L, -2); lua_pushcclosure(L, super_callback, 2); - lua_settable(L, LUA_GLOBALSINDEX); + lua_setglobal(L, "super"); } lua_pushvalue(L, -1); @@ -169,9 +168,8 @@ int luabind::detail::class_rep::constructor_dispatcher(lua_State* L) if (super_deprecation_disabled) { - lua_pushstring(L, "super"); lua_pushnil(L); - lua_settable(L, LUA_GLOBALSINDEX); + lua_setglobal(L, "super"); } return 1; @@ -214,17 +212,15 @@ int luabind::detail::class_rep::super_callback(lua_State* L) if (base->bases().empty()) { - lua_pushstring(L, "super"); lua_pushnil(L); - lua_settable(L, LUA_GLOBALSINDEX); + lua_setglobal(L, "super"); } else { - lua_pushstring(L, "super"); lua_pushlightuserdata(L, base); lua_pushvalue(L, lua_upvalueindex(2)); lua_pushcclosure(L, super_callback, 2); - lua_settable(L, LUA_GLOBALSINDEX); + lua_setglobal(L, "super"); } base->get_table(L); @@ -241,9 +237,8 @@ int luabind::detail::class_rep::super_callback(lua_State* L) // TODO: instead of clearing the global variable "super" // store it temporarily in the registry. maybe we should // have some kind of warning if the super global is used? - lua_pushstring(L, "super"); lua_pushnil(L); - lua_settable(L, LUA_GLOBALSINDEX); + lua_setglobal(L, "super"); return 0; } diff --git a/luabind/src/create_class.cpp b/luabind/src/create_class.cpp index c0eb71938..47251ef23 100644 --- a/luabind/src/create_class.cpp +++ b/luabind/src/create_class.cpp @@ -126,9 +126,8 @@ namespace luabind { namespace detail new(c) class_rep(L, name); // make the class globally available - lua_pushstring(L, name); - lua_pushvalue(L, -2); - lua_settable(L, LUA_GLOBALSINDEX); + lua_pushvalue(L, -1); + lua_setglobal(L, name); // also add it to the closure as return value lua_pushcclosure(L, &stage2, 1); diff --git a/luabind/src/object_rep.cpp b/luabind/src/object_rep.cpp index 6977beede..afc6d9800 100644 --- a/luabind/src/object_rep.cpp +++ b/luabind/src/object_rep.cpp @@ -24,6 +24,7 @@ #include #include +#include namespace luabind { namespace detail { diff --git a/luabind/src/open.cpp b/luabind/src/open.cpp index f20dcfc83..ec8e4ff64 100644 --- a/luabind/src/open.cpp +++ b/luabind/src/open.cpp @@ -178,21 +178,18 @@ namespace lua_settable(L, LUA_REGISTRYINDEX); // add functions (class, cast etc...) - lua_pushstring(L, "class"); lua_pushcclosure(L, detail::create_class::stage1, 0); - lua_settable(L, LUA_GLOBALSINDEX); + lua_setglobal(L, "class"); - lua_pushstring(L, "property"); lua_pushcclosure(L, &make_property, 0); - lua_settable(L, LUA_GLOBALSINDEX); + lua_setglobal(L, "property"); lua_pushlightuserdata(L, &main_thread_tag); lua_pushlightuserdata(L, L); lua_rawset(L, LUA_REGISTRYINDEX); - lua_pushstring(L, "super"); lua_pushcclosure(L, &deprecated_super, 0); - lua_settable(L, LUA_GLOBALSINDEX); + lua_setglobal(L, "super"); } } // namespace luabind diff --git a/luabind/src/pcall.cpp b/luabind/src/pcall.cpp index 66dbeaa18..1bf642531 100644 --- a/luabind/src/pcall.cpp +++ b/luabind/src/pcall.cpp @@ -47,13 +47,18 @@ namespace luabind { namespace detail int resume_impl(lua_State *L, int nargs, int) { +#if LUA_VERSION_NUM >= 502 + int res = lua_resume(L, NULL, nargs); +#else + int res = lua_resume(L, nargs); +#endif + #if LUA_VERSION_NUM >= 501 // Lua 5.1 added LUA_YIELD as a possible return value, // this was causing crashes, because the caller expects 0 on success. - int res = lua_resume(L, nargs); return (res == LUA_YIELD) ? 0 : res; #else - return lua_resume(L, nargs); + return res; #endif } diff --git a/luabind/src/scope.cpp b/luabind/src/scope.cpp index 6495687b9..52bd132f9 100644 --- a/luabind/src/scope.cpp +++ b/luabind/src/scope.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include namespace luabind { namespace detail { @@ -136,22 +137,20 @@ namespace luabind { { if (m_name) { - lua_pushstring(m_state, m_name); - lua_gettable(m_state, LUA_GLOBALSINDEX); + lua_getglobal(m_state, m_name); if (!lua_istable(m_state, -1)) { lua_pop(m_state, 1); lua_newtable(m_state); - lua_pushstring(m_state, m_name); - lua_pushvalue(m_state, -2); - lua_settable(m_state, LUA_GLOBALSINDEX); + lua_pushvalue(m_state, -1); + lua_setglobal(m_state, m_name); } } else { - lua_pushvalue(m_state, LUA_GLOBALSINDEX); + lua_pushglobaltable(m_state); } lua_pop_stack guard(m_state);