Blame SOURCES/0009-Use-codeobject-co_varnames-for-Py-versions-11.patch

rdobuilder 0a9e34
From bf5cb748ffc3d228593a388b2286e35529f059d7 Mon Sep 17 00:00:00 2001
rdobuilder 0a9e34
From: =?UTF-8?q?S=C3=BCmer=20Cip?= <sumer.cip@platform.sh>
rdobuilder 0a9e34
Date: Thu, 18 Aug 2022 15:23:47 +0300
rdobuilder 0a9e34
Subject: [PATCH 09/11] Use codeobject->co_varnames for Py versions < 11
rdobuilder 0a9e34
rdobuilder 0a9e34
---
rdobuilder 0a9e34
 run_tests.py               |  4 +--
rdobuilder 0a9e34
 setup.py                   |  9 +++--
rdobuilder 0a9e34
 tests/test_gevent.py       | 71 ++++++++++++++++++++++++--------------
rdobuilder 0a9e34
 yappi/_yappi.c             |  9 +++--
rdobuilder 0a9e34
 5 files changed, 62 insertions(+), 33 deletions(-)
rdobuilder 0a9e34
rdobuilder 0a9e34
diff --git a/run_tests.py b/run_tests.py
rdobuilder 0a9e34
index e632cbf..df36f74 100644
rdobuilder 0a9e34
--- a/run_tests.py
rdobuilder 0a9e34
+++ b/run_tests.py
rdobuilder 0a9e34
@@ -19,9 +19,9 @@ if __name__ == '__main__':
rdobuilder 0a9e34
         'test_functionality',
rdobuilder 0a9e34
         'test_hooks',
rdobuilder 0a9e34
         'test_tags',
rdobuilder 0a9e34
+        'test_gevent',
rdobuilder 0a9e34
     ]
rdobuilder 0a9e34
-    if sys.version_info < (3, 10):
rdobuilder 0a9e34
-        tests += ['test_gevent']
rdobuilder 0a9e34
+    # TODO: make these auto-skip if cannot be imported
rdobuilder 0a9e34
     if sys.version_info >= (3, 4):
rdobuilder 0a9e34
         tests += ['test_asyncio']
rdobuilder 0a9e34
     if sys.version_info >= (3, 7):
rdobuilder 0a9e34
diff --git a/setup.py b/setup.py
rdobuilder 0a9e34
index 5e4fe66..f241810 100644
rdobuilder 0a9e34
--- a/setup.py
rdobuilder 0a9e34
+++ b/setup.py
rdobuilder 0a9e34
@@ -62,6 +62,11 @@ CLASSIFIERS = [
rdobuilder 0a9e34
     'Topic :: Software Development :: Libraries :: Python Modules',
rdobuilder 0a9e34
 ]
rdobuilder 0a9e34
 
