mirror of
https://github.com/neovim/neovim.git
synced 2025-09-24 20:18:32 +00:00
perf(api): allow to use an arena for return values
This commit is contained in:
@@ -17,6 +17,7 @@ local nvimdir = arg[1]
|
||||
package.path = nvimdir .. '/?.lua;' .. package.path
|
||||
|
||||
_G.vim = loadfile(nvimdir..'/../../runtime/lua/vim/shared.lua')()
|
||||
_G.vim.inspect = loadfile(nvimdir..'/../../runtime/lua/vim/inspect.lua')()
|
||||
|
||||
local hashy = require'generators.hashy'
|
||||
|
||||
@@ -72,6 +73,11 @@ for i = 6, #arg do
|
||||
-- for specifying errors
|
||||
fn.parameters[#fn.parameters] = nil
|
||||
end
|
||||
if #fn.parameters ~= 0 and fn.parameters[#fn.parameters][1] == 'arena' then
|
||||
-- return value is allocated in an arena
|
||||
fn.arena_return = true
|
||||
fn.parameters[#fn.parameters] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
input:close()
|
||||
@@ -210,7 +216,7 @@ for i = 1, #functions do
|
||||
if fn.impl_name == nil and fn.remote then
|
||||
local args = {}
|
||||
|
||||
output:write('Object handle_'..fn.name..'(uint64_t channel_id, Array args, Error *error)')
|
||||
output:write('Object handle_'..fn.name..'(uint64_t channel_id, Array args, Arena* arena, Error *error)')
|
||||
output:write('\n{')
|
||||
output:write('\n#if MIN_LOG_LEVEL <= LOGLVL_DBG')
|
||||
output:write('\n logmsg(LOGLVL_DBG, "RPC: ", NULL, -1, true, "ch %" PRIu64 ": invoke '
|
||||
@@ -319,6 +325,10 @@ for i = 1, #functions do
|
||||
output:write(call_args)
|
||||
end
|
||||
|
||||
if fn.arena_return then
|
||||
output:write(', arena')
|
||||
end
|
||||
|
||||
if fn.can_fail then
|
||||
-- if the function can fail, also pass a pointer to the local error object
|
||||
if #args > 0 then
|
||||
@@ -355,11 +365,12 @@ local hashorder, hashfun = hashy.hashy_hash("msgpack_rpc_get_handler_for", vim.t
|
||||
return "method_handlers["..idx.."].name"
|
||||
end)
|
||||
|
||||
output:write("static const MsgpackRpcRequestHandler method_handlers[] = {\n")
|
||||
for _, name in ipairs(hashorder) do
|
||||
output:write("const MsgpackRpcRequestHandler method_handlers[] = {\n")
|
||||
for n, name in ipairs(hashorder) do
|
||||
local fn = remote_fns[name]
|
||||
fn.handler_id = n-1
|
||||
output:write(' { .name = "'..name..'", .fn = handle_'.. (fn.impl_name or fn.name)..
|
||||
', .fast = '..tostring(fn.fast)..'},\n')
|
||||
', .fast = '..tostring(fn.fast)..', .arena_return = '..tostring(not not fn.arena_return)..'},\n')
|
||||
end
|
||||
output:write("};\n\n")
|
||||
output:write(hashfun)
|
||||
@@ -400,6 +411,10 @@ output:write([[
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/lua/converter.h"
|
||||
#include "nvim/lua/executor.h"
|
||||
#include "nvim/memory.h"
|
||||
|
||||
static ArenaMem lua_reuse_blk = { 0 };
|
||||
|
||||
]])
|
||||
include_headers(output, headers)
|
||||
output:write('\n')
|
||||
@@ -477,6 +492,14 @@ local function process_function(fn)
|
||||
if fn.receives_channel_id then
|
||||
cparams = 'LUA_INTERNAL_CALL, ' .. cparams
|
||||
end
|
||||
if fn.arena_return then
|
||||
cparams = cparams .. '&arena, '
|
||||
write_shifted_output(output, [[
|
||||
Arena arena = ARENA_EMPTY;
|
||||
arena_start(&arena, &lua_reuse_blk);
|
||||
]])
|
||||
end
|
||||
|
||||
if fn.can_fail then
|
||||
cparams = cparams .. '&err'
|
||||
else
|
||||
@@ -511,15 +534,21 @@ local function process_function(fn)
|
||||
else
|
||||
return_type = fn.return_type
|
||||
end
|
||||
local free_retval
|
||||
if fn.arena_return then
|
||||
free_retval = "arena_mem_free(arena_finish(&arena), &lua_reuse_blk);"
|
||||
else
|
||||
free_retval = "api_free_"..return_type:lower().."(ret);"
|
||||
end
|
||||
write_shifted_output(output, string.format([[
|
||||
const %s ret = %s(%s);
|
||||
nlua_push_%s(lstate, ret, true);
|
||||
api_free_%s(ret);
|
||||
%s
|
||||
%s
|
||||
%s
|
||||
return 1;
|
||||
]], fn.return_type, fn.name, cparams, return_type, return_type:lower(),
|
||||
free_at_exit_code, err_throw_code))
|
||||
]], fn.return_type, fn.name, cparams, return_type,
|
||||
free_retval, free_at_exit_code, err_throw_code))
|
||||
else
|
||||
write_shifted_output(output, string.format([[
|
||||
%s(%s);
|
||||
|
Reference in New Issue
Block a user