From: Janos Kovacs Date: Mon, 26 Nov 2012 07:43:36 +0000 (+0200) Subject: lua-utils, lua-decision: use lua_pcall() in funcbridge to avoid exits on errors X-Git-Tag: accepted/2.0alpha/20121203.182640~64 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ffe1212590b47453260c4d89690b7305e9e44aa8;p=profile%2Fivi%2Fmurphy.git lua-utils, lua-decision: use lua_pcall() in funcbridge to avoid exits on errors --- diff --git a/src/core/lua-decision/element.c b/src/core/lua-decision/element.c index f447960..7b043f6 100644 --- a/src/core/lua-decision/element.c +++ b/src/core/lua-decision/element.c @@ -298,7 +298,9 @@ static int element_update_cb(mrp_scriptlet_t *script, mrp_context_tbl_t *ctbl) if (el->update) { if (!mrp_funcbridge_call_from_c(L, el->update, "o", args, &t, &ret)) { - mrp_log_error("failed to call %s:update method", el->name); + mrp_log_error("failed to call %s:update method (%s)", + el->name, ret.string); + mrp_free((void *)ret.string); return FALSE; } } diff --git a/src/core/lua-decision/tests/decision-test.c b/src/core/lua-decision/tests/decision-test.c index 0e2c9cf..5d81d2f 100644 --- a/src/core/lua-decision/tests/decision-test.c +++ b/src/core/lua-decision/tests/decision-test.c @@ -412,7 +412,7 @@ int main(int argc, char **argv) if ((v = args[0].pointer = vols[0]) && (fb = v->update)) { char value[32]; if (!mrp_funcbridge_call_from_c(L, fb, "os", args, &t, &ret)) - printf("*** call failed\n"); + printf("*** call failed: %s\n", ret.string); else { switch (t) { case MRP_FUNCBRIDGE_NO_DATA: diff --git a/src/core/lua-utils/funcbridge.c b/src/core/lua-utils/funcbridge.c index 76c81ea..b0c5000 100644 --- a/src/core/lua-utils/funcbridge.c +++ b/src/core/lua-utils/funcbridge.c @@ -190,6 +190,7 @@ bool mrp_funcbridge_call_from_c(lua_State *L, int i; int sp; mrp_funcbridge_value_t *a; + int sts; bool success; if (!fb) @@ -198,11 +199,14 @@ bool mrp_funcbridge_call_from_c(lua_State *L, switch (fb->type) { case MRP_C_FUNCTION: - if (strcmp(signature, fb->c.signature)) - success = false; + if (!strcmp(signature, fb->c.signature)) + success = fb->c.func(L, fb->c.data, signature, args, ret_type, + ret_value); else { - success = fb->c.func(L, fb->c.data, signature, args, - ret_type, ret_value); + *ret_type = MRP_FUNCBRIDGE_STRING; + ret_value->string = mrp_strdup("mismatching signature " + "@ C invocation"); + success = false; } break; @@ -232,12 +236,15 @@ bool mrp_funcbridge_call_from_c(lua_State *L, } } - lua_call(L, i, 1); + sts = lua_pcall(L, i, 1, 0); + + MRP_ASSERT(!sts || (sts && lua_type(L, -1) == LUA_TSTRING), + "lua pcall did not return error string when failed"); switch (lua_type(L, -1)) { case LUA_TSTRING: *ret_type = MRP_FUNCBRIDGE_STRING; - ret_value->string = lua_tolstring(L, -1, NULL); + ret_value->string = mrp_strdup(lua_tolstring(L, -1, NULL)); break; case LUA_TNUMBER: *ret_type = MRP_FUNCBRIDGE_FLOATING; @@ -248,8 +255,7 @@ bool mrp_funcbridge_call_from_c(lua_State *L, memset(ret_value, 0, sizeof(*ret_value)); break; } - - success = true; + success = !sts; done: lua_settop(L, sp); break;