|
|
@@ -16,32 +16,83 @@ If you have any questions, please contact us: 1585346868@qq.com Or visit our web
|
|
|
*/
|
|
|
#include "request_temp_ptr.h"
|
|
|
|
|
|
-module::request_temp_ptr::request_temp_ptr()
|
|
|
+namespace {
|
|
|
+const char kModuleBaseRegKey[] = "fastweb_fw_module_base_usertype";
|
|
|
+}
|
|
|
+
|
|
|
+void module::request_temp_ptr::push_from_lua(request_temp_ptr& self, sol::object arg, sol::this_state s)
|
|
|
{
|
|
|
+ lua_State* L = s.lua_state();
|
|
|
+ arg.push();
|
|
|
+ const int idx = lua_absindex(L, -1);
|
|
|
+
|
|
|
+ const sol::type ty = sol::type_of(L, idx);
|
|
|
+ module::base* base = nullptr;
|
|
|
+
|
|
|
+ if (ty == sol::type::lightuserdata) {
|
|
|
+ base = static_cast<module::base*>(lua_touserdata(L, idx));
|
|
|
+ lua_pop(L, 1);
|
|
|
+ }
|
|
|
+ else if (ty == sol::type::userdata) {
|
|
|
+ sol::stack::record tracking{};
|
|
|
+ auto maybe = sol::stack::check_get<module::base*>(L, idx, &sol::no_panic, tracking);
|
|
|
+ lua_pop(L, 1);
|
|
|
+ if (maybe) {
|
|
|
+ base = *maybe;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ luaL_error(L, "fw_request_temp_ptr.push: full userdata is not a module::base* "
|
|
|
+ "(use conn:self() for light pointer, or register your type with sol::bases<module::base>)");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ lua_pop(L, 1);
|
|
|
+ luaL_error(L, "fw_request_temp_ptr.push: expected lightuserdata (e.g. obj:self()) or userdata");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (base == nullptr) {
|
|
|
+ luaL_error(L, "fw_request_temp_ptr.push: null pointer");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ self.m_queue.push(base);
|
|
|
}
|
|
|
|
|
|
-module::request_temp_ptr::~request_temp_ptr()
|
|
|
+module::request_temp_ptr::request_temp_ptr()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
-void module::request_temp_ptr::push(void* value)
|
|
|
+module::request_temp_ptr::~request_temp_ptr()
|
|
|
{
|
|
|
- m_queue.push(value);
|
|
|
+ clear();
|
|
|
}
|
|
|
+
|
|
|
void module::request_temp_ptr::clear()
|
|
|
{
|
|
|
while (m_queue.size() > 0)
|
|
|
{
|
|
|
- auto base = (module::base*)m_queue.front();
|
|
|
+ module::base* base = m_queue.front();
|
|
|
m_queue.pop();
|
|
|
base->self_free();
|
|
|
}
|
|
|
}
|
|
|
void module::request_temp_ptr::regist(sol::state* lua)
|
|
|
{
|
|
|
+ lua_State* L = lua->lua_state();
|
|
|
+ if (lua_getfield(L, LUA_REGISTRYINDEX, kModuleBaseRegKey) == LUA_TNIL) {
|
|
|
+ lua_pop(L, 1);
|
|
|
+ lua->new_usertype<module::base>("fw_module_base", sol::no_constructor);
|
|
|
+ lua_pushboolean(L, 1);
|
|
|
+ lua_setfield(L, LUA_REGISTRYINDEX, kModuleBaseRegKey);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ lua_pop(L, 1);
|
|
|
+ }
|
|
|
+
|
|
|
lua->new_usertype<module::request_temp_ptr>("fw_request_temp_ptr",
|
|
|
- "new", sol::constructors<module::request_temp_ptr()>(),
|
|
|
- "push", &module::request_temp_ptr::push,
|
|
|
- "clear", &module::request_temp_ptr::clear
|
|
|
+ "push", &module::request_temp_ptr::push_from_lua
|
|
|
);
|
|
|
-}
|
|
|
+}
|
|
|
+
|