Skip to content

Conversation

ZyX-I
Copy link
Contributor

@ZyX-I ZyX-I commented Dec 10, 2017

Huge refactoring aiming at plaing with list implementation (specifically, replacing list with either growarray or the like or kvec and running benchmarks). To do that all implementation-specific code should end up in eval/typval.[ch].

Should solve a bunch of issues from #4615 in process, simply because “NULL is an empty list” implementation detail gets hidden away.

@ZyX-I ZyX-I mentioned this pull request Dec 10, 2017
30 tasks
Most of files, except for eval.c and eval/* were only processed by perl.
@ZyX-I ZyX-I force-pushed the hide-container-impl branch from af4a324 to 5c1ddb5 Compare December 10, 2017 01:01
@marvim marvim added the WIP label Dec 10, 2017
@ZyX-I ZyX-I changed the title [WIP] Hide list implementation [RFC] Hide list implementation Dec 11, 2017
@ZyX-I
Copy link
Contributor Author

ZyX-I commented Dec 11, 2017

Should be ready if CI succeeds. Not switching implementation in this PR yet, better to have first refactoring merged and then do some experimenting as it is going to be more subjective (specifically what benchmarks to perform). Note: after this merged any new code matching ->lv_ or ->li_ is invalid with a few exceptions regarding GC and eval/typval.

@justinmk
Copy link
Member

Note: after this merged any new code matching ->lv_ or ->li_ is invalid with a few exceptions regarding GC and eval/typval.

Perhaps the linter could catch this?


/// Normalize index: that is, return either -1 or non-negative index
///
/// @param[in] l List to intex. Used to get length.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

intex->index

@marvim marvim added RFC and removed WIP labels Dec 11, 2017
@ZyX-I ZyX-I force-pushed the hide-container-impl branch from 5d89560 to 91d3efa Compare December 15, 2017 22:49
@ZyX-I
Copy link
Contributor Author

ZyX-I commented Dec 16, 2017

If CI passes this should be ready, previous CI only failed trailing whitespace lint check.

@ZyX-I
Copy link
Contributor Author

ZyX-I commented Dec 16, 2017

AppVeyor and QB succeeded.

@ZyX-I
Copy link
Contributor Author

ZyX-I commented Dec 16, 2017

Travis failure looks unrelated:

missing:
provider/pythonx: Could not load Python 3:
/opt/pyenv/shims/python3 does not have the "neovim" module. :help provider-python
python3.7 not found in search path or not executable.
/opt/pyenv/shims/python3.6 does not exist: pyenv: python3.6: command not found

The `python3.6' command exists in these Python versions:
  3.6
  3.6.3


python3.5 not found in search path or not executable.
/usr/bin/python3.4 does not have the "neovim" module. :help provider-python
python3.3 not found in search path or not executable.
/opt/pyenv/shims/python is Python 2.7 and cannot provide Python 3.�[0m
�[1m�[31m[  ERROR   ]�[0m�[0m �[1m1�[0m error, listed below:
�[1m�[31m[  ERROR   ]�[0m�[0m �[36m...uild/neovim/neovim/test/functional/terminal/tui_spec.lua�[0m @ �[36m351�[0m: �[1mtui FocusGained/FocusLost in cmdline-mode�[0m
./test/functional/helpers.lua:269: 
retry() attempts: 2
./test/functional/ui/screen.lua:307: Row 2 did not match.
Expected:
  |{1: }                                                 |
  |*lost                                              |
  |gained                                            |
  |{4:~                                                 }|
  |{5:[No Name] [+]                                     }|
  |:                                                 |
  |{3:-- TERMINAL --}                                    |
Actual:
  |{1: }                                                 |
  |*gained                                            |
  |lost                                              |
  |gained                                            |
  |{5:[No Name] [+]                                     }|
  |:                                                 |
  |{3:-- TERMINAL --}                                    |

To print the expect() call that would assert the current screen state, use
screen:snapshot_util(). In case of non-deterministic failures, use
screen:redraw_debug() to show all intermediate screen states.  

stack traceback:
	./test/functional/helpers.lua:269: in function 'retry'
	...uild/neovim/neovim/test/functional/terminal/tui_spec.lua:358: in function <...uild/neovim/neovim/test/functional/terminal/tui_spec.lua:351>


 �[1m11�[0m SKIPPED TESTS
 �[1m1�[0m ERROR
-- Output to stderr:

CMake Error at /home/travis/build/neovim/neovim/cmake/RunTests.cmake:53 (message):
  Running functional tests failed with error: 1.

. Restarting.

@ZyX-I
Copy link
Contributor Author

ZyX-I commented Dec 16, 2017

CI succeeded.

@justinmk
Copy link
Member

@oni-link done with comments?

@oni-link
Copy link
Contributor

@justinmk, I have not yet checked eval.c, otherwise done with .c files.

src/nvim/eval.c Outdated
TV_LIST_ITER(cur_l, li, {
abort = set_ref_in_item(TV_LIST_ITEM_TV(li), copyID, ht_stack,
&list_stack);
if (abort) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The outer enclosing if (!abort) could be removed.

n = false;
break;
}
case kSpecialVarFalse:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need a a "fallthrough" comment?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where and why? I have all proper breaks everywhere needed here.

src/nvim/eval.c Outdated
@@ -8936,7 +8968,7 @@ static void common_function(typval_T *argvars, typval_T *rettv,
goto theend;
}
list = argvars[arg_idx].vval.v_list;
if (list == NULL || list->lv_len == 0) {
if (list == NULL || tv_list_len(list) == 0) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

list == NULL could be removed.

src/nvim/eval.c Outdated
ic = tv_get_number_chk(&argvars[3], &error);
}
if (error) {
idx = tv_list_uidx(l, tv_get_number_chk(&argvars[2], &error));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not only error check tv_get_number_chk() here and let tv_list_find() handle the normalization and error handling?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And how I am to get the number to return exactly? tv_list_find() does not return one and I was not feeling like refactoring it to have ret_idx argument as it is useful in two places out of 18 tv_list_find is being used.

src/nvim/eval.c Outdated
assert(item != NULL);
}
if (argvars[3].v_type != VAR_UNKNOWN) {
ic = !!tv_get_number_chk(&argvars[3], &error);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the old code the following loop would not be entered, if error was set. error should also be set to false before the call to tv_get_number_chk() if it should be evaluated.

src/nvim/eval.c Outdated
@@ -12221,11 +12247,11 @@ static void find_some_match(typval_T *argvars, typval_T *rettv, int type)
goto theend;
}
if (l != NULL) {
li = tv_list_find(l, start);
idx = tv_list_uidx(l, start);
li = tv_list_find(l, idx);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why precompute idx if it is recomputed in this function?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, idx could be used later on. If this is the case computation of idx could be moved after the if block.

tv_list_item_free(li);
l->lv_len--;
tv_list_item_remove(l, li);
li = tv_list_find(l, idx);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Finding the new li looks kind of expansive. Can't prev_li be reused to set li?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, it will actually be invalid after removal. Not invalid with the current implementation, but invalid with array-based list implementation that may trigger realloc() at removal. I know that this is suboptimal, but I also know that uniq() is almost never used.

Copy link
Contributor Author

@ZyX-I ZyX-I Dec 17, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After searching for uniq() calls in the plugins that happened to be in my ~/.vam I found exactly one user of actual uniq() (that is, neosnippet) and a bunch of uniq() implementations based on dictionary (those that do not do sorting), though I do not quite understand WTF author was thinking when writing such code as

function! deoplete#util#uniq(list) abort
  let list = map(copy(a:list), '[v:val, v:val]')
  let i = 0
  let seen = {}
  while i < len(list)
    let key = string(list[i][1])
    if has_key(seen, key)
      call remove(list, i)
    else
      let seen[key] = 1
      let i += 1
    endif
  endwhile
  return map(list, 'v:val[0]')
endfunction

(it is not only deoplete, same thing is copied over in some other plugins). (Basically, what I do not understand is what the first and last map()s are for, from my POV you can just copy list over and do remove().)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For reference, my ~/.vam contains something like 200 plugins, though most normally not updated as I only installed them to check something.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I remembered that I actually bothered to clone all repositories from https://github.com/vim-scripts once in Jun 18, may search that for uniq(). The following is all what ag managed to find there:

% ag '^\s*(?!")\S.*(?<![#a-zA-Z0-9.]|\b\w:)\buniq\(' -G '.*\.vim' ../vim-scripts | tee uniqs.lst
../vim-scripts/AmbiCompletion.git/plugin/ambicompletion.vim:151:            call uniq(candidates)
../vim-scripts/AmbiCompletion.git/plugin/ambicompletion.vim:316:        call uniq(cachewords)
../vim-scripts/AmbiCompletion.git/plugin/ambicompletion.vim:355:        call uniq(cachewords)
../vim-scripts/changesPlugin.git/autoload/changes.vim:783:          call uniq(b:diffhl[i])
../vim-scripts/changesPlugin.git/autoload/changes.vim:1283:     let lines = uniq(lines)
../vim-scripts/changesPlugin.git/autoload/changes.vim:1347:         let g:lines=uniq(g:lines)
../vim-scripts/clickable.vim.git/autoload/vital/_clickable_vim.vim:265:    return uniq(a:list)
../vim-scripts/cmake.vim--Alcin.git/autoload/cmake/extension.vim:49:
../vim-scripts/cmake.vim--Alcin.git/autoload/cmake/extension.vim:50:  call uniq(l:signatures)
../vim-scripts/cmake.vim--Alcin.git/autoload/cmake/extension/ninja.vim:47:  call uniq(l:flags)
../vim-scripts/cmake.vim--Alcin.git/autoload/cmake/extension/ninja.vim:117:  call uniq(l:ninja_file_lines)
../vim-scripts/columnmove.git/autoload/vital/_columnmove.vim:265:    return uniq(a:list)
../vim-scripts/ctrlp-locate.git/autoload/vital/_ctrlp_locate.vim:276:    return uniq(a:list)
../vim-scripts/Dutyl.git/autoload/dutyl/util.vim:81:        return uniq(sort(a:list))
../vim-scripts/incsearch.vim.git/autoload/vital/_incsearch.vim:282:    return uniq(a:list)
../vim-scripts/ingo-library.git/autoload/ingo/compat.vim:93:    return uniq(a:list)
../vim-scripts/open-browser.vim.git/autoload/vital/_openbrowser.vim:265:    return uniq(a:list)
../vim-scripts/projectionist.vim.git/autoload/projectionist.vim:29:    return uniq(a:list)
../vim-scripts/tsuquyomi.git/autoload/vital/_tsuquyomi.vim:266:    return uniq(a:list)
../vim-scripts/unite-spell-suggest.git/autoload/mklib/string.vim:142:  return a:0 && a:1 ? uniq(sort(l:parts)) : l:parts
../vim-scripts/vim-gista.git/autoload/vital/_vim_gista.vim:247:    return uniq(a:list)
../vim-scripts/vim-javacomplete2.git/autoload/javacomplete/server.vim:15:    return uniq(a:list)
../vim-scripts/vim-operator-flashy.git/autoload/vital/_operator_flashy.vim:272:    return uniq(a:list)
../vim-scripts/vim-pandoc-bundle.git/autoload/pandoc/command.vim:72:            return filter(uniq(extend(sort(short_opts), sort(long_opts))), 'v:val != "-:"')
../vim-scripts/vim-signjk-motion.git/autoload/vital/_signjk.vim:272:    return uniq(a:list)
../vim-scripts/vim-snoopy.git/autoload/vital/_snoopy.vim:266:    return uniq(a:list)
../vim-scripts/vison.git/autoload/vital/_vison.vim:266:    return uniq(a:list)

@ZyX-I
Copy link
Contributor Author

ZyX-I commented Dec 17, 2017

CI succeeded.

@justinmk
Copy link
Member

Conflict in quickfix.c

@ZyX-I
Copy link
Contributor Author

ZyX-I commented Dec 23, 2017

Conflict resolved, though it was almost about nothing: static initializer of the structure I edited was replaced with memset. I thought lists are used more often to cause conflicts with actual list changes.

local len = 131072

describe('List support code', function()
if not pending('does not actually allows interrupting with just got_int', function() end) then return end
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The if not pending check seems like a mistake. Would be clearer:

pending('does not actually allows interrupting with just got_int', function() end)
return

Or remove it totally?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wrote it this way so that it is clear that return is there due to pending and to write everything in one line (one-line if is sometimes used, two syntactically unconnected statements on one line are not).

@justinmk justinmk merged commit dee78a4 into neovim:master Dec 23, 2017
@justinmk justinmk removed the RFC label Dec 23, 2017
@ZyX-I ZyX-I deleted the hide-container-impl branch December 23, 2017 18:24
justinmk added a commit that referenced this pull request Jun 11, 2018
FEATURES:
3cc7ebf #7234 built-in VimL expression parser
6a7c904 #4419 implement <Cmd> key to invoke command in any mode
b836328 #7679 'startup: treat stdin as text instead of commands'
58b210e :digraphs : highlight with hl-SpecialKey #2690
7a13611 #8276 'startup: Let `-s -` read from stdin'
1e71978 events: VimSuspend, VimResume #8280
1e7d5e8 #6272 'stdpath()'
f96d99a #8247 server: introduce --listen
e8c39f7 #8226 insert-mode: interpret unmapped META as ESC
98e7112 msg: do not scroll entire screen (#8088)
f72630b #8055 let negative 'writedelay' show all redraws
5d2dd2e win: has("wsl") on Windows Subsystem for Linux #7330
a4f6cec cmdline: CmdlineEnter and CmdlineLeave autocommands (#7422)
207b7ca #6844 channels: support buffered output and bytes sockets/stdio

API:
f85cbea #7917 API: buffer updates
418abfc #6743 API: list information about all channels/jobs.
36b2e3f #8375 API: nvim_get_commands
273d2cd #8329 API: Make nvim_set_option() update `:verbose set …`
8d40b36 #8371 API: more reliable/descriptive VimL errors
ebb1acb #8353 API: nvim_call_dict_function
9f994bb #8004 API: nvim_list_uis
3405704 #7520 API/UI: forward option updates to UIs
911b1e4 #7821 API: improve nvim_command_output

WINDOWS OS:
9cefd83 #8084, #8516 build/win: support MSVC
ee4e1fd win: Fix reading content from stdin (#8267)

TUI:
ffb8904 #8309 TUI: add support for mouse release events in urxvt
8d5a46e #8081 TUI: implement "standout" attribute
6071637 TUI: support TERM=konsole-256color
67848c0 #7653 TUI: report TUI info with -V3 ('verbose' >= 3)
3d0ee17 TUI/rxvt: enable focus-reporting
d109f56 #7640 TUI: 'term' option: reflect effective terminal behavior

FIXES:
ed6a113 #8273 'job-control: avoid kill-timer race'
4e02f1a #8107 'jobs: separate process-group'
451c48a terminal: flush vterm output buffer on pty output #8486
5d6732f :checkhealth fixes #8335
53f11dc #8218 'Fix errors reported by PVS'
d05712f inccommand: pause :terminal redraws (#8307)
51af911 inccommand: do not execute trailing commands #8256
84359a4 terminal: resize to the max dimensions (#8249)
d49c1dd #8228 Make vim_fgets() return the same values as in Vim
60e96a4 screen: winhl=Normal:Background should not override syntax (#8093)
0c59ac1 #5908 'shada: Also save numbered marks'
ba87a2c cscope: ignore EINTR while reading the prompt (#8079)
b1412dc #7971 ':terminal Enter/Leave should not increment jumplist'
3a5721e TUI: libtermkey: force CSI driver for mouse input #7948
6ff13d7 #7720 TUI: faster startup
1c6e956 #7862 TUI: fix resize-related segfaults
a58c909 #7676 TUI: always hide cursor when flushing, never flush buffers during unibilium output
303e1df #7624 TUI: disable BCE almost always
249bdb0 #7761 mark: Make sure that jumplist item will not have zero lnum
6f41ce0 #7704 macOS: Set $LANG based on the system locale
a043899 #7633 'Retry fgets on EINTR'

CHANGES:
ad60927 #8304 default to 'nofsync'
f3f1970 #8035 defaults: 'fillchars'
a6052c7 #7984 defaults: sidescroll=1
b69fa86 #7888 defaults: enable cscopeverbose
7c4bb23 defaults: do :filetype stuff unless explicitly "off"
2aa308c #5658 'Apply :lmap in macros'
8ce6393 terminal: Leave 'relativenumber' alone (#8360)
e46534b #4486 refactor: Remove maxmem, maxmemtot options
131aad9 win: defaults: 'shellcmdflag', 'shellxquote' #7343
c57d315 #8031 jobwait(): return -2 on interrupt also with timeout
6452831 clipboard: macOS: fallback to tmux if pbcopy is broken #7940
300d365 #7919 Make 'langnoremap' apply directly after a map
ada1956 #7880 'lua/executor: Remove lightuserdata'

INTERNAL:
de0a954 #7806 internal statistics for list impl
dee78a4 #7708 rewrite internal list impl
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants