summaryrefslogtreecommitdiff
path: root/Source/external/Luax/luax_enum.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/external/Luax/luax_enum.cpp')
-rw-r--r--Source/external/Luax/luax_enum.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/Source/external/Luax/luax_enum.cpp b/Source/external/Luax/luax_enum.cpp
new file mode 100644
index 0000000..ec73fce
--- /dev/null
+++ b/Source/external/Luax/luax_enum.cpp
@@ -0,0 +1,67 @@
+#include "luax_enum.h"
+#include "luax_state.h"
+#include "luax_vm.h"
+
+namespace Luax
+{
+
+ ///
+ /// ֻmetatable__index
+ ///
+ int _rmt__index(lua_State* L)
+ {
+ // params:
+ // 1: enum table
+ // 2: key
+
+ // upvalues:
+ // 1: metatable
+
+ int mt = lua_upvalueindex(1);
+ lua_pushvalue(L, 2);
+ lua_rawget(L, mt);
+
+ return 1;
+ }
+
+ int _rmt__newindex(lua_State* L)
+ {
+ // upvalue:
+ // 1: enum table name
+
+ cc8* name = lua_tostring(L, lua_upvalueindex(1));
+
+ return luaL_error(L, "Enum called \"%s\" is readonly.", name);
+ }
+
+ //--------------------------------------------------------------------------------//
+#if LUAX_ENABLE_PLAIN_ENUM
+ int LuaxPlainEnum::registry(lua_State* L)
+ {
+ // params:
+ // 1: enum name
+ // 2: metatable
+
+ cc8* name = luaL_checkstring(L, 1);
+
+ if (!lua_istable(L, 2))
+ {
+ return luaL_error(L, "Create plain enum failed. Require table, but get %s", luaL_typename(L, 2));
+ }
+
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -2, "__index");
+
+ lua_pushstring(L, name);
+ lua_pushcclosure(L, _rmt__newindex, 1);
+ lua_setfield(L, -2, "__newindex");
+
+ lua_newtable(L); // enum table
+
+ lua_pushvalue(L, -2); // metatable
+ lua_setmetatable(L, -2);
+
+ return 1;
+ }
+#endif
+} \ No newline at end of file