aboutsummaryrefslogtreecommitdiff
path: root/src/FbTk/LuaUtil.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbTk/LuaUtil.cc')
-rw-r--r--src/FbTk/LuaUtil.cc23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/FbTk/LuaUtil.cc b/src/FbTk/LuaUtil.cc
index 456abac..7c24331 100644
--- a/src/FbTk/LuaUtil.cc
+++ b/src/FbTk/LuaUtil.cc
@@ -25,7 +25,12 @@
25 25
26#include "LuaUtil.hh" 26#include "LuaUtil.hh"
27 27
28namespace FbTk {
29
28namespace { 30namespace {
31 const char newindexDenyWriteName[] = "FbTk::Lua::newindexDenyWrite";
32 const char newindexDenyModifyName[] = "FbTk::Lua::newindexDenyModify";
33
29 int newindexDenyWrite(lua::state *l) { 34 int newindexDenyWrite(lua::state *l) {
30 if(l->isstring(-2)) 35 if(l->isstring(-2))
31 throw std::runtime_error("Cannot modify field '" + l->tostring(-2) + "'."); 36 throw std::runtime_error("Cannot modify field '" + l->tostring(-2) + "'.");
@@ -53,9 +58,20 @@ namespace {
53 58
54 return 0; 59 return 0;
55 } 60 }
56}
57 61
58namespace FbTk { 62 void registerNewindexes(Lua &l) {
63 l.checkstack(1);
64 lua::stack_sentry s(l);
65
66 l.pushfunction(&newindexDenyWrite);
67 l.rawsetfield(lua::REGISTRYINDEX, newindexDenyWriteName);
68
69 l.pushfunction(&newindexDenyModify);
70 l.rawsetfield(lua::REGISTRYINDEX, newindexDenyModifyName);
71 }
72
73 Lua::RegisterInitFunction register_newindexes(&registerNewindexes);
74} // anonymous namespace
59 75
60Lua::InitFunctions Lua::s_init_functions; 76Lua::InitFunctions Lua::s_init_functions;
61 77
@@ -81,7 +97,8 @@ void Lua::makeReadOnly(int index, bool only_existing_fields) {
81 } 97 }
82 } rawsetfield(-2, "__index"); 98 } rawsetfield(-2, "__index");
83 99
84 pushfunction(only_existing_fields ? &newindexDenyModify : &newindexDenyWrite); 100 rawgetfield(lua::REGISTRYINDEX,
101 only_existing_fields ? newindexDenyModifyName : newindexDenyWriteName);
85 rawsetfield(-2, "__newindex"); 102 rawsetfield(-2, "__newindex");
86 103
87 pushboolean(false); 104 pushboolean(false);