Skip to content

Commit

Permalink
lua: new function luaT_return_error()
Browse files Browse the repository at this point in the history
Currently, if we have to return errors using the format
'return nil, error', we must do it manually. Since this error
return method is described in our Lua coding style, it makes sense
to create a function that will return an error in this format.
This patch creates a function.

Needed for #4390
  • Loading branch information
ImeevMA committed Jul 31, 2019
1 parent 35a4868 commit f01ecd3
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 67 deletions.
12 changes: 4 additions & 8 deletions src/box/lua/session.c
Expand Up @@ -395,14 +395,10 @@ lbox_session_push(struct lua_State *L)
}
struct port port;
port_lua_create(&port, L);
if (session_push(session, sync, &port) != 0) {
lua_pushnil(L);
luaT_pusherror(L, box_error_last());
return 2;
} else {
lua_pushboolean(L, true);
return 1;
}
if (session_push(session, sync, &port) != 0)
return luaT_return_error(L);
lua_pushboolean(L, true);
return 1;
}

/**
Expand Down
10 changes: 10 additions & 0 deletions src/lua/error.c
Expand Up @@ -104,6 +104,16 @@ luaT_error(lua_State *L)
return 0;
}

int
luaT_return_error(lua_State *L)
{
struct error *e = diag_last_error(&fiber()->diag);
assert(e != NULL);
lua_pushnil(L);
luaT_pusherror(L, e);
return 2;
}

void
tarantool_lua_error_init(struct lua_State *L)
{
Expand Down
9 changes: 9 additions & 0 deletions src/lua/error.h
Expand Up @@ -49,6 +49,15 @@ struct error;
LUA_API int
luaT_error(lua_State *L);

/**
* Return nil as the first return value and an error as the
* second. The error is received using box_error_last().
*
* @param L Lua stack.
*/
LUA_API int
luaT_return_error(lua_State *L);

void
luaT_pusherror(struct lua_State *L, struct error *e);
/** \endcond public */
Expand Down
74 changes: 19 additions & 55 deletions src/lua/fio.c
Expand Up @@ -47,11 +47,9 @@
#include "lua/utils.h"
#include "coio_file.h"

static inline void
lbox_fio_pushsyserror(struct lua_State *L)
{
diag_set(SystemError, "fio: %s", strerror(errno));
luaT_pusherror(L, diag_get()->last);
#define lbox_fio_pushsyserror(L) { \
diag_set(SystemError, "fio: %s", strerror(errno)); \
return luaT_return_error(L); \
}

static int
Expand All @@ -69,11 +67,8 @@ lbox_fio_open(struct lua_State *L)
int mode = lua_tointeger(L, 3);

int fh = coio_file_open(pathname, flags, mode);
if (fh < 0) {
lua_pushnil(L);
if (fh < 0)
lbox_fio_pushsyserror(L);
return 2;
}
lua_pushinteger(L, fh);
return 1;
}
Expand All @@ -90,11 +85,8 @@ lbox_fio_pwrite(struct lua_State *L)
size_t offset = lua_tonumber(L, 4);

int res = coio_pwrite(fh, buf, len, offset);
if (res < 0) {
lua_pushnil(L);
if (res < 0)
lbox_fio_pushsyserror(L);
return 2;
}
lua_pushinteger(L, res);
return 1;
}
Expand All @@ -115,11 +107,8 @@ lbox_fio_pread(struct lua_State *L)

int res = coio_pread(fh, buf, len, offset);

if (res < 0) {
lua_pushnil(L);
if (res < 0)
lbox_fio_pushsyserror(L);
return 2;
}
lua_pushinteger(L, res);
return 1;
}
Expand All @@ -129,7 +118,10 @@ lbox_fio_pushbool(struct lua_State *L, bool res)
{
lua_pushboolean(L, res);
if (!res) {
lbox_fio_pushsyserror(L);
diag_set(SystemError, "fio: %s", strerror(errno));
struct error *e = diag_last_error(diag_get());
assert(e != NULL);
luaT_pusherror(L, e);
return 2;
}
return 1;
Expand Down Expand Up @@ -211,11 +203,8 @@ lbox_fio_write(struct lua_State *L)
size_t len = lua_tonumber(L, 3);

int res = coio_write(fh, buf, len);
if (res < 0) {
lua_pushnil(L);
if (res < 0)
lbox_fio_pushsyserror(L);
return 2;
}
lua_pushinteger(L, res);
return 1;
}
Expand Down Expand Up @@ -298,11 +287,8 @@ lbox_fio_read(struct lua_State *L)