rdobuilder 0a9e34
+test_deps = []
rdobuilder 0a9e34
+if sys.version_info <= (3, 10):
rdobuilder 0a9e34
+    # TODO: fix this when gevent supports 3.11
rdobuilder 0a9e34
+    test_deps += ['gevent>=20.6.2']
rdobuilder 0a9e34
+
rdobuilder 0a9e34
 setup(
rdobuilder 0a9e34
     name=NAME,
rdobuilder 0a9e34
     version=VERSION,
rdobuilder 0a9e34
@@ -91,11 +96,11 @@ setup(
rdobuilder 0a9e34
     description="Yet Another Python Profiler",
rdobuilder 0a9e34
     long_description=long_description,
rdobuilder 0a9e34
     long_description_content_type='text/markdown',
rdobuilder 0a9e34
-    keywords="python thread multithread profiler",
rdobuilder 0a9e34
+    keywords="python thread multithread asyncio gevent profiler",
rdobuilder 0a9e34
     classifiers=CLASSIFIERS,
rdobuilder 0a9e34
     license="MIT",
rdobuilder 0a9e34
     url=HOMEPAGE,
rdobuilder 0a9e34
     extras_require={
rdobuilder 0a9e34
-        'test': ['gevent>=20.6.2'],
rdobuilder 0a9e34
+        'test': test_deps,
rdobuilder 0a9e34
     }
rdobuilder 0a9e34
 )
rdobuilder 0a9e34
diff --git a/tests/test_gevent.py b/tests/test_gevent.py
rdobuilder 0a9e34
index 8569712..0b105a2 100644
rdobuilder 0a9e34
--- a/tests/test_gevent.py
rdobuilder 0a9e34
+++ b/tests/test_gevent.py
rdobuilder 0a9e34
@@ -1,15 +1,21 @@
rdobuilder 0a9e34
 import unittest
rdobuilder 0a9e34
 import _yappi
rdobuilder 0a9e34
 import yappi
rdobuilder 0a9e34
-import gevent
rdobuilder 0a9e34
-from gevent.event import Event
rdobuilder 0a9e34
 import threading
rdobuilder 0a9e34
 from utils import (
rdobuilder 0a9e34
-    YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io,
rdobuilder 0a9e34
-    burn_io_gevent
rdobuilder 0a9e34
+    YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io, burn_io_gevent
rdobuilder 0a9e34
 )
rdobuilder 0a9e34
 
rdobuilder 0a9e34
+GEVENT_AVAIL = True
rdobuilder 0a9e34
+try:
rdobuilder 0a9e34
+    import gevent
rdobuilder 0a9e34
+    from gevent.event import Event
rdobuilder 0a9e34
+except ImportError:
rdobuilder 0a9e34
+    GEVENT_AVAIL = False
rdobuilder 0a9e34
+
rdobuilder 0a9e34
+
rdobuilder 0a9e34
 class GeventTestThread(threading.Thread):
rdobuilder 0a9e34
+
rdobuilder 0a9e34
     def __init__(self, name, *args, **kwargs):
rdobuilder 0a9e34
         super(GeventTestThread, self).__init__(*args, **kwargs)
rdobuilder 0a9e34
         self.name = name
rdobuilder 0a9e34
@@ -19,6 +25,10 @@ class GeventTestThread(threading.Thread):
rdobuilder 0a9e34
         gevent.get_hub().name = "Hub"
rdobuilder 0a9e34
         super(GeventTestThread, self).run()
rdobuilder 0a9e34
 
rdobuilder 0a9e34
+
rdobuilder 0a9e34
+@unittest.skipIf(
rdobuilder 0a9e34
+    not GEVENT_AVAIL, "Gevent is not installed on the target system"
rdobuilder 0a9e34
+)
rdobuilder 0a9e34
 class GeventTest(YappiUnitTestCase):
rdobuilder 0a9e34
 
rdobuilder 0a9e34
     def setUp(self):
rdobuilder 0a9e34
@@ -51,6 +61,7 @@ class GeventTest(YappiUnitTestCase):
rdobuilder 0a9e34
         t.start()
rdobuilder 0a9e34
         return t
rdobuilder 0a9e34
 
rdobuilder 0a9e34
+
rdobuilder 0a9e34
 class TestAPI(GeventTest):
rdobuilder 0a9e34
 
rdobuilder 0a9e34
     def test_start_flags(self):
rdobuilder 0a9e34
@@ -68,7 +79,9 @@ class TestAPI(GeventTest):
rdobuilder 0a9e34
         yappi.stop()
rdobuilder 0a9e34
         yappi.clear_stats()
rdobuilder 0a9e34
 
rdobuilder 0a9e34
-        yappi.start(builtins=True, profile_greenlets=True, profile_threads=False)
rdobuilder 0a9e34
+        yappi.start(
rdobuilder 0a9e34
+            builtins=True, profile_greenlets=True, profile_threads=False
rdobuilder 0a9e34
+        )
rdobuilder 0a9e34
         self.assertEqual(_yappi._get_start_flags()["profile_builtins"], 1)
rdobuilder 0a9e34
         self.assertEqual(_yappi._get_start_flags()["profile_multicontext"], 1)
rdobuilder 0a9e34
         self.assertEqual(len(yappi.get_greenlet_stats()), 1)
rdobuilder 0a9e34
@@ -76,16 +89,21 @@ class TestAPI(GeventTest):
rdobuilder 0a9e34
 
rdobuilder 0a9e34
     def test_context_change_exception(self):
rdobuilder 0a9e34
         yappi.start()
rdobuilder 0a9e34
+
rdobuilder 0a9e34
         def a():
rdobuilder 0a9e34
             pass
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         a()
rdobuilder 0a9e34
         # Setting to same backend should succeed
rdobuilder 0a9e34
         # Changing backend should fail
rdobuilder 0a9e34
-        self.assertRaises(_yappi.error, yappi.set_context_backend, "native_thread")
rdobuilder 0a9e34
+        self.assertRaises(
rdobuilder 0a9e34
+            _yappi.error, yappi.set_context_backend, "native_thread"
rdobuilder 0a9e34
+        )
rdobuilder 0a9e34
         yappi.stop()
rdobuilder 0a9e34
         # Still fail, stats need to be cleared
rdobuilder 0a9e34
-        self.assertRaises(_yappi.error, yappi.set_context_backend, "native_thread")
rdobuilder 0a9e34
+        self.assertRaises(
rdobuilder 0a9e34
+            _yappi.error, yappi.set_context_backend, "native_thread"
rdobuilder 0a9e34
+        )
rdobuilder 0a9e34
         yappi.clear_stats()
rdobuilder 0a9e34
         # Should succeed now
rdobuilder 0a9e34
         yappi.set_context_backend("native_thread")
rdobuilder 0a9e34
@@ -93,6 +111,7 @@ class TestAPI(GeventTest):
rdobuilder 0a9e34
 
rdobuilder 0a9e34
     def test_get_context_stat_exception(self):
rdobuilder 0a9e34
         yappi.start()
rdobuilder 0a9e34
+
rdobuilder 0a9e34
         def a():
rdobuilder 0a9e34
             pass
rdobuilder 0a9e34
 
rdobuilder 0a9e34
@@ -106,6 +125,7 @@ class TestAPI(GeventTest):
rdobuilder 0a9e34
         yappi.set_context_backend("native_thread")
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         class ThreadA(threading.Thread):
rdobuilder 0a9e34
+
rdobuilder 0a9e34
             def run(self):
rdobuilder 0a9e34
                 burn_cpu(0.05)
rdobuilder 0a9e34
 
rdobuilder 0a9e34
@@ -127,7 +147,9 @@ class TestAPI(GeventTest):
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         tstats = yappi.get_thread_stats()
rdobuilder 0a9e34
 
rdobuilder 0a9e34
-        self.assertEqual(len(tstats), 2, "Incorrect number of contexts captured")
rdobuilder 0a9e34
+        self.assertEqual(
rdobuilder 0a9e34
+            len(tstats), 2, "Incorrect number of contexts captured"
rdobuilder 0a9e34
+        )
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         # First stat should be of threadA since it is sorted by ttot
rdobuilder 0a9e34
         statsA = tstats[0]
rdobuilder 0a9e34
@@ -139,6 +161,7 @@ class TestAPI(GeventTest):
rdobuilder 0a9e34
         self.assertEqual(statsMain.tid, main_thread.ident)
rdobuilder 0a9e34
         self.assertEqual(statsMain.name, main_thread.__class__.__name__)
rdobuilder 0a9e34
 
rdobuilder 0a9e34
+
rdobuilder 0a9e34
 class SingleThreadTests(GeventTest):
rdobuilder 0a9e34
 
rdobuilder 0a9e34
     def test_recursive_greenlet(self):
rdobuilder 0a9e34
@@ -148,14 +171,14 @@ class SingleThreadTests(GeventTest):
rdobuilder 0a9e34
                 return
rdobuilder 0a9e34
             burn_io_gevent(0.1)
rdobuilder 0a9e34
             burn_cpu(0.1)
rdobuilder 0a9e34
-            g1 = self.spawn_greenlet("a_%d" % (n-1), a, n - 1)
rdobuilder 0a9e34
+            g1 = self.spawn_greenlet("a_%d" % (n - 1), a, n - 1)
rdobuilder 0a9e34
             g1.get()
rdobuilder 0a9e34
-            g2 = self.spawn_greenlet("a_%d" % (n-2), a, n - 2)
rdobuilder 0a9e34
+            g2 = self.spawn_greenlet("a_%d" % (n - 2), a, n - 2)
rdobuilder 0a9e34
             g2.get()
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         yappi.start()
rdobuilder 0a9e34
         g = self.spawn_greenlet("a", a, 3)
rdobuilder 0a9e34
-        g.get() # run until complete, report exception (if any)
rdobuilder 0a9e34
+        g.get()  # run until complete, report exception (if any)
rdobuilder 0a9e34
         yappi.stop()
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         r1 = '''
rdobuilder 0a9e34
@@ -239,6 +262,7 @@ class SingleThreadTests(GeventTest):
rdobuilder 0a9e34
         self.assert_ctx_stats_almost_equal(r2, gstats)
rdobuilder 0a9e34
 
rdobuilder 0a9e34
     def test_recursive_function(self):
rdobuilder 0a9e34
+
rdobuilder 0a9e34
         def a(n):
rdobuilder 0a9e34
             if (n <= 0):
rdobuilder 0a9e34
                 return
rdobuilder 0a9e34
@@ -280,6 +304,7 @@ class SingleThreadTests(GeventTest):
rdobuilder 0a9e34
         self.assert_ctx_stats_almost_equal(r2, gstats)
rdobuilder 0a9e34
 
rdobuilder 0a9e34
     def test_exception_raised(self):
rdobuilder 0a9e34
+
rdobuilder 0a9e34
         def a(n):
rdobuilder 0a9e34
             burn_cpu(0.1)
rdobuilder 0a9e34
             burn_io_gevent(0.1)
rdobuilder 0a9e34
@@ -287,7 +312,7 @@ class SingleThreadTests(GeventTest):
rdobuilder 0a9e34
             if (n == 0):
rdobuilder 0a9e34
                 raise Exception
rdobuilder 0a9e34
 
rdobuilder 0a9e34
-            a(n-1)
rdobuilder 0a9e34
+            a(n - 1)
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         yappi.set_clock_type("cpu")
rdobuilder 0a9e34
         yappi.start()
rdobuilder 0a9e34
@@ -325,7 +350,6 @@ class SingleThreadTests(GeventTest):
rdobuilder 0a9e34
             burn_cpu(0.1)
rdobuilder 0a9e34
             burn_io_gevent(0.1)
rdobuilder 0a9e34
 
rdobuilder 0a9e34
-
rdobuilder 0a9e34
         ev1 = Event()
rdobuilder 0a9e34
         ev2 = Event()
rdobuilder 0a9e34
         gl = self.spawn_greenlet("a", a, ev1, ev2)
rdobuilder 0a9e34
@@ -353,7 +377,6 @@ class SingleThreadTests(GeventTest):
rdobuilder 0a9e34
         '''
rdobuilder 0a9e34
         self.assert_ctx_stats_almost_equal(r2, gstats)
rdobuilder 0a9e34
 
rdobuilder 0a9e34
-
rdobuilder 0a9e34
     def test_many_context_switches(self):
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         def common():
rdobuilder 0a9e34
@@ -455,15 +478,14 @@ class MultiThreadTests(GeventTest):
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         def driver():
rdobuilder 0a9e34
             to_run = [
rdobuilder 0a9e34
-                (a, ()),
rdobuilder 0a9e34
-                (b, ()),
rdobuilder 0a9e34
-                (recursive_a, (5,)),
rdobuilder 0a9e34
-                (recursive_a, (5,))
rdobuilder 0a9e34
+                (a, ()), (b, ()), (recursive_a, (5, )), (recursive_a, (5, ))
rdobuilder 0a9e34
             ]
rdobuilder 0a9e34
 
rdobuilder 0a9e34
             ts = []
rdobuilder 0a9e34
             for idx, (func, args) in enumerate(to_run):
rdobuilder 0a9e34
-                t = self.spawn_thread("%s-%d" %  (func.__name__, idx), func, *args)
rdobuilder 0a9e34
+                t = self.spawn_thread(
rdobuilder 0a9e34
+                    "%s-%d" % (func.__name__, idx), func, *args
rdobuilder 0a9e34
+                )
rdobuilder 0a9e34
                 ts.append(t)
rdobuilder 0a9e34
 
rdobuilder 0a9e34
             for t in ts:
rdobuilder 0a9e34
@@ -520,14 +542,13 @@ class MultiThreadTests(GeventTest):
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         def driver():
rdobuilder 0a9e34
 
rdobuilder 0a9e34
-            to_run = [
rdobuilder 0a9e34
-                (recursive_a, (5,)),
rdobuilder 0a9e34
-                (recursive_a, (5,))
rdobuilder 0a9e34
-            ]
rdobuilder 0a9e34
+            to_run = [(recursive_a, (5, )), (recursive_a, (5, ))]
rdobuilder 0a9e34
 
rdobuilder 0a9e34
             ts = []
rdobuilder 0a9e34
             for idx, (func, args) in enumerate(to_run):
rdobuilder 0a9e34
-                t = self.spawn_thread("%s_%d" % (func.__name__, idx), func, *args)
rdobuilder 0a9e34
+                t = self.spawn_thread(
rdobuilder 0a9e34
+                    "%s_%d" % (func.__name__, idx), func, *args
rdobuilder 0a9e34
+                )
rdobuilder 0a9e34
                 ts.append(t)
rdobuilder 0a9e34
 
rdobuilder 0a9e34
             recursive_a(6)
rdobuilder 0a9e34
@@ -558,7 +579,6 @@ class MultiThreadTests(GeventTest):
rdobuilder 0a9e34
         # Set context backend to confgiure default callbacks
rdobuilder 0a9e34
         yappi.set_context_backend("greenlet")
rdobuilder 0a9e34
 
rdobuilder 0a9e34
-
rdobuilder 0a9e34
         class GreenletA(gevent.Greenlet):
rdobuilder 0a9e34
             pass
rdobuilder 0a9e34
 
rdobuilder 0a9e34
@@ -598,5 +618,6 @@ class MultiThreadTests(GeventTest):
rdobuilder 0a9e34
         '''
rdobuilder 0a9e34
         self.assert_ctx_stats_almost_equal(r2, gstats)
rdobuilder 0a9e34
 
rdobuilder 0a9e34
+
rdobuilder 0a9e34
 if __name__ == '__main__':
rdobuilder 0a9e34
     unittest.main()
rdobuilder 0a9e34
diff --git a/yappi/_yappi.c b/yappi/_yappi.c
rdobuilder 0a9e34
index 88236ee..41ff517 100644
rdobuilder 0a9e34
--- a/yappi/_yappi.c
rdobuilder 0a9e34
+++ b/yappi/_yappi.c
rdobuilder 0a9e34
@@ -662,6 +662,7 @@ _code2pit(PyFrameObject *fobj, uintptr_t current_tag)
rdobuilder 0a9e34
     PyCodeObject *cobj;
rdobuilder 0a9e34
     _pit *pit;
rdobuilder 0a9e34
     _htab *pits;
rdobuilder 0a9e34
+    PyObject *co_varnames;
rdobuilder 0a9e34
 
rdobuilder 0a9e34
     pits = _get_pits_tbl(current_tag);
rdobuilder 0a9e34
     if (!pits) {
rdobuilder 0a9e34
@@ -690,7 +691,11 @@ _code2pit(PyFrameObject *fobj, uintptr_t current_tag)
rdobuilder 0a9e34
     if (cobj->co_argcount) {
rdobuilder 0a9e34
         // There has been a lot going on with `co_varnames`, but finally in 
rdobuilder 0a9e34
         // 3.11.0rc1, it is added as a public API
rdobuilder 0a9e34
-        PyObject *co_varnames = PyCode_GetVarnames(cobj);
rdobuilder 0a9e34
+#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION == 11
rdobuilder 0a9e34
+        co_varnames = PyCode_GetVarnames(cobj);
rdobuilder 0a9e34
+#else
rdobuilder 0a9e34
+        co_varnames = cobj->co_varnames;
rdobuilder 0a9e34
+#endif
rdobuilder 0a9e34
         const char *firstarg = PyStr_AS_CSTRING(PyTuple_GET_ITEM(co_varnames, 0));
rdobuilder 0a9e34
 
rdobuilder 0a9e34
         if (!strcmp(firstarg, "self")) {
rdobuilder 0a9e34
@@ -1503,8 +1508,6 @@ _start(void)
rdobuilder 0a9e34
         return 0;
rdobuilder 0a9e34
     }
rdobuilder 0a9e34
 
rdobuilder 0a9e34
-    //flags.multicontext = 0;
rdobuilder 0a9e34
-
rdobuilder 0a9e34
     if (flags.multicontext) {
rdobuilder 0a9e34
         _enum_threads(&_bootstrap_thread);
rdobuilder 0a9e34
     } else {
rdobuilder 0a9e34
-- 
rdobuilder 0a9e34
2.34.1
rdobuilder 0a9e34