lua-utils, lua-decision: use lua_pcall() in funcbridge to avoid exits on errors
authorJanos Kovacs <jankovac503@gmail.com>
Mon, 26 Nov 2012 07:43:36 +0000 (09:43 +0200)
committerJanos Kovacs <jankovac503@gmail.com>
Mon, 26 Nov 2012 07:43:36 +0000 (09:43 +0200)
src/core/lua-decision/element.c
src/core/lua-decision/tests/decision-test.c
src/core/lua-utils/funcbridge.c

index f447960..7b043f6 100644 (file)
@@ -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;
         }
     }
index 0e2c9cf..5d81d2f 100644 (file)
@@ -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:
index 76c81ea..b0c5000 100644 (file)
@@ -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;