-
Notifications
You must be signed in to change notification settings - Fork 0
/
go_luaerrors.c
50 lines (40 loc) · 1.14 KB
/
go_luaerrors.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "go_luajit.h"
const lua_err INVALID_ERROR_str = {"INVALID ERROR"};
lua_err *INVALID_ERROR = (lua_err *)&INVALID_ERROR_str;
lua_err *get_lua_error(lua_State *_L, int errCode) {
if (errCode == 0)
return NULL;
if (errCode == LUA_ERRMEM)
return create_lua_error("LUA OUT OF MEMORY");
const char *message = lua_tolstring(_L, -1, NULL);
if (message == NULL)
return INVALID_ERROR;
lua_pop(_L, 1);
return create_lua_error_from_luastr(message);
}
lua_err *create_lua_error_from_luastr(const char *msg) {
lua_err *err = chmalloc(sizeof(lua_err));
char *newMessage = chmalloc(sizeof(char)*(strlen(msg)+1));
strncpy(newMessage, msg, strlen(msg)+1);
err->message = newMessage;
return err;
}
lua_err *create_lua_error(char *msg) {
lua_err *err = chmalloc(sizeof(lua_err));
err->message = msg;
return err;
}
void free_lua_error(lua_err *err) {
if (err == NULL)
return;
chfree(err->message);
err->message = NULL;
chfree(err);
}
int raise_lua_error(lua_State *_L, lua_err *err) {
if (err == NULL)
return 0;
lua_pushstring(_L, err->message);
free_lua_error(err);
return lua_error(_L);
}