From 34fe8e795aaeed3a9f50d895d1cadd8f124c9605 Mon Sep 17 00:00:00 2001 From: chai Date: Sun, 17 Mar 2019 20:36:39 +0800 Subject: *luax --- Source/3rdParty/Luax/luax_class.cpp | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'Source/3rdParty/Luax/luax_class.cpp') diff --git a/Source/3rdParty/Luax/luax_class.cpp b/Source/3rdParty/Luax/luax_class.cpp index 8c94248..155fd28 100644 --- a/Source/3rdParty/Luax/luax_class.cpp +++ b/Source/3rdParty/Luax/luax_class.cpp @@ -39,6 +39,30 @@ namespace Luax lua_pushvalue(L, -1); // class table lua_setfield(L, -2, "__index"); + lua_pushstring(L, type); + lua_pushcclosure(L, l___tostring, 1); + lua_setfield(L, -2, "__tostring"); + + return 1; + } + + int LuaxPlainClass::l___tostring(lua_State* L) + { + // upvalues: + // 1: class name + + // params: + // 1: instance + + if (!lua_istable(L, 1)) + { + return luaL_typerror(L, 1, lua_typename(L, LUA_TTABLE)); + } + + cc8* type = lua_tostring(L, lua_upvalueindex(1)); + + lua_pushfstring(L, "%s: %p", type, lua_topointer(L, 1)); + return 1; } @@ -64,8 +88,9 @@ namespace Luax lua_pushvalue(L, classTable); lua_setmetatable(L, -2); + // 找到构造函数,会触发metatable.__index,根据继承链向上找。 lua_getfield(L, classTable, "Ctor"); - if (!lua_isnil(L, -1)) + if (state.IsType(-1, LUA_TFUNCTION)) { // stack: // -1: Ctor() @@ -145,13 +170,17 @@ namespace Luax lua_pushcclosure(L, l_Extend, 1); lua_setfield(L, -2, "Extend"); - // .base 用来索引到基类 + // .__base 用来索引到基类 lua_pushvalue(L, baseClass); // base class lua_setfield(L, -2, "__base"); lua_pushvalue(L, -1); // class table lua_setfield(L, -2, "__index"); + lua_pushstring(L, type); + lua_pushcclosure(L, l___tostring, 1); + lua_setfield(L, -2, "__tostring"); + // class的metatable设置为baseClass lua_pushvalue(L, baseClass); lua_setmetatable(L, -2); -- cgit v1.1-26-g67d0