From 2c71196a6cc878866e0deda9653d0e59ac39b960 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 18 Mar 2016 19:59:37 +0100 Subject: allow to bind functions with reference args in global lua namespace --- libs/lua/LuaBridge/detail/CFunctions.h | 42 ++++++++++++++++++++++++++++++++++ libs/lua/LuaBridge/detail/Namespace.h | 11 +++++++++ 2 files changed, 53 insertions(+) (limited to 'libs/lua') diff --git a/libs/lua/LuaBridge/detail/CFunctions.h b/libs/lua/LuaBridge/detail/CFunctions.h index fa78b78fd6..29b361b690 100644 --- a/libs/lua/LuaBridge/detail/CFunctions.h +++ b/libs/lua/LuaBridge/detail/CFunctions.h @@ -246,6 +246,48 @@ struct CFunc } }; + //---------------------------------------------------------------------------- + /** + lua_CFunction to call a function with references as arguments. + */ + template ::ReturnType> + struct CallRef + { + typedef typename FuncTraits ::Params Params; + static int f (lua_State* L) + { + assert (isfulluserdata (L, lua_upvalueindex (1))); + FnPtr const& fnptr = *static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (fnptr != 0); + ArgList args (L); + Stack ::ReturnType>::push (L, FuncTraits ::call (fnptr, args)); + LuaRef v (newTable (L)); + FuncArgs ::refs (v, args); + v.push(L); + return 2; + } + }; + + template + struct CallRef + { + typedef typename FuncTraits ::Params Params; + static int f (lua_State* L) + { + assert (isfulluserdata (L, lua_upvalueindex (1))); + FnPtr const& fnptr = *static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (fnptr != 0); + ArgList args (L); + FuncTraits ::call (fnptr, args); + LuaRef v (newTable (L)); + FuncArgs ::refs (v, args); + v.push(L); + return 1; + } + }; + + //---------------------------------------------------------------------------- /** lua_CFunction to call a class member function with a return value. diff --git a/libs/lua/LuaBridge/detail/Namespace.h b/libs/lua/LuaBridge/detail/Namespace.h index af41b0a5a6..3450156738 100644 --- a/libs/lua/LuaBridge/detail/Namespace.h +++ b/libs/lua/LuaBridge/detail/Namespace.h @@ -1382,6 +1382,17 @@ public: return *this; } + template + Namespace& addRefFunction (char const* name, FP const fp) + { + assert (lua_istable (L, -1)); + + new (lua_newuserdata (L, sizeof (fp))) FP (fp); + lua_pushcclosure (L, &CFunc::CallRef ::f, 1); + rawsetfield (L, -2, name); + + return *this; + } //---------------------------------------------------------------------------- /** -- cgit v1.2.3