changeset 24385:0878f0fd349b v8.2.2733

patch 8.2.2733: detecting Lua version is not reliable Commit: https://github.com/vim/vim/commit/125ed2745c0a0570c1f81f249aebb023b2deef1b Author: Bram Moolenaar <Bram@vim.org> Date: Wed Apr 7 20:11:12 2021 +0200 patch 8.2.2733: detecting Lua version is not reliable Problem: Detecting Lua version is not reliable. Solution: Add "vim.lua_version". (Ozaki Kiichi, closes https://github.com/vim/vim/issues/8080)
author Bram Moolenaar <Bram@vim.org>
date Wed, 07 Apr 2021 20:15:04 +0200
parents 7416c47af1a5
children 2e1bd6b629ff
files ci/if_ver-1.vim runtime/doc/if_lua.txt src/if_lua.c src/testdir/test_lua.vim src/version.c
diffstat 5 files changed, 29 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/ci/if_ver-1.vim
+++ b/ci/if_ver-1.vim
@@ -6,7 +6,7 @@ if 1
   echo "*** Interface versions ***\n"
 
   echo 'Lua:'
-  PrintVer lua print(_VERSION)
+  PrintVer lua print(vim.lua_version, jit and "(LuaJIT)" or "")
 
   echo 'MzScheme:'
   PrintVer mzscheme (display (version))
--- a/runtime/doc/if_lua.txt
+++ b/runtime/doc/if_lua.txt
@@ -208,6 +208,8 @@ Vim evaluation and command execution, an
 				created on demand.  Example: >
 					:lua print(vim.fn.has('timers'))
 <
+	vim.lua_version		The Lua version Vim was compiled with, in the
+				form {major}.{minor}.{patch}, e.g. "5.1.4".
 
 ==============================================================================
 3. List userdata					*lua-list*
--- a/src/if_lua.c
+++ b/src/if_lua.c
@@ -24,6 +24,12 @@
 #define LUAVIM_EVALNAME "luaeval"
 #define LUAVIM_EVALHEADER "local _A=select(1,...) return "
 
+#ifdef LUA_RELEASE
+# define LUAVIM_VERSION LUA_RELEASE
+#else
+# define LUAVIM_VERSION LUA_VERSION
+#endif
+
 typedef buf_T *luaV_Buffer;
 typedef win_T *luaV_Window;
 typedef dict_T *luaV_Dict;
@@ -2087,6 +2093,7 @@ static const luaL_Reg luaV_module[] = {
     {"open", luaV_open},
     {"type", luaV_type},
     {"call", luaV_call},
+    {"lua_version", NULL},
     {NULL, NULL}
 };
 
@@ -2168,6 +2175,20 @@ luaV_setref(lua_State *L)
     return 1;
 }
 
+    static int
+luaV_pushversion(lua_State *L)
+{
+    int major = 0;
+    int minor = 0;
+    int patch = 0;
+    char s[16];
+
+    sscanf(LUAVIM_VERSION, "Lua %d.%d.%d", &major, &minor, &patch);
+    vim_snprintf(s, sizeof(s), "%d.%d.%d", major, minor, patch);
+    lua_pushstring(L, s);
+    return 0;
+}
+
 #define LUA_VIM_FN_CODE \
     "vim.fn = setmetatable({}, {\n"\
     "  __index = function (t, key)\n"\
@@ -2298,6 +2319,8 @@ luaopen_vim(lua_State *L)
     lua_newtable(L); // vim table
     lua_pushvalue(L, 1); // cache table
     luaV_openlib(L, luaV_module, 1);
+    luaV_pushversion(L);
+    lua_setfield(L, -2, "lua_version");
     lua_setglobal(L, LUAVIM_NAME);
     // custom code
     (void)luaL_dostring(L, LUA_VIM_FN_CODE);
--- a/src/testdir/test_lua.vim
+++ b/src/testdir/test_lua.vim
@@ -13,18 +13,7 @@ CheckFeature lua
 CheckFeature float
 
 " Depending on the lua version, the error messages are different.
-let s:luaver = split(split(systemlist('lua -v')[0], ' ')[1], '\.')
-if len(s:luaver) < 3
-  " Didn't get something that looks like a version, use _VERSION.
-  let s:luaver = split(split(luaeval('_VERSION'), ' ')[1], '\.')
-endif
-let s:major = str2nr(s:luaver[0])
-let s:minor = str2nr(s:luaver[1])
-if len(s:luaver) >= 3
-  let s:patch = str2nr(s:luaver[2])
-else
-  let s:patch = 0
-endif
+let [s:major, s:minor, s:patch] = luaeval('vim.lua_version')->split('\.')->map({-> str2nr(v:val)})
 let s:lua_53_or_later = 0
 let s:lua_543_or_later = 0
 if (s:major == 5 && s:minor >= 3) || s:major > 5
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2733,
+/**/
     2732,
 /**/
     2731,