From 086b4dde18a29afefccac8861915b8c6b99b3b9a Mon Sep 17 00:00:00 2001
From: Oleg Babin <babinoleg@mail.ru>
Date: Mon, 30 May 2022 07:59:21 +0300
Subject: [PATCH] fiber: don't skip fiber_obj:info() arguments

Commit b18dd47f50e8 ("Introduce backtrace=true option to fiber.info()")
introduced a way to skip backtraces in fiber.info() calls.
Commit 9da7e03e88e2 ("fiber: introduce fiber_o:info() and fiber_o:csw()")
introduced `options` function for fiber object however it ignored
passed options.
This patch fixed it. Currently fiber:info({backtrace = false})
returns info without backtrace.

Closes #7210

NO_DOC=bugfix

(cherry picked from commit 0eac13b90064b9a84cd84335374712026bd044c6)
---
 .../gh-7210-backtrace-for-fiber_obj-info.md        |  3 +++
 src/lua/fiber.c                                    | 14 +++++++-------
 .../gh_7210_backtrace_for_fiber_obj_info_test.lua  |  8 ++++++++
 3 files changed, 18 insertions(+), 7 deletions(-)
 create mode 100644 changelogs/unreleased/gh-7210-backtrace-for-fiber_obj-info.md
 create mode 100644 test/app-luatest/gh_7210_backtrace_for_fiber_obj_info_test.lua

diff --git a/changelogs/unreleased/gh-7210-backtrace-for-fiber_obj-info.md b/changelogs/unreleased/gh-7210-backtrace-for-fiber_obj-info.md
new file mode 100644
index 0000000000..7e13b648ed
--- /dev/null
+++ b/changelogs/unreleased/gh-7210-backtrace-for-fiber_obj-info.md
@@ -0,0 +1,3 @@
+## bugfix/lua
+
+* Fixed case when fiber_obj:info() ignored options (gh-7210).
diff --git a/src/lua/fiber.c b/src/lua/fiber.c
index 1fd74a6844..6d356cb0ce 100644
--- a/src/lua/fiber.c
+++ b/src/lua/fiber.c
@@ -317,15 +317,15 @@ lbox_fiber_top_disable(struct lua_State *L)
 
 #ifdef ENABLE_BACKTRACE
 bool
-lbox_do_backtrace(struct lua_State *L)
+lbox_do_backtrace(struct lua_State *L, int index)
 {
-	if (lua_istable(L, 1)) {
+	if (lua_istable(L, index)) {
 		lua_pushstring(L, "backtrace");
-		lua_gettable(L, 1);
-		if (lua_isnil(L, -1)){
+		lua_gettable(L, index);
+		if (lua_isnil(L, -1)) {
 			lua_pop(L, 1);
 			lua_pushstring(L, "bt");
-			lua_gettable(L, 1);
+			lua_gettable(L, index);
 		}
 		if (!lua_isnil(L, -1))
 			return lua_toboolean(L, -1);
@@ -358,7 +358,7 @@ static int
 lbox_fiber_info(struct lua_State *L)
 {
 #ifdef ENABLE_BACKTRACE
-	bool do_backtrace = lbox_do_backtrace(L);
+	bool do_backtrace = lbox_do_backtrace(L, 1);
 	if (do_backtrace) {
 		lua_newtable(L);
 		fiber_stat(lbox_fiber_statof_bt, L);
@@ -519,7 +519,7 @@ lbox_fiber_object_info(struct lua_State *L)
 	if (f == NULL)
 		luaL_error(L, "the fiber is dead");
 #ifdef ENABLE_BACKTRACE
-	bool do_backtrace = lbox_do_backtrace(L);
+	bool do_backtrace = lbox_do_backtrace(L, 2);
 	if (do_backtrace) {
 		lua_newtable(L);
 		lbox_fiber_statof_map(f, L, true);
diff --git a/test/app-luatest/gh_7210_backtrace_for_fiber_obj_info_test.lua b/test/app-luatest/gh_7210_backtrace_for_fiber_obj_info_test.lua
new file mode 100644
index 0000000000..ae5f99e539
--- /dev/null
+++ b/test/app-luatest/gh_7210_backtrace_for_fiber_obj_info_test.lua
@@ -0,0 +1,8 @@
+local fiber = require('fiber')
+local t = require('luatest')
+local g = t.group()
+
+g.test_backtrace_option_for_fiber_obj = function()
+    t.assert_equals(fiber.self():info({backtrace = false}).backtrace, nil)
+    t.assert_equals(fiber.self():info({bt = false}).backtrace, nil)
+end
-- 
GitLab