mirror of
https://github.com/vim/vim.git
synced 2025-10-02 05:04:20 -04:00
patch 8.2.1538: Python: iteration over vim objects fails to keep reference
Problem: Python: iteration over vim objects fails to keep reference. Solution: Keep a reference for the object. (Paul Ollis, closes #6803, closes #6806)
This commit is contained in:
@@ -4,6 +4,15 @@ source check.vim
|
||||
CheckFeature python3
|
||||
source shared.vim
|
||||
|
||||
func Create_vim_list()
|
||||
return [1]
|
||||
endfunction
|
||||
|
||||
func Create_vim_dict()
|
||||
return {'a': 1}
|
||||
endfunction
|
||||
|
||||
|
||||
" This function should be called first. This sets up python functions used by
|
||||
" the other tests.
|
||||
func Test_AAA_python3_setup()
|
||||
@@ -3944,4 +3953,47 @@ func Test_python3_keyboard_interrupt()
|
||||
close!
|
||||
endfunc
|
||||
|
||||
" Regression: Iterator for a Vim object should hold a reference.
|
||||
func Test_python3_iter_ref()
|
||||
let g:list_iter_ref_count_increase = -1
|
||||
let g:dict_iter_ref_count_increase = -1
|
||||
let g:bufmap_iter_ref_count_increase = -1
|
||||
let g:options_iter_ref_count_increase = -1
|
||||
|
||||
py3 << trim EOF
|
||||
import sys
|
||||
import vim
|
||||
|
||||
def test_python3_iter_ref():
|
||||
create_list = vim.Function('Create_vim_list')
|
||||
v = create_list()
|
||||
base_ref_count = sys.getrefcount(v)
|
||||
for el in v:
|
||||
vim.vars['list_iter_ref_count_increase'] = sys.getrefcount(v) - base_ref_count
|
||||
|
||||
create_dict = vim.Function('Create_vim_dict')
|
||||
v = create_dict()
|
||||
base_ref_count = sys.getrefcount(v)
|
||||
for el in v:
|
||||
vim.vars['dict_iter_ref_count_increase'] = sys.getrefcount(v) - base_ref_count
|
||||
|
||||
v = vim.buffers
|
||||
base_ref_count = sys.getrefcount(v)
|
||||
for el in v:
|
||||
vim.vars['bufmap_iter_ref_count_increase'] = sys.getrefcount(v) - base_ref_count
|
||||
|
||||
v = vim.options
|
||||
base_ref_count = sys.getrefcount(v)
|
||||
for el in v:
|
||||
vim.vars['options_iter_ref_count_increase'] = sys.getrefcount(v) - base_ref_count
|
||||
|
||||
test_python3_iter_ref()
|
||||
EOF
|
||||
|
||||
call assert_equal(1, g:list_iter_ref_count_increase)
|
||||
call assert_equal(1, g:dict_iter_ref_count_increase)
|
||||
call assert_equal(1, g:bufmap_iter_ref_count_increase)
|
||||
call assert_equal(1, g:options_iter_ref_count_increase)
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
Reference in New Issue
Block a user