diff options
author | Michał Górny <mgorny@gentoo.org> | 2018-07-24 11:29:22 +0200 |
---|---|---|
committer | Michał Górny <mgorny@gentoo.org> | 2018-07-24 14:45:27 +0200 |
commit | a6c2cd5a01ebe894f0a6722909612cf971b99bc0 (patch) | |
tree | 510926e8e35e952ced9e25c0d82cb0e5676d2a49 /dev-python/pygobject/files/pygobject-3.24.1-py37.patch | |
parent | www-client/opera-beta: Old. (diff) | |
download | gentoo-a6c2cd5a01ebe894f0a6722909612cf971b99bc0.tar.gz gentoo-a6c2cd5a01ebe894f0a6722909612cf971b99bc0.tar.bz2 gentoo-a6c2cd5a01ebe894f0a6722909612cf971b99bc0.zip |
dev-python/pygobject: Backport patches for py3.7 support
Closes: https://github.com/gentoo/gentoo/pull/9331
Diffstat (limited to 'dev-python/pygobject/files/pygobject-3.24.1-py37.patch')
-rw-r--r-- | dev-python/pygobject/files/pygobject-3.24.1-py37.patch | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/dev-python/pygobject/files/pygobject-3.24.1-py37.patch b/dev-python/pygobject/files/pygobject-3.24.1-py37.patch new file mode 100644 index 000000000000..31250e3561c8 --- /dev/null +++ b/dev-python/pygobject/files/pygobject-3.24.1-py37.patch @@ -0,0 +1,255 @@ +From c60ef6a2bcc05010a89328d5fc2704d1aa505e2a Mon Sep 17 00:00:00 2001 +From: Christoph Reiter <reiter.christoph@gmail.com> +Date: Sat, 10 Mar 2018 18:04:14 +0100 +Subject: [PATCH 1/4] tests_gi: Use capture_output() context manager instead of + manually mocking stdout + +--- + tests/helper.py | 2 +- + tests/test_gi.py | 14 +++----------- + 2 files changed, 4 insertions(+), 12 deletions(-) + +diff --git a/tests/helper.py b/tests/helper.py +index c4308fee..892cb740 100644 +--- a/tests/helper.py ++++ b/tests/helper.py +@@ -113,7 +113,7 @@ def capture_glib_deprecation_warnings(): + @contextlib.contextmanager + def capture_output(): + """ +- with capture_output as (stdout, stderr): ++ with capture_output() as (stdout, stderr): + some_action() + print(stdout.getvalue(), stderr.getvalue()) + """ +diff --git a/tests/test_gi.py b/tests/test_gi.py +index d0c72b64..3b77ff2d 100644 +--- a/tests/test_gi.py ++++ b/tests/test_gi.py +@@ -13,7 +13,6 @@ import subprocess + import gc + import weakref + import warnings +-from io import StringIO, BytesIO + + import gi + import gi.overrides +@@ -24,7 +23,7 @@ from gi.repository import GObject, GLib, Gio + from gi.repository import GIMarshallingTests + + from compathelper import _bytes, _unicode +-from helper import capture_exceptions ++from helper import capture_exceptions, capture_output + + if sys.version_info < (3, 0): + CONSTANT_UTF8 = "const \xe2\x99\xa5 utf8" +@@ -2836,16 +2835,9 @@ class TestModule(unittest.TestCase): + self.assertTrue(hasattr(item, '__class__')) + + def test_help(self): +- orig_stdout = sys.stdout +- try: +- if sys.version_info < (3, 0): +- sys.stdout = BytesIO() +- else: +- sys.stdout = StringIO() ++ with capture_output() as (stdout, stderr): + help(GIMarshallingTests) +- output = sys.stdout.getvalue() +- finally: +- sys.stdout = orig_stdout ++ output = stdout.getvalue() + + self.assertTrue('SimpleStruct' in output, output) + self.assertTrue('Interface2' in output, output) +-- +2.18.0 + +From 1826e41cd317ba3c19cf8767b1ef8752f1865aac Mon Sep 17 00:00:00 2001 +From: Christoph Reiter <reiter.christoph@gmail.com> +Date: Sat, 10 Mar 2018 18:54:28 +0100 +Subject: [PATCH 2/4] IntrospectionModule: __path__ should be List[str] and not + str + +This fixes a crash when calling help() on the module which got stricter with +Python 3.7. + +It's a bit questionable why the type has __path__ in the first place as +that's only meant for packages. But let's leave that for now. +--- + gi/module.py | 5 +++-- + tests/test_gi.py | 6 ++++-- + 2 files changed, 7 insertions(+), 4 deletions(-) + +diff --git a/gi/module.py b/gi/module.py +index fd8f5080..9e8b5256 100644 +--- a/gi/module.py ++++ b/gi/module.py +@@ -124,10 +124,11 @@ class IntrospectionModule(object): + self._version = version + self.__name__ = 'gi.repository.' + namespace + +- self.__path__ = repository.get_typelib_path(self._namespace) ++ path = repository.get_typelib_path(self._namespace) ++ self.__path__ = [path] + if _have_py3: + # get_typelib_path() delivers bytes, not a string +- self.__path__ = self.__path__.decode('UTF-8') ++ self.__path__ = [path.decode('UTF-8')] + + if self._version is None: + self._version = repository.get_version(self._namespace) +diff --git a/tests/test_gi.py b/tests/test_gi.py +index 3b77ff2d..2fa0423d 100644 +--- a/tests/test_gi.py ++++ b/tests/test_gi.py +@@ -2813,8 +2813,10 @@ class TestKeywords(unittest.TestCase): + + class TestModule(unittest.TestCase): + def test_path(self): +- self.assertTrue(GIMarshallingTests.__path__.endswith('GIMarshallingTests-1.0.typelib'), +- GIMarshallingTests.__path__) ++ path = GIMarshallingTests.__path__ ++ assert isinstance(path, list) ++ assert len(path) == 1 ++ assert path[0].endswith('GIMarshallingTests-1.0.typelib') + + def test_str(self): + self.assertTrue("'GIMarshallingTests' from '" in str(GIMarshallingTests), +-- +2.18.0 + +From 8adc8be0a2ab17e5215a4bc6f63a9ee391237596 Mon Sep 17 00:00:00 2001 +From: Christoph Reiter <reiter.christoph@gmail.com> +Date: Sun, 11 Mar 2018 13:13:30 +0100 +Subject: [PATCH 3/4] _struct_dealloc: handle being called with an error set + +With Python 3.7 it gets called with an error set and tp_dealloc +implementations need to handle that. +Fix by saving and restoring the error. +--- + gi/pygi-struct.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/gi/pygi-struct.c b/gi/pygi-struct.c +index 4d5b5411..e2906e0a 100644 +--- a/gi/pygi-struct.c ++++ b/gi/pygi-struct.c +@@ -61,7 +61,14 @@ out: + static void + _struct_dealloc (PyGIStruct *self) + { +- GIBaseInfo *info = _struct_get_info ( (PyObject *) self ); ++ GIBaseInfo *info; ++ PyObject *error_type, *error_value, *error_traceback; ++ gboolean have_error = !!PyErr_Occurred (); ++ ++ if (have_error) ++ PyErr_Fetch (&error_type, &error_value, &error_traceback); ++ ++ info = _struct_get_info ( (PyObject *) self ); + + if (info != NULL && g_struct_info_is_foreign ( (GIStructInfo *) info)) { + pygi_struct_foreign_release (info, pyg_pointer_get_ptr (self)); +@@ -73,6 +80,9 @@ _struct_dealloc (PyGIStruct *self) + g_base_info_unref (info); + } + ++ if (have_error) ++ PyErr_Restore (error_type, error_value, error_traceback); ++ + Py_TYPE (self)->tp_free ((PyObject *)self); + } + +-- +2.18.0 + +From 2299d46e7a57a74f734844ae28bfd536e89e5254 Mon Sep 17 00:00:00 2001 +From: Christoph Reiter <reiter.christoph@gmail.com> +Date: Sat, 10 Mar 2018 20:03:33 +0100 +Subject: [PATCH 4/4] marshal-cleanup: save and restore exception around + cleanup + +With Python 3.7 some Python API in the cleanup path clears exceptions +which makes us return NULL in the end without an error set. + +Make if safe to call the cleanup functions with an error set by +saving and restoring exceptions. +--- + gi/pygi-marshal-cleanup.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +diff --git a/gi/pygi-marshal-cleanup.c b/gi/pygi-marshal-cleanup.c +index b4d04bc5..0e4eda3f 100644 +--- a/gi/pygi-marshal-cleanup.c ++++ b/gi/pygi-marshal-cleanup.c +@@ -93,6 +93,11 @@ pygi_marshal_cleanup_args_from_py_marshal_success (PyGIInvokeState *state, + PyGICallableCache *cache) + { + gssize i; ++ PyObject *error_type, *error_value, *error_traceback; ++ gboolean have_error = !!PyErr_Occurred (); ++ ++ if (have_error) ++ PyErr_Fetch (&error_type, &error_value, &error_traceback); + + for (i = 0; i < _pygi_callable_cache_args_len (cache); i++) { + PyGIArgCache *arg_cache = _pygi_callable_cache_get_arg (cache, i); +@@ -112,6 +117,9 @@ pygi_marshal_cleanup_args_from_py_marshal_success (PyGIInvokeState *state, + state->args[i].arg_cleanup_data = NULL; + } + } ++ ++ if (have_error) ++ PyErr_Restore (error_type, error_value, error_traceback); + } + + void +@@ -119,6 +127,12 @@ pygi_marshal_cleanup_args_to_py_marshal_success (PyGIInvokeState *state, + PyGICallableCache *cache) + { + GSList *cache_item; ++ PyObject *error_type, *error_value, *error_traceback; ++ gboolean have_error = !!PyErr_Occurred (); ++ ++ if (have_error) ++ PyErr_Fetch (&error_type, &error_value, &error_traceback); ++ + /* clean up the return if available */ + if (cache->return_cache != NULL) { + PyGIMarshalCleanupFunc cleanup_func = cache->return_cache->to_py_cleanup; +@@ -153,6 +167,9 @@ pygi_marshal_cleanup_args_to_py_marshal_success (PyGIInvokeState *state, + + cache_item = cache_item->next; + } ++ ++ if (have_error) ++ PyErr_Restore (error_type, error_value, error_traceback); + } + + void +@@ -161,6 +178,11 @@ pygi_marshal_cleanup_args_from_py_parameter_fail (PyGIInvokeState *state, + gssize failed_arg_index) + { + gssize i; ++ PyObject *error_type, *error_value, *error_traceback; ++ gboolean have_error = !!PyErr_Occurred (); ++ ++ if (have_error) ++ PyErr_Fetch (&error_type, &error_value, &error_traceback); + + state->failed = TRUE; + +@@ -192,6 +214,9 @@ pygi_marshal_cleanup_args_from_py_parameter_fail (PyGIInvokeState *state, + } + state->args[i].arg_cleanup_data = NULL; + } ++ ++ if (have_error) ++ PyErr_Restore (error_type, error_value, error_traceback); + } + + void +-- +2.18.0 + |