summaryrefslogtreecommitdiff
path: root/library/LuaTypes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'library/LuaTypes.cpp')
-rw-r--r--library/LuaTypes.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/library/LuaTypes.cpp b/library/LuaTypes.cpp
index 8548c5d0..e7197796 100644
--- a/library/LuaTypes.cpp
+++ b/library/LuaTypes.cpp
@@ -37,6 +37,7 @@ distribution.
#include "DataDefs.h"
#include "DataIdentity.h"
#include "LuaWrapper.h"
+#include "LuaTools.h"
#include "DataFuncs.h"
#include "MiscUtils.h"
@@ -285,6 +286,9 @@ void container_identity::lua_item_read(lua_State *state, int fname_idx, void *pt
void container_identity::lua_item_write(lua_State *state, int fname_idx, void *ptr, int idx, int val_index)
{
+ if (is_readonly())
+ field_error(state, fname_idx, "container is read-only", "write");
+
auto id = (type_identity*)lua_touserdata(state, UPVAL_ITEM_ID);
void *pitem = item_pointer(id, ptr, idx);
id->lua_write(state, fname_idx, pitem, val_index);
@@ -1064,6 +1068,27 @@ int LuaWrapper::method_wrapper_core(lua_State *state, function_identity_base *id
return 1;
}
+int Lua::CallWithCatch(lua_State *state, int (*fn)(lua_State*), const char *context)
+{
+ if (!context)
+ context = "native code";
+
+ try {
+ return fn(state);
+ }
+ catch (Error::NullPointer &e) {
+ const char *vn = e.varname();
+ return luaL_error(state, "%s: NULL pointer: %s", context, vn ? vn : "?");
+ }
+ catch (Error::InvalidArgument &e) {
+ const char *vn = e.expr();
+ return luaL_error(state, "%s: Invalid argument; expected: %s", context, vn ? vn : "?");
+ }
+ catch (std::exception &e) {
+ return luaL_error(state, "%s: C++ exception: %s", context, e.what());
+ }
+}
+
/**
* Push a closure invoking the given function.
*/