https://github.com/python/cpython/commit/8b1edae93a05cc90c5b8c5c935f3753aca938ccf
commit: 8b1edae93a05cc90c5b8c5c935f3753aca938ccf
branch: main
author: Tian Gao <[email protected]>
committer: gaogaotiantian <[email protected]>
date: 2025-03-11T14:04:22-04:00
summary:
gh-122029: Do not unpack method for legacy tracing anymore (#130898)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2025-03-05-21-52-20.gh-issue-122029.d_z93q.rst
M Lib/test/test_sys_setprofile.py
M Python/legacy_tracing.c
diff --git a/Lib/test/test_sys_setprofile.py b/Lib/test/test_sys_setprofile.py
index 0753a9d8b8e0ee..345c022bd2374c 100644
--- a/Lib/test/test_sys_setprofile.py
+++ b/Lib/test/test_sys_setprofile.py
@@ -511,6 +511,27 @@ class B:
]
)
+ # Test CALL_FUNCTION_EX
+ events = []
+ sys.setprofile(lambda frame, event, args: events.append(event))
+ # Not important, we only want to trigger INSTRUMENTED_CALL_KW
+ args = (1,)
+ m = B().f
+ m(*args, key=lambda x: 0)
+ sys.setprofile(None)
+ # The last c_call is the call to sys.setprofile
+ # INSTRUMENTED_CALL_FUNCTION_EX has different behavior than the other
+ # instrumented call bytecodes, it does not unpack the callable before
+ # calling it. This is probably not ideal because it's not consistent,
+ # but at least we get a consistent call stack (no unmatched c_call).
+ self.assertEqual(
+ events,
+ ['call', 'return',
+ 'call', 'return',
+ 'c_call'
+ ]
+ )
+
if __name__ == "__main__":
unittest.main()
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2025-03-05-21-52-20.gh-issue-122029.d_z93q.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2025-03-05-21-52-20.gh-issue-122029.d_z93q.rst
new file mode 100644
index 00000000000000..6324f24d155389
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2025-03-05-21-52-20.gh-issue-122029.d_z93q.rst
@@ -0,0 +1 @@
+:func:`sys.setprofile` and :func:`sys.settrace` will not generate a ``c_call``
event for ``INSTRUMENTED_CALL_FUNCTION_EX`` if the callable is a method with a
C function wrapped, because we do not generate ``c_return`` event in such case.
diff --git a/Python/legacy_tracing.c b/Python/legacy_tracing.c
index 97634f9183c7d5..82465c66ab5231 100644
--- a/Python/legacy_tracing.c
+++ b/Python/legacy_tracing.c
@@ -121,19 +121,6 @@ sys_profile_call_or_return(
Py_DECREF(meth);
return res;
}
- else if (Py_TYPE(callable) == &PyMethod_Type) {
- // CALL instruction will grab the function from the method,
- // so if the function is a C function, the return event will
- // be emitted. However, CALL event happens before CALL
- // instruction, so we need to handle this case here.
- PyObject* func = PyMethod_GET_FUNCTION(callable);
- if (func == NULL) {
- return NULL;
- }
- if (PyCFunction_Check(func)) {
- return call_profile_func(self, func);
- }
- }
Py_RETURN_NONE;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]