diff options
Diffstat (limited to 'deps/lua/src/lapi.c')
-rw-r--r-- | deps/lua/src/lapi.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/deps/lua/src/lapi.c b/deps/lua/src/lapi.c index 5d5145d2e..1a9455629 100644 --- a/deps/lua/src/lapi.c +++ b/deps/lua/src/lapi.c @@ -674,6 +674,8 @@ LUA_API void lua_rawset (lua_State *L, int idx) { api_checknelems(L, 2); t = index2adr(L, idx); api_check(L, ttistable(t)); + if (hvalue(t)->readonly) + luaG_runerror(L, "Attempt to modify a readonly table"); setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1); luaC_barriert(L, hvalue(t), L->top-1); L->top -= 2; @@ -687,6 +689,8 @@ LUA_API void lua_rawseti (lua_State *L, int idx, int n) { api_checknelems(L, 1); o = index2adr(L, idx); api_check(L, ttistable(o)); + if (hvalue(o)->readonly) + luaG_runerror(L, "Attempt to modify a readonly table"); setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1); luaC_barriert(L, hvalue(o), L->top-1); L->top--; @@ -709,6 +713,8 @@ LUA_API int lua_setmetatable (lua_State *L, int objindex) { } switch (ttype(obj)) { case LUA_TTABLE: { + if (hvalue(obj)->readonly) + luaG_runerror(L, "Attempt to modify a readonly table"); hvalue(obj)->metatable = mt; if (mt) luaC_objbarriert(L, hvalue(obj), mt); @@ -1085,3 +1091,11 @@ LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { return name; } +LUA_API void lua_enablereadonlytable (lua_State *L, int objindex, int enabled) { + const TValue* o = index2adr(L, objindex); + api_check(L, ttistable(o)); + Table* t = hvalue(o); + api_check(L, t != hvalue(registry(L))); + t->readonly = enabled; +} + |