diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-06-23 14:37:07 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-06-23 14:37:07 +0200 |
commit | 841fbd290790376561eaaaccaad9fc52f45ded89 (patch) | |
tree | 6bc85ba98d6432a5b3ca3c5f71e7d21793f290a7 /src/testdir/test87.in | |
parent | c4b99e0be76e0fbb9b43efb16f2d56607ce45de0 (diff) | |
download | vim-git-841fbd290790376561eaaaccaad9fc52f45ded89.tar.gz |
updated for version 7.3.1233v7.3.1233
Problem: Various Python problems.
Solution: Fix VimTryEnd. Crash with debug build and PYTHONDUMPREFS=1. Memory
leaks in StringToLine(), BufferMark() and convert_dl. (ZyX)
Diffstat (limited to 'src/testdir/test87.in')
-rw-r--r-- | src/testdir/test87.in | 202 |
1 files changed, 159 insertions, 43 deletions
diff --git a/src/testdir/test87.in b/src/testdir/test87.in index 1223ca96a..6b89117be 100644 --- a/src/testdir/test87.in +++ b/src/testdir/test87.in @@ -5,8 +5,8 @@ STARTTEST :set noswapfile :if !has('python3') | e! test.ok | wq! test.out | endif :lang C -:py3 import vim :fun Test() +:py3 import vim :let l = [] :py3 l=vim.bindeval('l') :py3 f=vim.bindeval('function("strlen")') @@ -51,6 +51,9 @@ EOF : $put =string(key) . ' : ' . string(Val) : unlet key Val :endfor +:py3 del dk +:py3 del di +:py3 del dv :" :" removing items with del :py3 del l[2] @@ -169,12 +172,12 @@ EOF :unlockvar! l :" :" Function calls -:function New(...) -:return ['NewStart']+a:000+['NewEnd'] -:endfunction -:function DictNew(...) dict -:return ['DictNewStart']+a:000+['DictNewEnd', self] -:endfunction +:fun New(...) +: return ['NewStart']+a:000+['NewEnd'] +:endfun +:fun DictNew(...) dict +: return ['DictNewStart']+a:000+['DictNewEnd', self] +:endfun :let l=[function('New'), function('DictNew')] :py3 l=vim.bindeval('l') :py3 l.extend(list(l[0](1, 2, 3))) @@ -204,7 +207,8 @@ EOF : $put ='[0.0, 0.0]' :endif :let messages=[] -:py3 <<EOF +:delfunction DictNew +py3 <<EOF d=vim.bindeval('{}') m=vim.bindeval('messages') def em(expr, g=globals(), l=locals()): @@ -213,15 +217,17 @@ def em(expr, g=globals(), l=locals()): except Exception as e: m.extend([e.__class__.__name__]) -em('d["abc"]') -em('d["abc"]="\\0"') -em('d["abc"]=vim') +em('d["abc1"]') +em('d["abc1"]="\\0"') +em('d["abc1"]=vim') em('d[""]=1') em('d["a\\0b"]=1') em('d[b"a\\0b"]=1') -em('d.pop("abc")') +em('d.pop("abc1")') em('d.popitem()') +del em +del m EOF :$put =messages :unlet messages @@ -233,8 +239,8 @@ EOF : let toput=s.' : '.join(map(['locked', 'scope'], 'v:val.":".py3eval(name.".".v:val)'), ';') : $put =toput :endfor -:silent! let d.abc=1 -:silent! let dl.abc=1 +:silent! let d.abc2=1 +:silent! let dl.abc3=1 :py3 d.locked=True :py3 dl.locked=False :silent! let d.def=1 @@ -300,12 +306,15 @@ class T(threading.Thread): time.sleep(0.1) t = T() +del T t.start() EOF :sleep 1 :py3 t.running = False :py3 t.join() :py3 l[0] = t.t > 8 # check if the background thread is working +:py3 del time +:py3 del threading :$put =string(l) :" :" settrace @@ -326,12 +335,14 @@ def trace_main(): EOF :py3 sys.settrace(traceit) :py3 trace_main() +:py3 del traceit +:py3 del trace_main :py3 sys.settrace(None) :$put =string(l) :" :" Vars :let g:foo = 'bac' -:let w:abc = 'def' +:let w:abc3 = 'def' :let b:baz = 'bar' :let t:bar = 'jkl' :try @@ -340,7 +351,7 @@ EOF : put =py3eval('vim.vvars[''exception'']') :endtry :put =py3eval('vim.vars[''foo'']') -:put =py3eval('vim.current.window.vars[''abc'']') +:put =py3eval('vim.current.window.vars[''abc3'']') :put =py3eval('vim.current.buffer.vars[''baz'']') :put =py3eval('vim.current.tabpage.vars[''bar'']') :" @@ -388,16 +399,16 @@ def ev(s, g=globals(), l=locals()): vim.command('let exc=' + repr(e.__class__.__name__)) return 0 EOF -:function E(s) +:fun E(s) : python3 e(vim.eval('a:s')) -:endfunction -:function Ev(s) +:endfun +:fun Ev(s) : let r=py3eval('ev(vim.eval("a:s"))') : if exists('exc') : throw exc : endif : return r -:endfunction +:endfun :py3 gopts1=vim.options :py3 wopts1=vim.windows[2].options :py3 wopts2=vim.windows[0].options @@ -412,7 +423,7 @@ EOF :let lst+=[['operatorfunc', 'A', 'B', 'C', 2, 0, 1, 0 ]] :let lst+=[['number', 0, 1, 1, 0, 1, 0, 1 ]] :let lst+=[['numberwidth', 2, 3, 5, -100, 0, 0, 1 ]] -:let lst+=[['colorcolumn', '+1', '+2', '+3', 'abc', 0, 0, 1 ]] +:let lst+=[['colorcolumn', '+1', '+2', '+3', 'abc4', 0, 0, 1 ]] :let lst+=[['statusline', '1', '2', '4', 0, 0, 1, 1 ]] :let lst+=[['autoindent', 0, 1, 1, 2, 1, 0, 2 ]] :let lst+=[['shiftwidth', 0, 2, 1, 3, 0, 0, 2 ]] @@ -462,10 +473,27 @@ EOF : endfor : call RecVars(oname) :endfor +:delfunction RecVars +:delfunction E +:delfunction Ev +:py3 del ev +:py3 del e :only :for buf in g:bufs[1:] : execute 'bwipeout!' buf :endfor +:py3 del gopts1 +:py3 del wopts1 +:py3 del wopts2 +:py3 del wopts3 +:py3 del bopts1 +:py3 del bopts2 +:py3 del bopts3 +:py3 del oval1 +:py3 del oval2 +:py3 del oval3 +:py3 del oname +:py3 del invval :" :" Test buffer object :vnew @@ -485,7 +513,7 @@ cb = vim.current.buffer # Tests BufferAppend and BufferItem cb.append(b[0]) # Tests BufferSlice and BufferAssSlice -cb.append('abc') # Will be overwritten +cb.append('abc5') # Will be overwritten cb[-1:] = b[:-2] # Test BufferLength and BufferAssSlice cb.append('def') # Will not be overwritten @@ -509,13 +537,14 @@ b.name = 'bar' cb.append(b.name[-11:].replace(os.path.sep, '/')) cb.name = old_name cb.append(cb.name[-17:].replace(os.path.sep, '/')) +del old_name # Test CheckBuffer for _b in vim.buffers: if _b is not cb: vim.command('bwipeout! ' + str(_b.number)) del _b cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid))) -for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'): +for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc6")'): try: exec(expr) except vim.error: @@ -525,6 +554,7 @@ for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'): # Should not happen in any case cb.append('No exception for ' + expr) vim.command('cd .') +del b EOF :" :" Test vim.buffers object @@ -558,6 +588,7 @@ for b in vim.buffers: # Check indexing: vim.buffers[number].number == number cb.append(str(b.number) + ':' + repr(vim.buffers[b.number]) + '=' + repr(b)) prevnum = b.number +del prevnum cb.append(str(len(vim.buffers))) @@ -581,6 +612,8 @@ try: next(i4) except StopIteration: cb.append('StopIteration') +del i4 +del bnums EOF :" :" Test vim.{tabpage,window}list and vim.{tabpage,window} objects @@ -622,7 +655,11 @@ for t in vim.tabpages: raise ValueError except Exception as e: cb.append('!!!!!! Error while getting attribute ' + attr + ': ' + e.__class__.__name__) + del aval + del attr w.cursor = (len(w.buffer), 0) +del W +del Cursor cb.append('Number of windows in current tab page: ' + str(len(vim.windows))) if list(vim.windows) != list(vim.current.tabpage.windows): cb.append('!!!!!! Windows differ') @@ -635,6 +672,7 @@ def H(o): cb.append('Current tab page: ' + repr(vim.current.tabpage)) cb.append('Current window: ' + repr(vim.current.window) + ': ' + H(vim.current.window) + ' is ' + H(vim.current.tabpage.window)) cb.append('Current buffer: ' + repr(vim.current.buffer) + ': ' + H(vim.current.buffer) + ' is ' + H(vim.current.window.buffer)+ ' is ' + H(vim.current.tabpage.window.buffer)) +del H # Assigning: fails try: vim.current.window = vim.tabpages[0].window @@ -646,6 +684,7 @@ for attr in ('window', 'tabpage', 'buffer'): setattr(vim.current, attr, None) except TypeError: cb.append('Type error at assigning None to vim.current.' + attr) +del attr # Assigning: success vim.current.tabpage = vim.tabpages[-2] @@ -661,8 +700,13 @@ ts = list(vim.tabpages) for b in vim.buffers: if b is not cb: vim.command('bwipeout! ' + str(b.number)) +del b cb.append('w.valid: ' + repr([w.valid for w in ws])) cb.append('t.valid: ' + repr([t.valid for t in ts])) +del w +del t +del ts +del ws EOF :tabonly! :only! @@ -681,6 +725,8 @@ for expr, attr in ( ('vim.current.tabpage', 'TabPage'), ): cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr))) +del expr +del attr EOF :" :" Test __dir__() method @@ -706,15 +752,15 @@ EOF :$put =string(py3eval('vim.Dictionary(a=1)')) :$put =string(py3eval('vim.Dictionary(((''a'', 1),))')) :$put =string(py3eval('vim.List()')) -:$put =string(py3eval('vim.List(iter(''abc''))')) +:$put =string(py3eval('vim.List(iter(''abc7''))')) :$put =string(py3eval('vim.Function(''tr'')')) :" :" Test stdout/stderr :redir => messages -:py3 sys.stdout.write('abc') ; sys.stdout.write('def') -:py3 sys.stderr.write('abc') ; sys.stderr.write('def') -:py3 sys.stdout.writelines(iter('abc')) -:py3 sys.stderr.writelines(iter('abc')) +:py3 sys.stdout.write('abc8') ; sys.stdout.write('def') +:py3 sys.stderr.write('abc9') ; sys.stderr.write('def') +:py3 sys.stdout.writelines(iter('abcA')) +:py3 sys.stderr.writelines(iter('abcB')) :redir END :$put =string(substitute(messages, '\d\+', '', 'g')) :" Test subclassing @@ -735,7 +781,7 @@ class DupList(vim.List): return [super(DupList, self).__getitem__(idx)] * 2 dl = DupList() -dl2 = DupList(iter('abc')) +dl2 = DupList(iter('abcC')) dl.extend(dl2[0]) class DupFun(vim.Function): @@ -748,6 +794,19 @@ EOF :$put =string(py3eval('dl')) :$put =string(py3eval('dl2')) :$put =string(py3eval('df(2)')) +:$put =string(py3eval('dl') is# py3eval('dl')) +:$put =string(py3eval('dd') is# py3eval('dd')) +:$put =string(py3eval('df')) +:delfunction Put +py3 << EOF +del DupDict +del DupList +del DupFun +del dd +del dl +del dl2 +del df +EOF :" :" Test chdir py3 << EOF @@ -761,6 +820,7 @@ cb.append(vim.eval('@%').replace(os.path.sep, '/')) os.chdir('testdir') cb.append(str(fnamemodify('.', ':p:h:t'))) cb.append(vim.eval('@%')) +del fnamemodify EOF :" :" Test errors @@ -784,11 +844,11 @@ def ee(expr, g=globals(), l=locals()): cb.append(expr + '::' + repr((e.__class__, e))) d = vim.Dictionary() -ned = vim.Dictionary(foo='bar', baz='abc') +ned = vim.Dictionary(foo='bar', baz='abcD') dl = vim.Dictionary(a=1) dl.locked = True l = vim.List() -ll = vim.List('abc') +ll = vim.List('abcE') ll.locked = True f = vim.Function('string') fd = vim.Function('F') @@ -825,11 +885,11 @@ def convertfrompyobject_test(expr, recurse=True): # pydict_to_tv stringtochars_test(expr % '{%s : 1}') if recurse: - convertfrompyobject_test(expr % '{"abc" : %s}', False) + convertfrompyobject_test(expr % '{"abcF" : %s}', False) # pymap_to_tv stringtochars_test(expr % 'Mapping({%s : 1})') if recurse: - convertfrompyobject_test(expr % 'Mapping({"abc" : %s})', False) + convertfrompyobject_test(expr % 'Mapping({"abcG" : %s})', False) # pyseq_to_tv iter_test(expr) return subexpr_test(expr, 'ConvertFromPyObject', ( @@ -872,7 +932,7 @@ class FailingMappingKey(object): raise NotImplementedError def keys(self): - return list("abc") + return list("abcH") class FailingMapping(object): def __getitem__(self): @@ -914,7 +974,7 @@ cb.append("> VimStrwidth") ee('vim.strwidth(1)') cb.append("> Dictionary") cb.append(">> DictionaryConstructor") -ee('vim.Dictionary("abc")') +ee('vim.Dictionary("abcI")') ##! Not checked: py_dict_alloc failure cb.append(">> DictionarySetattr") ee('del d.locked') @@ -929,6 +989,7 @@ ee('d.pop("a")') ee('dl.pop("a")') cb.append(">> DictionaryIterNext") ee('for i in ned: ned["a"] = 1') +del i cb.append(">> DictionaryAssItem") ee('dl["b"] = 1') stringtochars_test('d[%s] = 1') @@ -958,7 +1019,7 @@ cb.append(">> ListAssItem") ee('ll[1] = 2') ee('l[1000] = 3') cb.append(">> ListAssSlice") -ee('ll[1:100] = "abc"') +ee('ll[1:100] = "abcJ"') iter_test('l[:] = %s') convertfrompyobject_test('l[:] = [%s]') cb.append(">> ListConcatInPlace") @@ -989,8 +1050,8 @@ cb.append(">> WindowSetattr") ee('vim.current.window.buffer = 0') ee('vim.current.window.cursor = (100000000, 100000000)') ee('vim.current.window.cursor = True') -ee('vim.current.window.height = "abc"') -ee('vim.current.window.width = "abc"') +ee('vim.current.window.height = "abcK"') +ee('vim.current.window.width = "abcL"') ee('vim.current.window.xxxxxx = True') cb.append("> WinList") cb.append(">> WinListItem") @@ -1000,7 +1061,7 @@ cb.append(">> StringToLine (indirect)") ee('vim.current.buffer[0] = "\\na"') cb.append(">> SetBufferLine (indirect)") ee('vim.current.buffer[0] = True') -cb.append(">> SetBufferLines (indirect)") +cb.append(">> SetBufferLineList (indirect)") ee('vim.current.buffer[:] = True') ee('vim.current.buffer[:] = ["\\na", "bc"]') cb.append(">> InsertBufferLines (indirect)") @@ -1018,7 +1079,7 @@ ee('vim.current.buffer.name = True') ee('vim.current.buffer.xxx = True') cb.append(">> BufferMark") ee('vim.current.buffer.mark(0)') -ee('vim.current.buffer.mark("abc")') +ee('vim.current.buffer.mark("abcM")') ee('vim.current.buffer.mark("!")') cb.append(">> BufferRange") ee('vim.current.buffer.range(1, 2, 3)') @@ -1035,7 +1096,28 @@ ee('vim.current.buffer = True') ee('vim.current.window = True') ee('vim.current.tabpage = True') ee('vim.current.xxx = True') +del d +del ned +del dl +del l +del ll +del f +del fd +del fdel +del subexpr_test +del stringtochars_test +del Mapping +del convertfrompyobject_test +del convertfrompymapping_test +del iter_test +del FailingTrue +del FailingIter +del FailingIterNext +del FailingMapping +del FailingMappingKey +del FailingList EOF +:delfunction F :" :" Test import py3 << EOF @@ -1049,6 +1131,10 @@ import before cb.append(before.dir) import after cb.append(after.dir) +del before +del after +del d +del ddir EOF :" :" Test exceptions @@ -1057,18 +1143,48 @@ EOF :endfun py3 << EOF Exe = vim.bindeval('function("Exe")') -ee('vim.command("throw \'abc\'")') +ee('vim.command("throw \'abcN\'")') ee('Exe("throw \'def\'")') ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")') ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")') ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")') ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")') +del Exe +EOF +:delfunction Exe +:" +:" Cleanup +py3 << EOF +del cb +del ee +del sys +del os +del vim EOF :endfun :" -:call Test() +:fun RunTest() +:let checkrefs = !empty($PYTHONDUMPREFS) +:let start = getline(1, '$') +:for i in range(checkrefs ? 10 : 1) +: if i != 0 +: %d _ +: call setline(1, start) +: endif +: call Test() +: if i == 0 +: let result = getline(1, '$') +: endif +:endfor +:if checkrefs +: %d _ +: call setline(1, result) +:endif +:endfun :" -:delfunc Test +:call RunTest() +:delfunction RunTest +:delfunction Test :call garbagecollect(1) :" :/^start:/,$wq! test.out |