Patch 8.1.0247
Problem:    Python: error message for failing import is incorrect.
Solution:   Adjust how modules are loaded. (Ozaki Kiichi, closes #3162)
Files:      src/if_py_both.h, src/testdir/test86.ok, src/testdir/test87.ok


*** ../vim-8.1.0246/src/if_py_both.h    2018-07-25 22:02:32.231966301 +0200
--- src/if_py_both.h    2018-08-07 19:38:33.041613725 +0200
***************
*** 544,570 ****
  }
  
  #if PY_VERSION_HEX < 0x030700f0
  typedef struct
  {
      PyObject_HEAD
!     PyObject  *module;
  } LoaderObject;
  static PyTypeObject LoaderType;
  
      static void
  LoaderDestructor(LoaderObject *self)
  {
!     Py_DECREF(self->module);
      DESTRUCTOR_FINISH(self);
  }
  
      static PyObject *
  LoaderLoadModule(LoaderObject *self, PyObject *args UNUSED)
  {
!     PyObject  *ret = self->module;
  
!     Py_INCREF(ret);
!     return ret;
  }
  
  static struct PyMethodDef LoaderMethods[] = {
--- 544,600 ----
  }
  
  #if PY_VERSION_HEX < 0x030700f0
+ static PyObject *call_load_module(char *name, int len, PyObject 
*find_module_result);
+ 
  typedef struct
  {
      PyObject_HEAD
!     char      *fullname;
!     PyObject  *result;
  } LoaderObject;
  static PyTypeObject LoaderType;
  
      static void
  LoaderDestructor(LoaderObject *self)
  {
!     vim_free(self->fullname);
!     Py_XDECREF(self->result);
      DESTRUCTOR_FINISH(self);
  }
  
      static PyObject *
  LoaderLoadModule(LoaderObject *self, PyObject *args UNUSED)
  {
!     char      *fullname = self->fullname;
!     PyObject  *result = self->result;
!     PyObject  *module;
  
!     if (!fullname)
!     {
!       module = result ? result : Py_None;
!       Py_INCREF(module);
!       return module;
!     }
! 
!     module = call_load_module(fullname, (int)STRLEN(fullname), result);
! 
!     self->fullname = NULL;
!     self->result = module;
! 
!     vim_free(fullname);
!     Py_DECREF(result);
! 
!     if (!module)
!     {
!       if (PyErr_Occurred())
!           return NULL;
! 
!       Py_INCREF(Py_None);
!       return Py_None;
!     }
! 
!     Py_INCREF(module);
!     return module;
  }
  
  static struct PyMethodDef LoaderMethods[] = {
***************
*** 1252,1258 ****
--- 1282,1292 ----
  
        if (!(find_module_result = PyObject_CallFunction(py_find_module,
                        "s#O", tail, partlen, new_path)))
+       {
+           if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_ImportError))
+               PyErr_Clear();
            return NULL;
+       }
  
        if (!(module = call_load_module(
                        fullname,
***************
*** 1273,1302 ****
  
        Py_DECREF(module);
  
!       module = find_module(fullname, dot + 1, newest_path);
  
        Py_DECREF(newest_path);
  
!       return module;
      }
      else
      {
        if (!(find_module_result = PyObject_CallFunction(py_find_module,
                        "sO", tail, new_path)))
-           return NULL;
- 
-       if (!(module = call_load_module(
-                       fullname,
-                       (int)STRLEN(fullname),
-                       find_module_result)))
        {
!           Py_DECREF(find_module_result);
            return NULL;
        }
  
!       Py_DECREF(find_module_result);
! 
!       return module;
      }
  }
  
--- 1307,1329 ----
  
        Py_DECREF(module);
  
!       find_module_result = find_module(fullname, dot + 1, newest_path);
  
        Py_DECREF(newest_path);
  
!       return find_module_result;
      }
      else
      {
        if (!(find_module_result = PyObject_CallFunction(py_find_module,
                        "sO", tail, new_path)))
        {
!           if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_ImportError))
!               PyErr_Clear();
            return NULL;
        }
  
!       return find_module_result;
      }
  }
  
