Bump liberty, shuffle some code
This commit is contained in:
parent
19b09a8cec
commit
331d1842b9
188
degesch.c
188
degesch.c
|
@ -7349,6 +7349,100 @@ lua_cache_invalidate (lua_State *L, void *object)
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
|
/// Append a traceback to all errors so that we can later extract it
|
||||||
|
static int
|
||||||
|
lua_plugin_error_handler (lua_State *L)
|
||||||
|
{
|
||||||
|
luaL_traceback (L, L, luaL_checkstring (L, 1), 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
lua_plugin_process_error (struct lua_plugin *self, const char *message,
|
||||||
|
struct error **e)
|
||||||
|
{
|
||||||
|
struct str_vector v;
|
||||||
|
str_vector_init (&v);
|
||||||
|
cstr_split_ignore_empty (message, '\n', &v);
|
||||||
|
|
||||||
|
if (v.len < 2)
|
||||||
|
error_set (e, "%s", message);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error_set (e, "%s", v.vector[0]);
|
||||||
|
log_global_debug (self->ctx, "Lua: plugin \"#s\": #s",
|
||||||
|
self->super.name, v.vector[1]);
|
||||||
|
for (size_t i = 2; i < v.len; i++)
|
||||||
|
log_global_debug (self->ctx, " #s", v.vector[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
str_vector_free (&v);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Call a Lua function and process errors using our special error handler
|
||||||
|
static bool
|
||||||
|
lua_plugin_call (struct lua_plugin *self,
|
||||||
|
int n_params, int n_results, struct error **e)
|
||||||
|
{
|
||||||
|
lua_State *L = self->L;
|
||||||
|
|
||||||
|
// We need to pop the error handler at the end
|
||||||
|
lua_pushcfunction (L, lua_plugin_error_handler);
|
||||||
|
int error_handler_idx = -n_params - 2;
|
||||||
|
lua_insert (L, error_handler_idx);
|
||||||
|
|
||||||
|
if (!lua_pcall (L, n_params, n_results, error_handler_idx))
|
||||||
|
{
|
||||||
|
lua_remove (L, -n_results - 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void) lua_plugin_process_error (self, lua_tostring (L, -1), e);
|
||||||
|
lua_pop (L, 2);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Convenience function; replaces the "original" string or produces an error
|
||||||
|
static bool
|
||||||
|
lua_plugin_handle_string_filter_result (struct lua_plugin *self,
|
||||||
|
char **original, bool utf8, struct error **e)
|
||||||
|
{
|
||||||
|
lua_State *L = self->L;
|
||||||
|
if (lua_isnil (L, -1))
|
||||||
|
{
|
||||||
|
free (*original);
|
||||||
|
*original = NULL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!lua_isstring (L, -1))
|
||||||
|
FAIL ("must return either a string or nil");
|
||||||
|
|
||||||
|
size_t len;
|
||||||
|
const char *processed = lua_tolstring (L, -1, &len);
|
||||||
|
if (utf8 && !utf8_validate (processed, len))
|
||||||
|
FAIL ("must return valid UTF-8");
|
||||||
|
|
||||||
|
// Only replace the string if it's different
|
||||||
|
if (strcmp (processed, *original))
|
||||||
|
{
|
||||||
|
free (*original);
|
||||||
|
*original = xstrdup (processed);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
lua_plugin_log_error
|
||||||
|
(struct lua_plugin *self, const char *where, struct error *error)
|
||||||
|
{
|
||||||
|
log_global_error (self->ctx, "Lua: plugin \"#s\": #s: #s",
|
||||||
|
self->super.name, where, error->message);
|
||||||
|
error_free (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
#define XLUA_BUFFER_METATABLE "buffer" ///< Identifier for the Lua metatable
|
#define XLUA_BUFFER_METATABLE "buffer" ///< Identifier for the Lua metatable
|
||||||
|
|
||||||
struct lua_buffer
|
struct lua_buffer
|
||||||
|
@ -7587,100 +7681,6 @@ static luaL_Reg lua_hook_table[] =
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
/// Append a traceback to all errors so that we can later extract it
|
|
||||||
static int
|
|
||||||
lua_plugin_error_handler (lua_State *L)
|
|
||||||
{
|
|
||||||
luaL_traceback (L, L, luaL_checkstring (L, 1), 1);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
lua_plugin_process_error (struct lua_plugin *self, const char *message,
|
|
||||||
struct error **e)
|
|
||||||
{
|
|
||||||
struct str_vector v;
|
|
||||||
str_vector_init (&v);
|
|
||||||
cstr_split_ignore_empty (message, '\n', &v);
|
|
||||||
|
|
||||||
if (v.len < 2)
|
|
||||||
error_set (e, "%s", message);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
error_set (e, "%s", v.vector[0]);
|
|
||||||
log_global_debug (self->ctx, "Lua: plugin \"#s\": #s",
|
|
||||||
self->super.name, v.vector[1]);
|
|
||||||
for (size_t i = 2; i < v.len; i++)
|
|
||||||
log_global_debug (self->ctx, " #s", v.vector[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
str_vector_free (&v);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Call a Lua function and process errors using our special error handler
|
|
||||||
static bool
|
|
||||||
lua_plugin_call (struct lua_plugin *self,
|
|
||||||
int n_params, int n_results, struct error **e)
|
|
||||||
{
|
|
||||||
lua_State *L = self->L;
|
|
||||||
|
|
||||||
// We need to pop the error handler at the end
|
|
||||||
lua_pushcfunction (L, lua_plugin_error_handler);
|
|
||||||
int error_handler_idx = -n_params - 2;
|
|
||||||
lua_insert (L, error_handler_idx);
|
|
||||||
|
|
||||||
if (!lua_pcall (L, n_params, n_results, error_handler_idx))
|
|
||||||
{
|
|
||||||
lua_remove (L, -n_results - 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) lua_plugin_process_error (self, lua_tostring (L, -1), e);
|
|
||||||
lua_pop (L, 2);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Convenience function; replaces the "original" string or produces an error
|
|
||||||
static bool
|
|
||||||
lua_plugin_handle_string_filter_result (struct lua_plugin *self,
|
|
||||||
char **original, bool utf8, struct error **e)
|
|
||||||
{
|
|
||||||
lua_State *L = self->L;
|
|
||||||
if (lua_isnil (L, -1))
|
|
||||||
{
|
|
||||||
free (*original);
|
|
||||||
*original = NULL;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!lua_isstring (L, -1))
|
|
||||||
FAIL ("must return either a string or nil");
|
|
||||||
|
|
||||||
size_t len;
|
|
||||||
const char *processed = lua_tolstring (L, -1, &len);
|
|
||||||
if (utf8 && !utf8_validate (processed, len))
|
|
||||||
FAIL ("must return valid UTF-8");
|
|
||||||
|
|
||||||
// Only replace the string if it's different
|
|
||||||
if (strcmp (processed, *original))
|
|
||||||
{
|
|
||||||
free (*original);
|
|
||||||
*original = xstrdup (processed);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
lua_plugin_log_error
|
|
||||||
(struct lua_plugin *self, const char *where, struct error *error)
|
|
||||||
{
|
|
||||||
log_global_error (self->ctx, "Lua: plugin \"#s\": #s: #s",
|
|
||||||
self->super.name, where, error->message);
|
|
||||||
error_free (error);
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
lua_input_hook_filter (struct input_hook *self, struct buffer *buffer,
|
lua_input_hook_filter (struct input_hook *self, struct buffer *buffer,
|
||||||
char *input)
|
char *input)
|
||||||
|
|
2
liberty
2
liberty
|
@ -1 +1 @@
|
||||||
Subproject commit 9e3cb2b6aa2db3ca0ea6a854fb3f89a163c84235
|
Subproject commit 60dd23ab8f5d772bee38200395e54d640499d443
|
Loading…
Reference in New Issue