You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mxe/src/luabind-3-globalsindex.patch

205 lines
6.5 KiB

This file is part of MXE. See LICENSE.md for licensing information.
commit 7325c469a8eb443cd2d46c9860f278cd2672dace
Author: Boris Nagaev <bnagaev@gmail.com>
Date: Fri Aug 22 15:27:11 2014 +0400
LUA_GLOBALSINDEX
diff --git a/luabind/detail/call_function.hpp b/luabind/detail/call_function.hpp
index 8f5afff..cb56dc0 100644
--- a/luabind/detail/call_function.hpp
+++ b/luabind/detail/call_function.hpp
@@ -347,8 +347,7 @@ namespace luabind
, luabind::detail::proxy_function_void_caller<boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> >
, luabind::detail::proxy_function_caller<Ret, boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> > >::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<boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> >
, luabind::detail::proxy_function_caller<Ret, boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> > >::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/detail/object_funs.hpp b/luabind/detail/object_funs.hpp
index 2600238..f826d7a 100644
--- a/luabind/detail/object_funs.hpp
+++ b/luabind/detail/object_funs.hpp
@@ -184,7 +184,11 @@ namespace luabind
inline object get_globals(lua_State* L)
{
+#ifdef LUA_GLOBALSINDEX
lua_pushvalue(L, LUA_GLOBALSINDEX);
+#else
+ lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS);
+#endif
detail::lua_reference ref;
ref.set(L);
return object(L, ref, true/*object::reference()*/);
diff --git a/luabind/object.hpp b/luabind/object.hpp
index f7b7ca5..b288171 100644
--- a/luabind/object.hpp
+++ b/luabind/object.hpp
@@ -1207,7 +1207,12 @@ inline object newtable(lua_State* interpreter)
// this could be optimized by returning a proxy
inline object globals(lua_State* interpreter)
{
+#ifdef LUA_GLOBALSINDEX
lua_pushvalue(interpreter, LUA_GLOBALSINDEX);
+#else
+ lua_rawgeti(interpreter, LUA_REGISTRYINDEX,
+ LUA_RIDX_GLOBALS);
+#endif
detail::stack_pop pop(interpreter, 1);
return object(from_stack(interpreter, -1));
}
diff --git a/src/class_rep.cpp b/src/class_rep.cpp
index 70bb623..912df95 100755
--- a/src/class_rep.cpp
+++ b/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_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/src/create_class.cpp b/src/create_class.cpp
index c0eb719..47251ef 100755
--- a/src/create_class.cpp
+++ b/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/src/open.cpp b/src/open.cpp
index f20dcfc..ec8e4ff 100755
--- a/src/open.cpp
+++ b/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/src/scope.cpp b/src/scope.cpp
index 6495687..d4d1f24 100755
--- a/src/scope.cpp
+++ b/src/scope.cpp
@@ -136,22 +136,25 @@ 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
{
+#ifdef LUA_GLOBALSINDEX
lua_pushvalue(m_state, LUA_GLOBALSINDEX);
+#else
+ lua_rawgeti(m_state, LUA_REGISTRYINDEX,
+ LUA_RIDX_GLOBALS);
+#endif
}
lua_pop_stack guard(m_state);