From: Christopher Faulet Date: Wed, 24 Mar 2021 13:48:45 +0000 (+0100) Subject: MINOR: lua: Slightly improve function dumping the lua traceback X-Git-Tag: v2.4-dev14~41 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d09cc519bd0c04a0d1ec5bf23ed053c1e596851a;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/haproxy/hlua.h b/include/haproxy/hlua.h index 36629e6370..596d096ecf 100644 --- a/include/haproxy/hlua.h +++ b/include/haproxy/hlua.h @@ -43,6 +43,7 @@ #define HLUA_INIT(__hlua) do { (__hlua)->T = 0; } while(0) /* Lua HAProxy integration functions. */ +const char *hlua_traceback(lua_State *L, const char* sep); void hlua_ctx_destroy(struct hlua *lua); void hlua_init(); int hlua_post_init(); diff --git a/src/hlua.c b/src/hlua.c index 962195a607..f3a099e58f 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -353,19 +353,17 @@ const char *hlua_get_top_error_string(lua_State *L) 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; int level = 0; struct buffer *msg = get_trash_chunk(); - int filled = 0; while (lua_getstack(L, level++, &ar)) { /* Add separator */ - if (filled) - chunk_appendf(msg, ", "); - filled = 1; + if (b_data(msg)) + chunk_appendf(msg, "%s", sep); /* Fill fields: * '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 */ 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 - chunk_appendf(msg, "%s ", ar.short_src); + chunk_appendf(msg, "%s: ", ar.short_src); /* * Get function name @@ -389,13 +387,13 @@ __LJMP static const char *hlua_traceback(lua_State *L) * or "main" for main 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 */ - chunk_appendf(msg, "main chunk"); + chunk_appendf(msg, "in main chunk"); else if (*ar.what != 'C') /* for Lua functions, use */ - chunk_appendf(msg, "C function line %d", ar.linedefined); + chunk_appendf(msg, "in function line %d", ar.linedefined); else /* nothing left... */ chunk_appendf(msg, "?"); @@ -1350,7 +1348,7 @@ resume_execution: msg = lua_tostring(lua->T, -1); lua_settop(lua->T, 0); /* Empty the stack. */ lua_pop(lua->T, 1); - trace = hlua_traceback(lua->T); + trace = hlua_traceback(lua->T, ", "); if (msg) lua_pushfstring(lua->T, "[state-id %d] runtime error: %s from %s", lua->state_id, msg, trace); else @@ -8478,7 +8476,7 @@ int hlua_post_init_state(lua_State *L) msg = lua_tostring(L, -1); lua_settop(L, 0); /* Empty the stack. */ lua_pop(L, 1); - trace = hlua_traceback(L); + trace = hlua_traceback(L, ", "); if (msg) ha_alert("Lua init: %s: '%s' from %s\n", kind, msg, trace); else @@ -8500,7 +8498,7 @@ int hlua_post_init_state(lua_State *L) kind = "out of memory error"; lua_settop(L, 0); lua_pop(L, 1); - trace = hlua_traceback(L); + trace = hlua_traceback(L, ", "); ha_alert("Lua init: %s: %s\n", kind, trace); return_status = 0; break;