mirror of
https://github.com/python/cpython.git
synced 2025-11-03 03:22:27 +00:00
bpo-45256: Avoid C calls for most Python to Python calls. (GH-28937)
* Avoid making C calls for most calls to Python functions. * Change initialize_locals(steal=true) and _PyTuple_FromArraySteal to consume the argument references regardless of whether they succeed or fail.
This commit is contained in:
parent
fd03917786
commit
70945d57e7
3 changed files with 128 additions and 180 deletions
|
|
@ -724,24 +724,36 @@ class PyListTests(DebuggerTests):
|
|||
' 3 def foo(a, b, c):\n',
|
||||
bt)
|
||||
|
||||
SAMPLE_WITH_C_CALL = """
|
||||
|
||||
from _testcapi import pyobject_fastcall
|
||||
|
||||
def foo(a, b, c):
|
||||
bar(a, b, c)
|
||||
|
||||
def bar(a, b, c):
|
||||
pyobject_fastcall(baz, (a, b, c))
|
||||
|
||||
def baz(*args):
|
||||
id(42)
|
||||
|
||||
foo(1, 2, 3)
|
||||
|
||||
"""
|
||||
|
||||
|
||||
class StackNavigationTests(DebuggerTests):
|
||||
@unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands")
|
||||
@unittest.skipIf(python_is_optimized(),
|
||||
"Python was compiled with optimizations")
|
||||
def test_pyup_command(self):
|
||||
'Verify that the "py-up" command works'
|
||||
bt = self.get_stack_trace(script=self.get_sample_script(),
|
||||
bt = self.get_stack_trace(source=SAMPLE_WITH_C_CALL,
|
||||
cmds_after_breakpoint=['py-up', 'py-up'])
|
||||
self.assertMultilineMatches(bt,
|
||||
r'''^.*
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 10, in baz \(args=\(1, 2, 3\)\)
|
||||
id\(42\)
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 7, in bar \(a=1, b=2, c=3\)
|
||||
baz\(a, b, c\)
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 4, in foo \(a=1, b=2, c=3\)
|
||||
bar\(a=a, b=b, c=c\)
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 12, in <module> \(\)
|
||||
foo\(1, 2, 3\)
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file <string>, line 12, in baz \(args=\(1, 2, 3\)\)
|
||||
#[0-9]+ <built-in method pyobject_fastcall of module object at remote 0x[0-9a-f]+>
|
||||
$''')
|
||||
|
||||
@unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands")
|
||||
|
|
@ -765,22 +777,13 @@ $''')
|
|||
"Python was compiled with optimizations")
|
||||
def test_up_then_down(self):
|
||||
'Verify "py-up" followed by "py-down"'
|
||||
bt = self.get_stack_trace(script=self.get_sample_script(),
|
||||
bt = self.get_stack_trace(source=SAMPLE_WITH_C_CALL,
|
||||
cmds_after_breakpoint=['py-up', 'py-up', 'py-down'])
|
||||
self.assertMultilineMatches(bt,
|
||||
r'''^.*
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 10, in baz \(args=\(1, 2, 3\)\)
|
||||
id\(42\)
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 7, in bar \(a=1, b=2, c=3\)
|
||||
baz\(a, b, c\)
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 4, in foo \(a=1, b=2, c=3\)
|
||||
bar\(a=a, b=b, c=c\)
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 12, in <module> \(\)
|
||||
foo\(1, 2, 3\)
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 10, in baz \(args=\(1, 2, 3\)\)
|
||||
id\(42\)
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file .*gdb_sample.py, line 7, in bar \(a=1, b=2, c=3\)
|
||||
baz\(a, b, c\)
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file <string>, line 12, in baz \(args=\(1, 2, 3\)\)
|
||||
#[0-9]+ <built-in method pyobject_fastcall of module object at remote 0x[0-9a-f]+>
|
||||
#[0-9]+ Frame 0x-?[0-9a-f]+, for file <string>, line 12, in baz \(args=\(1, 2, 3\)\)
|
||||
$''')
|
||||
|
||||
class PyBtTests(DebuggerTests):
|
||||
|
|
@ -970,13 +973,12 @@ id(42)
|
|||
self.assertRegex(gdb_output,
|
||||
r"<method-wrapper u?'__init__' of MyList object at ")
|
||||
|
||||
|
||||
class PyPrintTests(DebuggerTests):
|
||||
@unittest.skipIf(python_is_optimized(),
|
||||
"Python was compiled with optimizations")
|
||||
def test_basic_command(self):
|
||||
'Verify that the "py-print" command works'
|
||||
bt = self.get_stack_trace(script=self.get_sample_script(),
|
||||
bt = self.get_stack_trace(source=SAMPLE_WITH_C_CALL,
|
||||
cmds_after_breakpoint=['py-up', 'py-print args'])
|
||||
self.assertMultilineMatches(bt,
|
||||
r".*\nlocal 'args' = \(1, 2, 3\)\n.*")
|
||||
|
|
@ -985,7 +987,7 @@ class PyPrintTests(DebuggerTests):
|
|||
"Python was compiled with optimizations")
|
||||
@unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands")
|
||||
def test_print_after_up(self):
|
||||
bt = self.get_stack_trace(script=self.get_sample_script(),
|
||||
bt = self.get_stack_trace(source=SAMPLE_WITH_C_CALL,
|
||||
cmds_after_breakpoint=['py-up', 'py-up', 'py-print c', 'py-print b', 'py-print a'])
|
||||
self.assertMultilineMatches(bt,
|
||||
r".*\nlocal 'c' = 3\nlocal 'b' = 2\nlocal 'a' = 1\n.*")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue