diff options
author | chai <chaifix@163.com> | 2021-10-18 02:12:30 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-10-18 02:12:30 +0800 |
commit | 22e576b5aa065f3cb2ca67a951af5e68063419a2 (patch) | |
tree | d72c6c77e33990cc70952c58e9ca50637ba6c242 /Runtime/LuaBind | |
parent | 7c8c68d79343d04be382334c15a73d079450857c (diff) |
*scripting
Diffstat (limited to 'Runtime/LuaBind')
-rw-r--r-- | Runtime/LuaBind/LuaBindCFunctions.h | 21 | ||||
-rw-r--r-- | Runtime/LuaBind/LuaBindState.cpp | 33 |
2 files changed, 49 insertions, 5 deletions
diff --git a/Runtime/LuaBind/LuaBindCFunctions.h b/Runtime/LuaBind/LuaBindCFunctions.h index 25ccbc2..f0f07dd 100644 --- a/Runtime/LuaBind/LuaBindCFunctions.h +++ b/Runtime/LuaBind/LuaBindCFunctions.h @@ -10,16 +10,29 @@ namespace { - // // 获得第一个upvalue - // extern int luax_c_getupvalue(lua_State* L); - // // 调用此函数时会报错,upvalue(1)是错误信息 - // extern int luax_c_errfunc(lua_State* L); +#define luax_is(T, L, i) (lua_is##T(L, i)) +#define luax_isnumber(L, i) luax_is(number, L, i) + + inline int luax_isinteger(lua_State* L, int i) + { + if (!luax_isnumber(L, i)) + return 0; + return lua_tonumber(L, i) == lua_tointeger(L, i); + } + + inline int luax_isfloat(lua_State* L, int i) + { + if (!luax_isnumber(L, i)) + return 0; + return lua_tonumber(L, i) != lua_tointeger(L, i); + } + } #endif
\ No newline at end of file diff --git a/Runtime/LuaBind/LuaBindState.cpp b/Runtime/LuaBind/LuaBindState.cpp index a9520a8..4ee87f4 100644 --- a/Runtime/LuaBind/LuaBindState.cpp +++ b/Runtime/LuaBind/LuaBindState.cpp @@ -4,6 +4,8 @@ #include "LuaBindClass.hpp" #include "LuaBindInternal.h" +#include <string> + namespace LuaBind { @@ -40,6 +42,7 @@ namespace LuaBind void State::PushGlobalNamespace() { +#if false int top = GetTop(); lua_newtable(mState); // pseudo namespace table @@ -59,6 +62,9 @@ namespace LuaBind // stack: // -1 pseudo global namespace +#else + lua_pushvalue(mState, LUA_GLOBALSINDEX); +#endif } void State::PushNamespace(cc8* name) @@ -533,13 +539,38 @@ namespace LuaBind return value; } - + static std::string s_str; template <> cc8* State::GetValue < cc8* >(int idx, const cc8* value) { if (this->IsType(idx, LUA_TSTRING)) { return lua_tostring(this->mState, idx); } + + if (this->IsType(idx, LUA_TNUMBER)) { + if (luax_isinteger(mState, -1)) { + int num = lua_tointeger(this->mState, idx); + s_str = std::to_string(num); + cc8* str = s_str.c_str(); + return str; + } + else { + float num = lua_tonumber(this->mState, idx); + s_str = std::to_string(num); + cc8* str = s_str.c_str(); + return str; + } + } + + if (this->IsType(idx, LUA_TBOOLEAN)) { + bool b = lua_toboolean(this->mState, idx); + return b ? "true" : "false"; + } + + if (this->IsType(idx, LUA_TNIL)) { + return "NIL"; + } + return value; } |