summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/hs_traceback.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/hs_traceback.c b/src/hs_traceback.c
new file mode 100644
index 0000000..0fc8266
--- /dev/null
+++ b/src/hs_traceback.c
@@ -0,0 +1,37 @@
+#include "honeysuckle.h"
+
+int hs_traceback(lua_State *L)
+{
+ if (!lua_isstring(L, 1))
+ /* 'message' is not a string, keep intact */
+ return 1;
+
+ lua_getglobal(L, "debug");
+ if (!lua_istable(L, -1)) {
+ lua_pop(L, 1);
+ return 1;
+ }
+
+ lua_getfield(L, -1, "traceback");
+ if (!lua_isfunction(L, -1)) {
+ lua_pop(L, 2);
+ return 1;
+ }
+
+ lua_pushvalue(L, 1);
+ lua_pushinteger(L, 2);
+ lua_call(L, 2, 1);
+ return 1;
+}
+
+
+int hs_call(lua_State *L, int nargs, int nret)
+{
+ int insert_pos = lua_gettop(L) - nargs;
+ lua_pushcfunction(L, hs_traceback);
+ lua_insert(L, traceback_pos);
+
+ int result = lua_pcall(L, nargs, nret, traceback_pos);
+ lua_remove(L, traceback_pos);
+ return result;
+}