From 8fb7273ac0b981eeb9afdc82675b908c1600d34f Mon Sep 17 00:00:00 2001 From: ZyX Date: Fri, 1 Jan 2016 12:17:22 +0300 Subject: eval: Move VimL functions list to a lua file Removes all kinds of problems with sorting, provides a ready-to-use function list representation for genvimvim.lua, does not require specifying function name twice (VimL function name (string) + f_ function name). --- scripts/geneval.lua | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 scripts/geneval.lua (limited to 'scripts/geneval.lua') diff --git a/scripts/geneval.lua b/scripts/geneval.lua new file mode 100644 index 0000000000..1f8a14d27b --- /dev/null +++ b/scripts/geneval.lua @@ -0,0 +1,42 @@ +local nvimsrcdir = arg[1] +local autodir = arg[2] + +if nvimsrcdir == '--help' then + print([[ +Usage: + lua geneval.lua src/nvim build/src/nvim/auto + +Will generate build/src/nvim/auto/funcs.generated.h with definition of functions +static const array. +]]) + os.exit(0) +end + +package.path = nvimsrcdir .. '/?.lua;' .. package.path + +local funcsfname = autodir .. '/funcs.generated.h' +local funcsfile = io.open(funcsfname, 'w') + +local funcs = require('eval') + +local sorted_funcs = {} +for name, def in pairs(funcs.funcs) do + def.name = name + def.args = def.args or 0 + if type(def.args) == 'number' then + def.args = {def.args, def.args} + elseif #def.args == 1 then + def.args[2] = 'MAX_FUNC_ARGS' + end + def.func = def.func or ('f_' .. def.name) + sorted_funcs[#sorted_funcs + 1] = def +end +table.sort(sorted_funcs, function(a, b) return a.name < b.name end) + +funcsfile:write('static const VimLFuncDef functions[] = {\n') +for _, def in ipairs(sorted_funcs) do + funcsfile:write((' { "%s", %s, %s, &%s },\n'):format( + def.name, def.args[1], def.args[2], def.func + )) +end +funcsfile:write('};\n') -- cgit From 5e59916e84933b0b05fda8ed76cf5f24fa3f48b6 Mon Sep 17 00:00:00 2001 From: ZyX Date: Fri, 1 Jan 2016 14:37:20 +0300 Subject: eval: Use generated hash to look up function list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problems: - Disables cross-compiling (alternative: keeps two hash implementations which need to be synchronized with each other). - Puts code-specific name literals into CMakeLists.txt. - Workaround for lua’s absence of bidirectional pipe communication is rather ugly. --- scripts/geneval.lua | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) (limited to 'scripts/geneval.lua') diff --git a/scripts/geneval.lua b/scripts/geneval.lua index 1f8a14d27b..c9533d7908 100644 --- a/scripts/geneval.lua +++ b/scripts/geneval.lua @@ -15,28 +15,20 @@ end package.path = nvimsrcdir .. '/?.lua;' .. package.path local funcsfname = autodir .. '/funcs.generated.h' -local funcsfile = io.open(funcsfname, 'w') + +local funcspipe = io.open(funcsfname .. '.hsh', 'w') local funcs = require('eval') -local sorted_funcs = {} for name, def in pairs(funcs.funcs) do - def.name = name - def.args = def.args or 0 - if type(def.args) == 'number' then - def.args = {def.args, def.args} - elseif #def.args == 1 then - def.args[2] = 'MAX_FUNC_ARGS' + args = def.args or 0 + if type(args) == 'number' then + args = {args, args} + elseif #args == 1 then + args[2] = 'MAX_FUNC_ARGS' end - def.func = def.func or ('f_' .. def.name) - sorted_funcs[#sorted_funcs + 1] = def -end -table.sort(sorted_funcs, function(a, b) return a.name < b.name end) - -funcsfile:write('static const VimLFuncDef functions[] = {\n') -for _, def in ipairs(sorted_funcs) do - funcsfile:write((' { "%s", %s, %s, &%s },\n'):format( - def.name, def.args[1], def.args[2], def.func - )) + func = def.func or ('f_' .. name) + local val = ('{ %s, %s, &%s }'):format(args[1], args[2], func) + funcspipe:write(name .. '\n' .. val .. '\n') end -funcsfile:write('};\n') +funcspipe:close() -- cgit From 3bd3b3b76859b3eef80fa4969147efa881b60f40 Mon Sep 17 00:00:00 2001 From: Björn Linse Date: Sat, 18 Jun 2016 12:06:50 +0200 Subject: api: auto generate api function wrappers for viml --- scripts/geneval.lua | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'scripts/geneval.lua') diff --git a/scripts/geneval.lua b/scripts/geneval.lua index c9533d7908..396e7b81db 100644 --- a/scripts/geneval.lua +++ b/scripts/geneval.lua @@ -1,5 +1,8 @@ +mpack = require('mpack') + local nvimsrcdir = arg[1] local autodir = arg[2] +local metadata_file = arg[3] if nvimsrcdir == '--help' then print([[ @@ -18,9 +21,20 @@ local funcsfname = autodir .. '/funcs.generated.h' local funcspipe = io.open(funcsfname .. '.hsh', 'w') -local funcs = require('eval') +local funcs = require('eval').funcs + +local metadata = mpack.unpack(io.open(arg[3], 'rb'):read("*all")) + +for i,fun in ipairs(metadata) do + funcs['api_'..fun.name] = { + args=#fun.parameters, + func='api_wrapper', + data='handle_'..fun.name, + } +end + -for name, def in pairs(funcs.funcs) do +for name, def in pairs(funcs) do args = def.args or 0 if type(args) == 'number' then args = {args, args} @@ -28,7 +42,8 @@ for name, def in pairs(funcs.funcs) do args[2] = 'MAX_FUNC_ARGS' end func = def.func or ('f_' .. name) - local val = ('{ %s, %s, &%s }'):format(args[1], args[2], func) + data = def.data or "NULL" + local val = ('{ %s, %s, &%s, %s }'):format(args[1], args[2], func, data) funcspipe:write(name .. '\n' .. val .. '\n') end funcspipe:close() -- cgit From 7e2348f2b1b487c875bbcf6c6711a276f9063040 Mon Sep 17 00:00:00 2001 From: Björn Linse Date: Sun, 19 Jun 2016 16:41:08 +0200 Subject: eval: use gperf to generate the hash of builtin functions make api functions highlighted as builtins in vim.vim --- scripts/geneval.lua | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'scripts/geneval.lua') diff --git a/scripts/geneval.lua b/scripts/geneval.lua index 396e7b81db..75a8bdfab3 100644 --- a/scripts/geneval.lua +++ b/scripts/geneval.lua @@ -3,6 +3,7 @@ mpack = require('mpack') local nvimsrcdir = arg[1] local autodir = arg[2] local metadata_file = arg[3] +local funcs_file = arg[4] if nvimsrcdir == '--help' then print([[ @@ -19,20 +20,34 @@ package.path = nvimsrcdir .. '/?.lua;' .. package.path local funcsfname = autodir .. '/funcs.generated.h' -local funcspipe = io.open(funcsfname .. '.hsh', 'w') +local gperfpipe = io.open(funcsfname .. '.gperf', 'wb') local funcs = require('eval').funcs - local metadata = mpack.unpack(io.open(arg[3], 'rb'):read("*all")) - for i,fun in ipairs(metadata) do funcs['api_'..fun.name] = { args=#fun.parameters, func='api_wrapper', - data='handle_'..fun.name, + data='&handle_'..fun.name, } end +local funcsdata = io.open(funcs_file, 'w') +funcsdata:write(mpack.pack(funcs)) +funcsdata:close() + +gperfpipe:write([[ +%language=ANSI-C +%global-table +%define initializer-suffix ,0,0,NULL,NULL +%define word-array-name functions +%define hash-function-name hash_internal_func_gperf +%define lookup-function-name find_internal_func_gperf +%omit-struct-type +%struct-type +VimLFuncDef; +%% +]]) for name, def in pairs(funcs) do args = def.args or 0 @@ -43,7 +58,7 @@ for name, def in pairs(funcs) do end func = def.func or ('f_' .. name) data = def.data or "NULL" - local val = ('{ %s, %s, &%s, %s }'):format(args[1], args[2], func, data) - funcspipe:write(name .. '\n' .. val .. '\n') + gperfpipe:write(('%s, %s, %s, &%s, (FunPtr)%s\n') + :format(name, args[1], args[2], func, data)) end -funcspipe:close() +gperfpipe:close() -- cgit From e536abc1e1f59d1ac012e1be576bf55175e95443 Mon Sep 17 00:00:00 2001 From: Björn Linse Date: Mon, 20 Jun 2016 14:40:57 +0200 Subject: api: Allow blacklist functions that shouldn't be accesible from eval Blacklist deprecated functions and functions depending on channel_id --- scripts/geneval.lua | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'scripts/geneval.lua') diff --git a/scripts/geneval.lua b/scripts/geneval.lua index 75a8bdfab3..a6171f0993 100644 --- a/scripts/geneval.lua +++ b/scripts/geneval.lua @@ -25,11 +25,13 @@ local gperfpipe = io.open(funcsfname .. '.gperf', 'wb') local funcs = require('eval').funcs local metadata = mpack.unpack(io.open(arg[3], 'rb'):read("*all")) for i,fun in ipairs(metadata) do - funcs['api_'..fun.name] = { - args=#fun.parameters, - func='api_wrapper', - data='&handle_'..fun.name, - } + if not fun.noeval then + funcs['api_'..fun.name] = { + args=#fun.parameters, + func='api_wrapper', + data='&handle_'..fun.name, + } + end end local funcsdata = io.open(funcs_file, 'w') -- cgit From 1c22cab2fd283db49bfdbeaea490747574a36049 Mon Sep 17 00:00:00 2001 From: Björn Linse Date: Tue, 28 Jun 2016 21:45:19 +0200 Subject: api: consistently use nvim_ prefix and update documentation --- scripts/geneval.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'scripts/geneval.lua') diff --git a/scripts/geneval.lua b/scripts/geneval.lua index a6171f0993..b1ba76296c 100644 --- a/scripts/geneval.lua +++ b/scripts/geneval.lua @@ -26,7 +26,7 @@ local funcs = require('eval').funcs local metadata = mpack.unpack(io.open(arg[3], 'rb'):read("*all")) for i,fun in ipairs(metadata) do if not fun.noeval then - funcs['api_'..fun.name] = { + funcs[fun.name] = { args=#fun.parameters, func='api_wrapper', data='&handle_'..fun.name, -- cgit