int operator()(lua_State* L, int pointer_offset, D T::*member) { int nargs = lua_gettop(L); // parameters on the lua stack: // 1. object_rep // 2. key (property name) // 3. value object_rep* obj = static_cast<object_rep*>(lua_touserdata(L, 1)); class_rep* crep = obj->crep(); void* raw_ptr; if (crep->has_holder()) raw_ptr = crep->extractor()(obj->ptr()); else raw_ptr = obj->ptr(); T* ptr = reinterpret_cast<T*>(static_cast<char*>(raw_ptr) + pointer_offset); typedef typename find_conversion_policy<1,Policies>::type converter_policy; typename mpl::apply_wrap2<converter_policy,D,lua_to_cpp>::type converter; ptr->*member = converter.apply(L, LUABIND_DECORATE_TYPE(D), 3); int nret = lua_gettop(L) - nargs; const int indices[] = { 1, nargs + nret, 3 }; policy_list_postcall<Policies>::apply(L, indices); return nret; }
Ret operator[](const Policies& p) { typedef typename find_conversion_policy<0, Policies>::type converter_policy; typename mpl::apply_wrap2<converter_policy,Ret,lua_to_cpp>::type converter; m_called = true; // don't count the function and self-reference // since those will be popped by pcall int top = lua_gettop(L) - 2; // pcall will pop the function and self reference // and all the parameters detail::push_args_from_tuple<1>::apply(L, m_args, p); # ifdef LUABIND_CPP0x if (pcall(L, std::tuple_size<Tuple>::value + 1, 1)) # else if (pcall(L, boost::tuples::length<Tuple>::value + 1, 1)) # endif { assert(lua_gettop(L) == top + 1); #ifndef LUABIND_NO_EXCEPTIONS throw error(L); #else error_callback_fun e = get_error_callback(); if (e) e(L); assert(0 && "the lua function threw an error and exceptions are disabled." "If you want to handle this error use luabind::set_error_callback()"); std::terminate(); #endif } // pops the return values from the function stack_pop pop(L, lua_gettop(L) - top); if (converter.match(L, LUABIND_DECORATE_TYPE(Ret), -1) < 0) { assert(lua_gettop(L) == top + 1); #ifndef LUABIND_NO_EXCEPTIONS throw cast_failed(L, typeid(Ret)); #else cast_failed_callback_fun e = get_cast_failed_callback(); if (e) e(L, typeid(Ret)); assert(0 && "the lua function's return value could not be converted." "If you want to handle this error use luabind::set_error_callback()"); std::terminate(); #endif } return converter.apply(L, LUABIND_DECORATE_TYPE(Ret), -1); }
Ret operator[](const Policies& p) { typedef typename detail::find_conversion_policy<0, Policies>::type converter_policy; typename mpl::apply_wrap2<converter_policy,Ret,lua_to_cpp>::type converter; m_called = true; lua_State* L = m_state; int top = lua_gettop(L); detail::push_args_from_tuple<1>::apply(L, m_args, p); if (m_fun(L, boost::tuples::length<Tuple>::value, 1)) { assert(lua_gettop(L) == top - m_params + 1); #ifndef LUABIND_NO_EXCEPTIONS throw error(L); #else error_callback_fun e = get_error_callback(); if (e) e(L); assert(0 && "the lua function threw an error and exceptions are disabled." " If you want to handle the error you can use luabind::set_error_callback()"); std::terminate(); #endif } // pops the return values from the function call stack_pop pop(L, lua_gettop(L) - top + m_params); if (converter.match(L, LUABIND_DECORATE_TYPE(Ret), -1) < 0) { #ifndef LUABIND_NO_EXCEPTIONS throw cast_failed(L, typeid(Ret)); #else cast_failed_callback_fun e = get_cast_failed_callback(); if (e) e(L, typeid(Ret)); assert(0 && "the lua function's return value could not be converted." " If you want to handle the error you can use luabind::set_error_callback()"); std::terminate(); #endif } return converter.apply(L, LUABIND_DECORATE_TYPE(Ret), -1); }
inline T object_cast_impl(const Obj& obj, const Policies&) { if (obj.lua_state() == 0) { #ifndef LUABIND_NO_EXCEPTIONS throw cast_failed(0, typeid(T)); #else lua_State* L = obj.lua_state(); cast_failed_callback_fun e = get_cast_failed_callback(); if (e) e(L, typeid(T)); assert(0 && "object_cast failed. If you want to handle this error use luabind::set_error_callback()"); std::terminate(); #endif } LUABIND_CHECK_STACK(obj.lua_state()); typedef typename detail::find_conversion_policy<0, Policies>::type converter_policy; typename mpl::apply_wrap2<converter_policy,T,lua_to_cpp>::type converter; obj.pushvalue(); lua_State* L = obj.lua_state(); detail::stack_pop p(L, 1); #ifndef LUABIND_NO_ERROR_CHECKING if (converter.match(L, LUABIND_DECORATE_TYPE(T), -1) < 0) { #ifndef LUABIND_NO_EXCEPTIONS throw cast_failed(L, typeid(T)); #else cast_failed_callback_fun e = get_cast_failed_callback(); if (e) e(L, typeid(T)); assert(0 && "object_cast failed. If you want to handle this error use luabind::set_error_callback()"); std::terminate(); #endif } #endif return converter.apply(L, LUABIND_DECORATE_TYPE(T), -1); }
void push_aux(lua_State* interpreter, T& value, ConverterGenerator*) { typedef typename boost::mpl::if_< boost::is_reference_wrapper<T> , BOOST_DEDUCED_TYPENAME boost::unwrap_reference<T>::type& , T >::type unwrapped_type; typename mpl::apply_wrap2< ConverterGenerator,unwrapped_type,cpp_to_lua >::type cv; cv.apply( interpreter , boost::implicit_cast< BOOST_DEDUCED_TYPENAME boost::unwrap_reference<T>::type& >(value) ); }
boost::optional<T> object_cast_nothrow_impl(const Obj& obj, const Policies&) { typedef typename detail::find_conversion_policy<0, Policies>::type converter_policy; typename mpl::apply_wrap2<converter_policy,T,lua_to_cpp>::type converter; if (obj.lua_state() == 0) return boost::optional<T>(); LUABIND_CHECK_STACK(obj.lua_state()); obj.pushvalue(); lua_State* L = obj.lua_state(); detail::stack_pop p(L, 1); #ifndef LUABIND_NO_ERROR_CHECKING if (converter.match(L, LUABIND_DECORATE_TYPE(T), -1) < 0) return boost::optional<T>(); #endif return boost::optional<T>(converter.apply(L, LUABIND_DECORATE_TYPE(T), -1)); }
int # ifdef LUABIND_INVOKE_MEMBER invoke_member # else invoke_normal # endif ( lua_State* L, F const& f, Signature, Policies const&, mpl::long_<N> # ifdef LUABIND_INVOKE_VOID , mpl::true_ # else , mpl::false_ # endif ) { typedef typename mpl::begin<Signature>::type first; # ifndef LUABIND_INVOKE_VOID typedef typename mpl::deref<first>::type result_type; typedef typename find_conversion_policy<0, Policies>::type result_policy; typename mpl::apply_wrap2< result_policy, result_type, cpp_to_lua>::type result_converter; # endif # if N > 0 # define BOOST_PP_LOCAL_MACRO(n) LUABIND_INVOKE_DECLARE_CONVERTER(n) # define BOOST_PP_LOCAL_LIMITS (0,N-1) # include BOOST_PP_LOCAL_ITERATE() # endif int const arguments = lua_gettop(L); # ifndef LUABIND_INVOKE_VOID result_converter.apply( L, # endif # ifdef LUABIND_INVOKE_MEMBER (c0.apply(L, LUABIND_DECORATE_TYPE(a0), index0).*f)( BOOST_PP_ENUM(BOOST_PP_DEC(N), LUABIND_INVOKE_ARG, BOOST_PP_INC) ) # else # define LUABIND_INVOKE_IDENTITY(x) x f( BOOST_PP_ENUM(N, LUABIND_INVOKE_ARG, LUABIND_INVOKE_IDENTITY) ) # undef LUABIND_INVOKE_IDENTITY # endif # ifndef LUABIND_INVOKE_VOID ) # endif ; # if N > 0 # define BOOST_PP_LOCAL_MACRO(n) LUABIND_INVOKE_CONVERTER_POSTCALL(n) # define BOOST_PP_LOCAL_LIMITS (0,N-1) # include BOOST_PP_LOCAL_ITERATE() # endif int const results = lua_gettop(L) - arguments; int const indices[] = { arguments + results BOOST_PP_ENUM_TRAILING_PARAMS(N, index) }; policy_list_postcall<Policies>::apply(L, indices); return maybe_yield(L, results, (Policies*)0); }