Skip to content

Commit e88d111

Browse files
committed
Fix test_unparse again!
1 parent 7ed73fa commit e88d111

File tree

3 files changed

+32
-7
lines changed

3 files changed

+32
-7
lines changed

Lib/test/test_tstring.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ def test_debug_specifier(self):
207207
t = t"Value: {value=}"
208208
self.assertEqual(t.strings, ("Value: value=", ""))
209209
self.assertEqual(t.interpolations[0].value, value)
210-
self.assertEqual(t.interpolations[0].expression, "value=")
210+
self.assertEqual(t.interpolations[0].expression, "value")
211211
self.assertEqual(t.interpolations[0].conversion, "r")
212212
self.assertEqual(t.interpolations[0].format_spec, "")
213213
self.assertEqual(f(t), "Value: value=42")
@@ -216,7 +216,7 @@ def test_debug_specifier(self):
216216
t = t"Value: {value=:.2f}"
217217
self.assertEqual(t.strings, ("Value: value=", ""))
218218
self.assertEqual(t.interpolations[0].value, value)
219-
self.assertEqual(t.interpolations[0].expression, "value=")
219+
self.assertEqual(t.interpolations[0].expression, "value")
220220
self.assertEqual(t.interpolations[0].conversion, None)
221221
self.assertEqual(t.interpolations[0].format_spec, ".2f")
222222
self.assertEqual(f(t), "Value: value=42.00")
@@ -225,15 +225,15 @@ def test_debug_specifier(self):
225225
t = t"Value: {value=!s}"
226226
self.assertEqual(t.strings, ("Value: value=", ""))
227227
self.assertEqual(t.interpolations[0].value, value)
228-
self.assertEqual(t.interpolations[0].expression, "value=")
228+
self.assertEqual(t.interpolations[0].expression, "value")
229229
self.assertEqual(t.interpolations[0].conversion, "s")
230230
self.assertEqual(t.interpolations[0].format_spec, "")
231231

232232
# Test white space in debug specifier
233233
t = t"Value: {value = }"
234234
self.assertEqual(t.strings, ("Value: value = ", ""))
235235
self.assertEqual(t.interpolations[0].value, value)
236-
self.assertEqual(t.interpolations[0].expression, "value = ")
236+
self.assertEqual(t.interpolations[0].expression, "value")
237237
self.assertEqual(t.interpolations[0].conversion, "r")
238238
self.assertEqual(t.interpolations[0].format_spec, "")
239239
self.assertEqual(f(t), "Value: value = 42")

Lib/test/test_unparse.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -918,7 +918,7 @@ class DirectoryTestCase(ASTTestCase):
918918
run_always_files = {"test_grammar.py", "test_syntax.py", "test_compile.py",
919919
"test_ast.py", "test_asdl_parser.py", "test_fstring.py",
920920
"test_patma.py", "test_type_alias.py", "test_type_params.py",
921-
"test_tokenize.py"}
921+
"test_tokenize.py", "test_tstring.py"}
922922

923923
_files_to_test = None
924924

Parser/action_helpers.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,6 +1475,24 @@ _get_interpolation_conversion(Parser *p, Token *debug, ResultTokenWithMetadata *
14751475
return -1;
14761476
}
14771477

1478+
static PyObject *
1479+
_strip_interpolation_expr(PyObject *exprstr)
1480+
{
1481+
Py_ssize_t len = PyUnicode_GET_LENGTH(exprstr);
1482+
1483+
for (Py_ssize_t i = len - 1; i >= 0; i--) {
1484+
Py_UCS4 c = PyUnicode_READ_CHAR(exprstr, i);
1485+
if (_PyUnicode_IsWhitespace(c) || c == '=') {
1486+
len--;
1487+
}
1488+
else {
1489+
break;
1490+
}
1491+
}
1492+
1493+
return PyUnicode_Substring(exprstr, 0, len);
1494+
}
1495+
14781496
expr_ty _PyPegen_interpolation(Parser *p, expr_ty expression, Token *debug, ResultTokenWithMetadata *conversion,
14791497
ResultTokenWithMetadata *format, Token *closing_brace, int lineno, int col_offset,
14801498
int end_lineno, int end_col_offset, PyArena *arena) {
@@ -1485,7 +1503,8 @@ expr_ty _PyPegen_interpolation(Parser *p, expr_ty expression, Token *debug, Resu
14851503
char buf[1];
14861504
buf[0] = conversion_val;
14871505
convstr = PyUnicode_FromStringAndSize(buf, 1);
1488-
if (convstr == NULL) {
1506+
if (convstr == NULL || _PyArena_AddPyObject(arena, convstr) < 0) {
1507+
Py_XDECREF(convstr);
14891508
return NULL;
14901509
}
14911510
}
@@ -1512,8 +1531,14 @@ expr_ty _PyPegen_interpolation(Parser *p, expr_ty expression, Token *debug, Resu
15121531
}
15131532

15141533
assert(exprstr != NULL);
1534+
PyObject *final_exprstr = _strip_interpolation_expr(exprstr);
1535+
if (!final_exprstr || _PyArena_AddPyObject(arena, final_exprstr) < 0) {
1536+
Py_XDECREF(final_exprstr);
1537+
return NULL;
1538+
}
1539+
15151540
expr_ty interpolation = _PyAST_Interpolation(
1516-
expression, exprstr, convstr, format ? (expr_ty) format->result : NULL,
1541+
expression, final_exprstr, convstr, format ? (expr_ty) format->result : NULL,
15171542
lineno, col_offset, end_lineno,
15181543
end_col_offset, arena
15191544
);

0 commit comments

Comments
 (0)