int res = coio_read(fh, buf, len);

if (res < 0) {
lua_pushnil(L);
if (res < 0)
lbox_fio_pushsyserror(L);
return 2;
}
lua_pushinteger(L, res);
return 1;
}
Expand Down Expand Up @@ -371,11 +357,8 @@ DEF_STAT_METHOD(is_sock, S_ISSOCK);
static int
lbox_fio_pushstat(struct lua_State *L, int res, const struct stat *stat)
{
if (res < 0) {
lua_pushnil(L);
if (res < 0)
lbox_fio_pushsyserror(L);
return 2;
}
lua_newtable(L);

PUSHTABLE("dev", lua_pushinteger, stat->st_dev);
Expand Down Expand Up @@ -518,11 +501,8 @@ lbox_fio_listdir(struct lua_State *L)
}
pathname = lua_tostring(L, 1);
char *buf;
if (coio_readdir(pathname, &buf) < 0) {
lua_pushnil(L);
if (coio_readdir(pathname, &buf) < 0)
lbox_fio_pushsyserror(L);
return 2;
}
lua_pushstring(L, buf);
free(buf);
return 1;
Expand Down Expand Up @@ -613,11 +593,8 @@ lbox_fio_readlink(struct lua_State *L)
goto usage;
char *path = (char *)lua_newuserdata(L, PATH_MAX);
int res = coio_readlink(pathname, path, PATH_MAX);
if (res < 0) {
lua_pushnil(L);
if (res < 0)
lbox_fio_pushsyserror(L);
return 2;
}
lua_pushlstring(L, path, res);
lua_remove(L, -2);
return 1;
Expand All @@ -629,16 +606,11 @@ lbox_fio_tempdir(struct lua_State *L)
char *buf = (char *)lua_newuserdata(L, PATH_MAX);
if (!buf) {
errno = ENOMEM;
lua_pushnil(L);
lbox_fio_pushsyserror(L);
return 2;
}

if (coio_tempdir(buf, PATH_MAX) != 0) {
lua_pushnil(L);
if (coio_tempdir(buf, PATH_MAX) != 0)
lbox_fio_pushsyserror(L);
return 2;
}
lua_pushstring(L, buf);
lua_remove(L, -2);
return 1;
Expand All @@ -650,20 +622,12 @@ lbox_fio_cwd(struct lua_State *L)
char *buf = (char *)lua_newuserdata(L, PATH_MAX);
if (!buf) {
errno = ENOMEM;
lua_pushnil(L);
lbox_fio_pushsyserror(L);
return 2;
}


if (getcwd(buf, PATH_MAX)) {
lua_pushstring(L, buf);
lua_remove(L, -2);
} else {
if (getcwd(buf, PATH_MAX) == NULL)
lbox_fio_pushsyserror(L);
lua_pushnil(L);
return 2;
}
lua_pushstring(L, buf);
lua_remove(L, -2);
return 1;
}

Expand Down
7 changes: 3 additions & 4 deletions src/lua/swim.c
Expand Up @@ -69,11 +69,10 @@ lua_swim_new(struct lua_State *L)
{
uint64_t generation = luaL_checkuint64(L, 1);
struct swim *s = swim_new(generation);
if (s == NULL)
return luaT_return_error(L);
*(struct swim **) luaL_pushcdata(L, ctid_swim_ptr) = s;
if (s != NULL)
return 1;
luaT_pusherror(L, diag_last_error(diag_get()));
return 2;
return 1;
}

/**
Expand Down

0 comments on commit f01ecd3

Please sign in to comment.