xr_string to_string (luabind::object const& o) { using namespace luabind; if (o.type() == LUA_TSTRING) return object_cast<xr_string>(o); lua_State* L = o.lua_state(); LUABIND_CHECK_STACK(L); #ifdef BOOST_NO_STRINGSTREAM std::strstream s; #else std::stringstream s; #endif if (o.type() == LUA_TNUMBER) { s << object_cast<float>(o); return xr_string(s.str().c_str()); } s << "<" << lua_typename(L, o.type()) << ">"; #ifdef BOOST_NO_STRINGSTREAM s << std::ends; #endif return s.str().c_str(); }
xr_string member_to_string (luabind::object const& e, LPCSTR function_signature) { #if !defined(LUABIND_NO_ERROR_CHECKING3) using namespace luabind; lua_State* L = e.lua_state(); LUABIND_CHECK_STACK(L); if (e.type() == LUA_TFUNCTION) { e.pushvalue(); detail::stack_pop p(L, 1); { if (lua_getupvalue(L, -1, 3) == 0) return to_string(e); detail::stack_pop p2(L, 1); if (lua_touserdata(L, -1) != reinterpret_cast<void*>(0x1337)) return to_string(e); } #ifdef BOOST_NO_STRINGSTREAM std::strstream s; #else std::stringstream s; #endif { lua_getupvalue(L, -1, 2); detail::stack_pop p2(L, 1); } { lua_getupvalue(L, -1, 1); detail::stack_pop p2(L, 1); detail::method_rep* m = static_cast<detail::method_rep*>(lua_touserdata(L, -1)); for (std::vector<detail::overload_rep>::const_iterator i = m->overloads().begin(); i != m->overloads().end(); ++i) { xr_string str; i->get_signature(L, str); if (i != m->overloads().begin()) s << "\n"; s << function_signature << process_signature(str) << ";"; } } #ifdef BOOST_NO_STRINGSTREAM s << std::ends; #endif return s.str().c_str(); } return to_string(e); #else return ""; #endif }