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)
diff --git a/src/testdir/test_python3.vim b/src/testdir/test_python3.vim
index 830fbba..0885c96 100644
--- a/src/testdir/test_python3.vim
+++ b/src/testdir/test_python3.vim
@@ -4,6 +4,15 @@
 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 @@
   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