mirror of https://github.com/python/cpython
Merge branch 'main' of https://github.com/python/cpython
This commit is contained in:
commit
8cf37f244f
|
@ -1374,6 +1374,18 @@ APIs:
|
|||
* :meth:`!unittest.TestProgram.usageExit` (:gh:`67048`)
|
||||
* :class:`!webbrowser.MacOSX` (:gh:`86421`)
|
||||
* :class:`classmethod` descriptor chaining (:gh:`89519`)
|
||||
* :mod:`importlib.resources` deprecated methods:
|
||||
|
||||
* ``contents()``
|
||||
* ``is_resource()``
|
||||
* ``open_binary()``
|
||||
* ``open_text()``
|
||||
* ``path()``
|
||||
* ``read_binary()``
|
||||
* ``read_text()``
|
||||
|
||||
Use :func:`importlib.resources.files()` instead. Refer to `importlib-resources: Migrating from Legacy
|
||||
<https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy>`_ (:gh:`106531`)
|
||||
|
||||
Pending Removal in Python 3.14
|
||||
------------------------------
|
||||
|
|
36
Lib/pdb.py
36
Lib/pdb.py
|
@ -76,6 +76,7 @@ import bdb
|
|||
import dis
|
||||
import code
|
||||
import glob
|
||||
import token
|
||||
import codeop
|
||||
import pprint
|
||||
import signal
|
||||
|
@ -601,6 +602,39 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
|||
except:
|
||||
self._error_exc()
|
||||
|
||||
def _replace_convenience_variables(self, line):
|
||||
"""Replace the convenience variables in 'line' with their values.
|
||||
e.g. $foo is replaced by __pdb_convenience_variables["foo"].
|
||||
Note: such pattern in string literals will be skipped"""
|
||||
|
||||
if "$" not in line:
|
||||
return line
|
||||
|
||||
dollar_start = dollar_end = -1
|
||||
replace_variables = []
|
||||
try:
|
||||
for t in tokenize.generate_tokens(io.StringIO(line).readline):
|
||||
token_type, token_string, start, end, _ = t
|
||||
if token_type == token.OP and token_string == '$':
|
||||
dollar_start, dollar_end = start, end
|
||||
elif start == dollar_end and token_type == token.NAME:
|
||||
# line is a one-line command so we only care about column
|
||||
replace_variables.append((dollar_start[1], end[1], token_string))
|
||||
except tokenize.TokenError:
|
||||
return line
|
||||
|
||||
if not replace_variables:
|
||||
return line
|
||||
|
||||
last_end = 0
|
||||
line_pieces = []
|
||||
for start, end, name in replace_variables:
|
||||
line_pieces.append(line[last_end:start] + f'__pdb_convenience_variables["{name}"]')
|
||||
last_end = end
|
||||
line_pieces.append(line[last_end:])
|
||||
|
||||
return ''.join(line_pieces)
|
||||
|
||||
def precmd(self, line):
|
||||
"""Handle alias expansion and ';;' separator."""
|
||||
if not line.strip():
|
||||
|
@ -635,7 +669,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
|||
line = line[:marker].rstrip()
|
||||
|
||||
# Replace all the convenience variables
|
||||
line = re.sub(r'\$([a-zA-Z_][a-zA-Z0-9_]*)', r'__pdb_convenience_variables["\1"]', line)
|
||||
line = self._replace_convenience_variables(line)
|
||||
|
||||
return line
|
||||
|
||||
|
|
|
@ -1401,6 +1401,14 @@ class MiscellaneousTestCase(unittest.TestCase):
|
|||
self.assertEqual(filterspec["lc"], 3)
|
||||
self.assertEqual(filterspec["dict_size"], 8 << 20)
|
||||
|
||||
# see gh-104282
|
||||
filters = [lzma.FILTER_X86, lzma.FILTER_POWERPC,
|
||||
lzma.FILTER_IA64, lzma.FILTER_ARM,
|
||||
lzma.FILTER_ARMTHUMB, lzma.FILTER_SPARC]
|
||||
for f in filters:
|
||||
filterspec = lzma._decode_filter_properties(f, b"")
|
||||
self.assertEqual(filterspec, {"id": f})
|
||||
|
||||
def test_filter_properties_roundtrip(self):
|
||||
spec1 = lzma._decode_filter_properties(
|
||||
lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
|
||||
|
|
|
@ -847,9 +847,12 @@ def test_convenience_variables():
|
|||
|
||||
>>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
|
||||
... '$_frame.f_lineno', # Check frame convenience variable
|
||||
... '$ _frame', # This should be a syntax error
|
||||
... '$a = 10', # Set a convenience variable
|
||||
... '$a', # Print its value
|
||||
... 'p "$a"', # Print the string $a
|
||||
... 'p $a + 2', # Do some calculation
|
||||
... 'p f"$a = {$a}"', # Make sure $ in string is not converted and f-string works
|
||||
... 'u', # Switch frame
|
||||
... '$_frame.f_lineno', # Make sure the frame changed
|
||||
... '$a', # Make sure the value persists
|
||||
|
@ -869,11 +872,17 @@ def test_convenience_variables():
|
|||
-> try:
|
||||
(Pdb) $_frame.f_lineno
|
||||
3
|
||||
(Pdb) $ _frame
|
||||
*** SyntaxError: invalid syntax
|
||||
(Pdb) $a = 10
|
||||
(Pdb) $a
|
||||
10
|
||||
(Pdb) p "$a"
|
||||
'$a'
|
||||
(Pdb) p $a + 2
|
||||
12
|
||||
(Pdb) p f"$a = {$a}"
|
||||
'$a = 10'
|
||||
(Pdb) u
|
||||
> <doctest test.test_pdb.test_convenience_variables[1]>(2)test_function()
|
||||
-> util_function()
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
Fix null pointer dereference in :func:`lzma._decode_filter_properties`
|
||||
due to improper handling of BCJ filters with properties of zero length.
|
||||
Patch by Radislav Chugunov.
|
|
@ -0,0 +1 @@
|
|||
Improve handling of pdb convenience variables to avoid replacing string contents.
|
|
@ -492,7 +492,9 @@ build_filter_spec(const lzma_filter *f)
|
|||
case LZMA_FILTER_ARMTHUMB:
|
||||
case LZMA_FILTER_SPARC: {
|
||||
lzma_options_bcj *options = f->options;
|
||||
ADD_FIELD(options, start_offset);
|
||||
if (options) {
|
||||
ADD_FIELD(options, start_offset);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
Loading…
Reference in New Issue