summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2020-04-10 13:36:10 +0200
committerwm4 <wm4@nowhere>2020-04-10 13:36:10 +0200
commitc2ee7bce4cab472f1378b4b2a9e69c5f18223f3c (patch)
tree3ba3452e986815599bb673f859d37e9b84a224da
parente5d49f662e9e925fa405c3cfb9ffa3e743044dd8 (diff)
downloadmpv-c2ee7bce4cab472f1378b4b2a9e69c5f18223f3c.tar.bz2
mpv-c2ee7bce4cab472f1378b4b2a9e69c5f18223f3c.tar.xz
console: reduce memory usage in default mode
This used 1 MB due to building the complete command and property list when starting the script. These are needed only for auto-completion, so build them only on demand. Since building them is fast enough, rebuild them every time. The key bindings table is not that much, but saves some KBs. Oddly, the code to build it uses less memory than the table at runtime (???), so build it at runtime as well. Add 2 tactic collectgarbage() calls as well. This frees unused heap when it is known that the script is going to be completely inactive until re-enabled by the user.
-rw-r--r--player/lua/console.lua155
1 files changed, 82 insertions, 73 deletions
diff --git a/player/lua/console.lua b/player/lua/console.lua
index 581967e175..1e7fd14732 100644
--- a/player/lua/console.lua
+++ b/player/lua/console.lua
@@ -53,25 +53,6 @@ end
-- Apply user-set options
options.read_options(opts)
--- Build a list of commands, properties and options for tab-completion
-local option_info = {
- 'name', 'type', 'set-from-commandline', 'set-locally', 'default-value',
- 'min', 'max', 'choices',
-}
-local cmd_list = {}
-for i, cmd in ipairs(mp.get_property_native('command-list')) do
- cmd_list[i] = cmd.name
-end
-local prop_list = mp.get_property_native('property-list')
-for _, opt in ipairs(mp.get_property_native('options')) do
- prop_list[#prop_list + 1] = 'options/' .. opt
- prop_list[#prop_list + 1] = 'file-local-options/' .. opt
- prop_list[#prop_list + 1] = 'option-info/' .. opt
- for _, p in ipairs(option_info) do
- prop_list[#prop_list + 1] = 'option-info/' .. opt .. '/' .. p
- end
-end
-
local repl_active = false
local insert_mode = false
local pending_update = false
@@ -226,6 +207,7 @@ function set_active(active)
repl_active = false
undefine_key_bindings()
mp.enable_messages('silent:terminal-default')
+ collectgarbage()
end
update()
end
@@ -467,18 +449,39 @@ end
-- append: An extra string to be appended to the end of a successful
-- completion. It is only appended if 'list' contains exactly one
-- match.
-local completers = {
- { pattern = '^%s*()[%w_-]+()$', list = cmd_list, append = ' ' },
- { pattern = '^%s*set%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
- { pattern = '^%s*set%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
- { pattern = '^%s*add%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
- { pattern = '^%s*add%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
- { pattern = '^%s*cycle%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
- { pattern = '^%s*cycle%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
- { pattern = '^%s*multiply%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
- { pattern = '^%s*multiply%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
- { pattern = '${()[%w_/-]+()$', list = prop_list, append = '}' },
-}
+function build_completers()
+ -- Build a list of commands, properties and options for tab-completion
+ local option_info = {
+ 'name', 'type', 'set-from-commandline', 'set-locally', 'default-value',
+ 'min', 'max', 'choices',
+ }
+ local cmd_list = {}
+ for i, cmd in ipairs(mp.get_property_native('command-list')) do
+ cmd_list[i] = cmd.name
+ end
+ local prop_list = mp.get_property_native('property-list')
+ for _, opt in ipairs(mp.get_property_native('options')) do
+ prop_list[#prop_list + 1] = 'options/' .. opt
+ prop_list[#prop_list + 1] = 'file-local-options/' .. opt
+ prop_list[#prop_list + 1] = 'option-info/' .. opt
+ for _, p in ipairs(option_info) do
+ prop_list[#prop_list + 1] = 'option-info/' .. opt .. '/' .. p
+ end
+ end
+
+ return {
+ { pattern = '^%s*()[%w_-]+()$', list = cmd_list, append = ' ' },
+ { pattern = '^%s*set%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
+ { pattern = '^%s*set%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
+ { pattern = '^%s*add%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
+ { pattern = '^%s*add%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
+ { pattern = '^%s*cycle%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
+ { pattern = '^%s*cycle%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
+ { pattern = '^%s*multiply%s+()[%w_/-]+()$', list = prop_list, append = ' ' },
+ { pattern = '^%s*multiply%s+"()[%w_/-]+()$', list = prop_list, append = '" ' },
+ { pattern = '${()[%w_/-]+()$', list = prop_list, append = '}' },
+ }
+end
-- Use 'list' to find possible tab-completions for 'part.' Returns the longest
-- common prefix of all the matching list items and a flag that indicates
@@ -513,7 +516,7 @@ function complete()
local after_cur = line:sub(cursor)
-- Try the first completer that works
- for _, completer in ipairs(completers) do
+ for _, completer in ipairs(build_completers()) do
-- Completer patterns should return the start and end of the word to be
-- completed as the first and second capture groups
local _, _, s, e = before_cur:find(completer.pattern)
@@ -650,47 +653,51 @@ end
-- List of input bindings. This is a weird mashup between common GUI text-input
-- bindings and readline bindings.
-local bindings = {
- { 'esc', function() set_active(false) end },
- { 'enter', handle_enter },
- { 'kp_enter', handle_enter },
- { 'shift+enter', function() handle_char_input('\n') end },
- { 'bs', handle_backspace },
- { 'shift+bs', handle_backspace },
- { 'del', handle_del },
- { 'shift+del', handle_del },
- { 'ins', handle_ins },
- { 'shift+ins', function() paste(false) end },
- { 'mbtn_mid', function() paste(false) end },
- { 'left', function() prev_char() end },
- { 'right', function() next_char() end },
- { 'up', function() move_history(-1) end },
- { 'wheel_up', function() move_history(-1) end },
- { 'down', function() move_history(1) end },
- { 'wheel_down', function() move_history(1) end },
- { 'wheel_left', function() end },
- { 'wheel_right', function() end },
- { 'ctrl+left', prev_word },
- { 'ctrl+right', next_word },
- { 'tab', complete },
- { 'home', go_home },
- { 'end', go_end },
- { 'pgup', handle_pgup },
- { 'pgdwn', handle_pgdown },
- { 'ctrl+c', clear },
- { 'ctrl+d', maybe_exit },
- { 'ctrl+k', del_to_eol },
- { 'ctrl+l', clear_log_buffer },
- { 'ctrl+u', del_to_start },
- { 'ctrl+v', function() paste(true) end },
- { 'meta+v', function() paste(true) end },
- { 'ctrl+w', del_word },
- { 'kp_dec', function() handle_char_input('.') end },
-}
+function get_bindings()
+ local bindings = {
+ { 'esc', function() set_active(false) end },
+ { 'enter', handle_enter },
+ { 'kp_enter', handle_enter },
+ { 'shift+enter', function() handle_char_input('\n') end },
+ { 'bs', handle_backspace },
+ { 'shift+bs', handle_backspace },
+ { 'del', handle_del },
+ { 'shift+del', handle_del },
+ { 'ins', handle_ins },
+ { 'shift+ins', function() paste(false) end },
+ { 'mbtn_mid', function() paste(false) end },
+ { 'left', function() prev_char() end },
+ { 'right', function() next_char() end },
+ { 'up', function() move_history(-1) end },
+ { 'wheel_up', function() move_history(-1) end },
+ { 'down', function() move_history(1) end },
+ { 'wheel_down', function() move_history(1) end },
+ { 'wheel_left', function() end },
+ { 'wheel_right', function() end },
+ { 'ctrl+left', prev_word },
+ { 'ctrl+right', next_word },
+ { 'tab', complete },
+ { 'home', go_home },
+ { 'end', go_end },
+ { 'pgup', handle_pgup },
+ { 'pgdwn', handle_pgdown },
+ { 'ctrl+c', clear },
+ { 'ctrl+d', maybe_exit },
+ { 'ctrl+k', del_to_eol },
+ { 'ctrl+l', clear_log_buffer },
+ { 'ctrl+u', del_to_start },
+ { 'ctrl+v', function() paste(true) end },
+ { 'meta+v', function() paste(true) end },
+ { 'ctrl+w', del_word },
+ { 'kp_dec', function() handle_char_input('.') end },
+ }
+
+ for i = 0, 9 do
+ bindings[#bindings + 1] =
+ {'kp' .. i, function() handle_char_input('' .. i) end}
+ end
-for i = 0, 9 do
- bindings[#bindings + 1] =
- {'kp' .. i, function() handle_char_input('' .. i) end}
+ return bindings
end
local function text_input(info)
@@ -705,7 +712,7 @@ function define_key_bindings()
if #key_bindings > 0 then
return
end
- for _, bind in ipairs(bindings) do
+ for _, bind in ipairs(get_bindings()) do
-- Generate arbitrary name for removing the bindings later.
local name = "_console_" .. (#key_bindings + 1)
key_bindings[#key_bindings + 1] = name
@@ -779,3 +786,5 @@ mp.register_event('log-message', function(e)
log_add(style, '[' .. e.prefix .. '] ' .. e.text)
end)
+
+collectgarbage()