mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-10 17:17:06 +02:00
MINOR: lua: Slightly improve function dumping the lua traceback
The separator string is now configurable, passing it as parameter when the function is called. In addition, the message have been slightly changed to be a bit more readable.
This commit is contained in:
parent
a0fd35b054
commit
d09cc519bd
@ -43,6 +43,7 @@
|
|||||||
#define HLUA_INIT(__hlua) do { (__hlua)->T = 0; } while(0)
|
#define HLUA_INIT(__hlua) do { (__hlua)->T = 0; } while(0)
|
||||||
|
|
||||||
/* Lua HAProxy integration functions. */
|
/* Lua HAProxy integration functions. */
|
||||||
|
const char *hlua_traceback(lua_State *L, const char* sep);
|
||||||
void hlua_ctx_destroy(struct hlua *lua);
|
void hlua_ctx_destroy(struct hlua *lua);
|
||||||
void hlua_init();
|
void hlua_init();
|
||||||
int hlua_post_init();
|
int hlua_post_init();
|
||||||
|
24
src/hlua.c
24
src/hlua.c
@ -353,19 +353,17 @@ const char *hlua_get_top_error_string(lua_State *L)
|
|||||||
return lua_tostring(L, -1);
|
return lua_tostring(L, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
__LJMP static const char *hlua_traceback(lua_State *L)
|
__LJMP const char *hlua_traceback(lua_State *L, const char* sep)
|
||||||
{
|
{
|
||||||
lua_Debug ar;
|
lua_Debug ar;
|
||||||
int level = 0;
|
int level = 0;
|
||||||
struct buffer *msg = get_trash_chunk();
|
struct buffer *msg = get_trash_chunk();
|
||||||
int filled = 0;
|
|
||||||
|
|
||||||
while (lua_getstack(L, level++, &ar)) {
|
while (lua_getstack(L, level++, &ar)) {
|
||||||
|
|
||||||
/* Add separator */
|
/* Add separator */
|
||||||
if (filled)
|
if (b_data(msg))
|
||||||
chunk_appendf(msg, ", ");
|
chunk_appendf(msg, "%s", sep);
|
||||||
filled = 1;
|
|
||||||
|
|
||||||
/* Fill fields:
|
/* Fill fields:
|
||||||
* 'S': fills in the fields source, short_src, linedefined, lastlinedefined, and what;
|
* 'S': fills in the fields source, short_src, linedefined, lastlinedefined, and what;
|
||||||
@ -377,9 +375,9 @@ __LJMP static const char *hlua_traceback(lua_State *L)
|
|||||||
|
|
||||||
/* Append code localisation */
|
/* Append code localisation */
|
||||||
if (ar.currentline > 0)
|
if (ar.currentline > 0)
|
||||||
chunk_appendf(msg, "%s:%d ", ar.short_src, ar.currentline);
|
chunk_appendf(msg, "%s:%d: ", ar.short_src, ar.currentline);
|
||||||
else
|
else
|
||||||
chunk_appendf(msg, "%s ", ar.short_src);
|
chunk_appendf(msg, "%s: ", ar.short_src);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get function name
|
* Get function name
|
||||||
@ -389,13 +387,13 @@ __LJMP static const char *hlua_traceback(lua_State *L)
|
|||||||
* or "main" for main code.
|
* or "main" for main code.
|
||||||
*/
|
*/
|
||||||
if (*ar.namewhat != '\0' && ar.name != NULL) /* is there a name from code? */
|
if (*ar.namewhat != '\0' && ar.name != NULL) /* is there a name from code? */
|
||||||
chunk_appendf(msg, "%s '%s'", ar.namewhat, ar.name); /* use it */
|
chunk_appendf(msg, "in %s '%s'", ar.namewhat, ar.name); /* use it */
|
||||||
|
|
||||||
else if (*ar.what == 'm') /* "main", the code is not executed in a function */
|
else if (*ar.what == 'm') /* "main", the code is not executed in a function */
|
||||||
chunk_appendf(msg, "main chunk");
|
chunk_appendf(msg, "in main chunk");
|
||||||
|
|
||||||
else if (*ar.what != 'C') /* for Lua functions, use <file:line> */
|
else if (*ar.what != 'C') /* for Lua functions, use <file:line> */
|
||||||
chunk_appendf(msg, "C function line %d", ar.linedefined);
|
chunk_appendf(msg, "in function line %d", ar.linedefined);
|
||||||
|
|
||||||
else /* nothing left... */
|
else /* nothing left... */
|
||||||
chunk_appendf(msg, "?");
|
chunk_appendf(msg, "?");
|
||||||
@ -1350,7 +1348,7 @@ static enum hlua_exec hlua_ctx_resume(struct hlua *lua, int yield_allowed)
|
|||||||
msg = lua_tostring(lua->T, -1);
|
msg = lua_tostring(lua->T, -1);
|
||||||
lua_settop(lua->T, 0); /* Empty the stack. */
|
lua_settop(lua->T, 0); /* Empty the stack. */
|
||||||
lua_pop(lua->T, 1);
|
lua_pop(lua->T, 1);
|
||||||
trace = hlua_traceback(lua->T);
|
trace = hlua_traceback(lua->T, ", ");
|
||||||
if (msg)
|
if (msg)
|
||||||
lua_pushfstring(lua->T, "[state-id %d] runtime error: %s from %s", lua->state_id, msg, trace);
|
lua_pushfstring(lua->T, "[state-id %d] runtime error: %s from %s", lua->state_id, msg, trace);
|
||||||
else
|
else
|
||||||
@ -8478,7 +8476,7 @@ int hlua_post_init_state(lua_State *L)
|
|||||||
msg = lua_tostring(L, -1);
|
msg = lua_tostring(L, -1);
|
||||||
lua_settop(L, 0); /* Empty the stack. */
|
lua_settop(L, 0); /* Empty the stack. */
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
trace = hlua_traceback(L);
|
trace = hlua_traceback(L, ", ");
|
||||||
if (msg)
|
if (msg)
|
||||||
ha_alert("Lua init: %s: '%s' from %s\n", kind, msg, trace);
|
ha_alert("Lua init: %s: '%s' from %s\n", kind, msg, trace);
|
||||||
else
|
else
|
||||||
@ -8500,7 +8498,7 @@ int hlua_post_init_state(lua_State *L)
|
|||||||
kind = "out of memory error";
|
kind = "out of memory error";
|
||||||
lua_settop(L, 0);
|
lua_settop(L, 0);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
trace = hlua_traceback(L);
|
trace = hlua_traceback(L, ", ");
|
||||||
ha_alert("Lua init: %s: %s\n", kind, trace);
|
ha_alert("Lua init: %s: %s\n", kind, trace);
|
||||||
return_status = 0;
|
return_status = 0;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user