***************
*** 1304,1310 ****
  FinderFindModule(PyObject *self, PyObject *args)
  {
      char      *fullname;
!     PyObject  *module;
      PyObject  *new_path;
      LoaderObject      *loader;
  
--- 1331,1337 ----
  FinderFindModule(PyObject *self, PyObject *args)
  {
      char      *fullname;
!     PyObject  *result;
      PyObject  *new_path;
      LoaderObject      *loader;
  
***************
*** 1314,1344 ****
      if (!(new_path = Vim_GetPaths(self)))
        return NULL;
  
!     module = find_module(fullname, fullname, new_path);
  
      Py_DECREF(new_path);
  
!     if (!module)
      {
        if (PyErr_Occurred())
!       {
!           if (PyErr_ExceptionMatches(PyExc_ImportError))
!               PyErr_Clear();
!           else
!               return NULL;
!       }
  
        Py_INCREF(Py_None);
        return Py_None;
      }
  
      if (!(loader = PyObject_NEW(LoaderObject, &LoaderType)))
      {
!       Py_DECREF(module);
        return NULL;
      }
  
!     loader->module = module;
  
      return (PyObject *) loader;
  }
--- 1341,1375 ----
      if (!(new_path = Vim_GetPaths(self)))
        return NULL;
  
!     result = find_module(fullname, fullname, new_path);
  
      Py_DECREF(new_path);
  
!     if (!result)
      {
        if (PyErr_Occurred())
!           return NULL;
  
        Py_INCREF(Py_None);
        return Py_None;
      }
  
+     if (!(fullname = (char *)vim_strsave((char_u *)fullname)))
+     {
+       Py_DECREF(result);
+       PyErr_NoMemory();
+       return NULL;
+     }
+ 
      if (!(loader = PyObject_NEW(LoaderObject, &LoaderType)))
      {
!       vim_free(fullname);
!       Py_DECREF(result);
        return NULL;
      }
  
!     loader->fullname = fullname;
!     loader->result = result;
  
      return (PyObject *) loader;
  }
*** ../vim-8.1.0246/src/testdir/test86.ok       2018-06-10 13:55:48.527949068 
+0200
--- src/testdir/test86.ok       2018-08-07 19:38:33.041613725 +0200
***************
*** 701,707 ****
  vim.foreach_rtp(int, 2):TypeError:('foreach_rtp() takes exactly one argument 
(2 given)',)
  > import
  import xxx_no_such_module_xxx:ImportError:('No module named 
xxx_no_such_module_xxx',)
! import failing_import:ImportError:('No module named failing_import',)
  import failing:NotImplementedError:()
  > Options
  >> OptionsItem
--- 701,707 ----
  vim.foreach_rtp(int, 2):TypeError:('foreach_rtp() takes exactly one argument 
(2 given)',)
  > import
  import xxx_no_such_module_xxx:ImportError:('No module named 
xxx_no_such_module_xxx',)
! import failing_import:ImportError:()
  import failing:NotImplementedError:()
  > Options
  >> OptionsItem
*** ../vim-8.1.0246/src/testdir/test87.ok       2018-06-10 13:55:48.527949068 
+0200
--- src/testdir/test87.ok       2018-08-07 19:38:33.045613701 +0200
***************
*** 701,707 ****
  vim.foreach_rtp(int, 2):(<class 'TypeError'>, TypeError('foreach_rtp() takes 
exactly one argument (2 given)',))
  > import
  import xxx_no_such_module_xxx:(<class 'ImportError'>, ImportError('No module 
named xxx_no_such_module_xxx',))
! import failing_import:(<class 'ImportError'>, ImportError('No module named 
failing_import',))
  import failing:(<class 'NotImplementedError'>, NotImplementedError())
  > Options
  >> OptionsItem
--- 701,707 ----
  vim.foreach_rtp(int, 2):(<class 'TypeError'>, TypeError('foreach_rtp() takes 
exactly one argument (2 given)',))
  > import
  import xxx_no_such_module_xxx:(<class 'ImportError'>, ImportError('No module 
named xxx_no_such_module_xxx',))
! import failing_import:(<class 'ImportError'>, ImportError())
  import failing:(<class 'NotImplementedError'>, NotImplementedError())
  > Options
  >> OptionsItem
*** ../vim-8.1.0246/src/version.c       2018-08-07 19:32:48.371651690 +0200
--- src/version.c       2018-08-07 19:41:29.784569837 +0200
***************
*** 796,797 ****
--- 796,799 ----
  {   /* Add new patch number below this line */
+ /**/
+     247,
  /**/

-- 
ARTHUR: Did you say shrubberies?
ROGER:  Yes.  Shrubberies are my trade.  I am a shrubber.  My name is Roger
        the Shrubber.  I arrange, design, and sell shrubberies.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui