aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/genmsgpack.lua51
1 files changed, 34 insertions, 17 deletions
diff --git a/scripts/genmsgpack.lua b/scripts/genmsgpack.lua
index fff5f9c7ed..86a051fb4c 100644
--- a/scripts/genmsgpack.lua
+++ b/scripts/genmsgpack.lua
@@ -401,7 +401,7 @@ local function process_function(fn)
Error err = ERROR_INIT;
if (lua_gettop(lstate) != %i) {
api_set_error(&err, kErrorTypeValidation, "Expected %i argument%s");
- return luaL_error(lstate, "%%s", err.msg);
+ goto exit_0;
}
]], lua_c_function_name, #fn.parameters, #fn.parameters,
(#fn.parameters == 1) and '' or 's'))
@@ -420,11 +420,11 @@ local function process_function(fn)
const %s %s = nlua_pop_%s(lstate, &err);
if (ERROR_SET(&err)) {
- %s
- return luaL_error(lstate, "%%s", err.msg);
+ goto exit_%u;
}
- ]], param[1], cparam, param_type, table.concat(free_code, '\n ')))
- free_code[#free_code + 1] = ('api_free_%s(%s);'):format(lc_param_type, cparam)
+ ]], param[1], cparam, param_type, #fn.parameters - j))
+ free_code[#free_code + 1] = ('api_free_%s(%s);'):format(
+ lc_param_type, cparam)
cparams = cparam .. ', ' .. cparams
end
if fn.receives_channel_id then
@@ -435,7 +435,28 @@ local function process_function(fn)
else
cparams = cparams:gsub(', $', '')
end
- free_at_exit_code = table.concat(free_code, '\n ')
+ local free_at_exit_code = ''
+ for i = 1, #free_code do
+ local rev_i = #free_code - i + 1
+ local code = free_code[rev_i]
+ if i == 1 then
+ free_at_exit_code = free_at_exit_code .. ('\n %s'):format(code)
+ else
+ free_at_exit_code = free_at_exit_code .. ('\n exit_%u:\n %s'):format(
+ rev_i, code)
+ end
+ end
+ local err_throw_code = [[
+
+ exit_0:
+ if (ERROR_SET(&err)) {
+ luaL_where(lstate, 1);
+ lua_pushstring(lstate, err.msg);
+ api_clear_error(&err);
+ lua_concat(lstate, 2);
+ return lua_error(lstate);
+ }
+ ]]
if fn.return_type ~= 'void' then
if fn.return_type:match('^ArrayOf') then
return_type = 'Array'
@@ -444,24 +465,20 @@ local function process_function(fn)
end
write_shifted_output(output, string.format([[
const %s ret = %s(%s);
- %s
- if (ERROR_SET(&err)) {
- return luaL_error(lstate, "%%s", err.msg);
- }
nlua_push_%s(lstate, ret);
api_free_%s(ret);
+ %s
+ %s
return 1;
- ]], fn.return_type, fn.name, cparams, free_at_exit_code, return_type,
- return_type:lower()))
+ ]], fn.return_type, fn.name, cparams, return_type, return_type:lower(),
+ free_at_exit_code, err_throw_code))
else
write_shifted_output(output, string.format([[
%s(%s);
- %s
- if (ERROR_SET(&err)) {
- return luaL_error(lstate, "%%s", err.msg);
- }
+ %s
+ %s
return 0;
- ]], fn.name, cparams, free_at_exit_code))
+ ]], fn.name, cparams, free_at_exit_code, err_throw_code))
end
write_shifted_output(output, [[
}