df.new(): catch errors thrown by allocate()

This can include DFHack::Error::VTableMissing exceptions if the vtable of a
member field is unknown.

Fixes #3627
develop
lethosor 2023-08-04 17:14:08 -04:00
parent 7aa6aa317a
commit 47b4773786
No known key found for this signature in database
GPG Key ID: 76A269552F4F58C1
2 changed files with 16 additions and 3 deletions

@ -46,6 +46,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
## Internals
## Lua
- ``new()``: improved error handling so that certain errors that were previously uncatchable (creating objects with members with unknown vtables) are now catchable with ``pcall()``
## Removed

@ -685,7 +685,8 @@ static int meta_new(lua_State *state)
type_identity *id = get_object_identity(state, 1, "df.new()", true);
void *ptr;
void *ptr = nullptr;
std::string err_context;
// Support arrays of primitive types
if (argc == 2)
@ -703,11 +704,22 @@ static int meta_new(lua_State *state)
}
else
{
ptr = id->allocate();
try {
ptr = id->allocate();
}
catch (std::exception &e) {
if (e.what()) {
err_context = e.what();
}
}
}
if (!ptr)
luaL_error(state, "Cannot allocate %s", id->getFullName().c_str());
luaL_error(state, "Cannot allocate %s%s%s",
id->getFullName().c_str(),
err_context.empty() ? "" : ": ",
err_context.c_str()
);
if (lua_isuserdata(state, 1))
{