MINOR: lua: add core.done() function

This function immediately give back the control to HAProxy core.
diff --git a/doc/lua-api/index.rst b/doc/lua-api/index.rst
index 8671f3e..07e9029 100644
--- a/doc/lua-api/index.rst
+++ b/doc/lua-api/index.rst
@@ -402,6 +402,19 @@
 
   :returns: A socket class object.
 
+.. js:function:: core.done(data)
+
+  **context**: body, init, task, action, sample-fetch, converter
+
+  :param any data: Return some data for the caller. It is useful with
+    sample-fetches and sample-converters.
+
+  Immediately stops the current Lua execution and returns to the caller which
+  may be a sample fetch, a converter or an action and returns the specified
+  value (ignored for actions). It is used when the LUA process finishes its
+  work and wants to give back the control to HAProxy without executing the
+  remaining code. It can be seen as a multi-level "return".
+
 .. js:function:: core.yield()
 
   **context**: task, action, sample-fetch, converter
diff --git a/include/types/hlua.h b/include/types/hlua.h
index f481bdf..453980b 100644
--- a/include/types/hlua.h
+++ b/include/types/hlua.h
@@ -24,6 +24,7 @@
 #define HLUA_CTRLYIELD 0x00000002
 #define HLUA_WAKERESWR 0x00000004
 #define HLUA_WAKEREQWR 0x00000008
+#define HLUA_EXIT      0x00000010
 
 enum hlua_exec {
 	HLUA_E_OK = 0,
diff --git a/src/hlua.c b/src/hlua.c
index 84aee63..5357b32 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -991,6 +991,16 @@
 		break;
 
 	case LUA_ERRRUN:
+
+		/* Special exit case. The traditionnal exit is returned as an error
+		 * because the errors ares the only one mean to return immediately
+		 * from and lua execution.
+		 */
+		if (lua->flags & HLUA_EXIT) {
+			ret = HLUA_E_OK;
+			break;
+		}
+
 		lua->wake_time = TICK_ETERNITY;
 		if (!lua_checkstack(lua->T, 1)) {
 			ret = HLUA_E_ERR;
@@ -1070,6 +1080,17 @@
 	return ret;
 }
 
+/* This function exit the current code. */
+__LJMP static int hlua_done(lua_State *L)
+{
+	struct hlua *hlua = hlua_gethlua(L);
+
+	hlua->flags |= HLUA_EXIT;
+	WILL_LJMP(lua_error(L));
+
+	return 0;
+}
+
 /* This function is an LUA binding. It provides a function
  * for deleting ACL from a referenced ACL file.
  */
@@ -4704,6 +4725,7 @@
 	hlua_class_function(gL.T, "Info", hlua_log_info);
 	hlua_class_function(gL.T, "Warning", hlua_log_warning);
 	hlua_class_function(gL.T, "Alert", hlua_log_alert);
+	hlua_class_function(gL.T, "done", hlua_done);
 
 	lua_setglobal(gL.T, "core");