mirror of https://github.com/python/cpython
gh-112243: Don't include comments in f-string debug expressions (#112284)
This commit is contained in:
parent
3b3ec0d77f
commit
d59feb5dbe
|
@ -1627,6 +1627,9 @@ x = (
|
|||
self.assertEqual(f'X{x = }Y', 'Xx = '+repr(x)+'Y')
|
||||
self.assertEqual(f"sadsd {1 + 1 = :{1 + 1:1d}f}", "sadsd 1 + 1 = 2.000000")
|
||||
|
||||
self.assertEqual(f"{1+2 = # my comment
|
||||
}", '1+2 = \n 3')
|
||||
|
||||
# These next lines contains tabs. Backslash escapes don't
|
||||
# work in f-strings.
|
||||
# patchcheck doesn't like these tabs. So the only way to test
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Don't include comments in f-string debug expressions. Patch by Pablo Galindo
|
|
@ -116,13 +116,56 @@ set_fstring_expr(struct tok_state* tok, struct token *token, char c) {
|
|||
if (!tok_mode->f_string_debug || token->metadata) {
|
||||
return 0;
|
||||
}
|
||||
PyObject *res = NULL;
|
||||
|
||||
PyObject *res = PyUnicode_DecodeUTF8(
|
||||
tok_mode->last_expr_buffer,
|
||||
tok_mode->last_expr_size - tok_mode->last_expr_end,
|
||||
NULL
|
||||
);
|
||||
if (!res) {
|
||||
// Check if there is a # character in the expression
|
||||
int hash_detected = 0;
|
||||
for (Py_ssize_t i = 0; i < tok_mode->last_expr_size - tok_mode->last_expr_end; i++) {
|
||||
if (tok_mode->last_expr_buffer[i] == '#') {
|
||||
hash_detected = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hash_detected) {
|
||||
Py_ssize_t input_length = tok_mode->last_expr_size - tok_mode->last_expr_end;
|
||||
char *result = (char *)PyObject_Malloc((input_length + 1) * sizeof(char));
|
||||
if (!result) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_ssize_t i = 0;
|
||||
Py_ssize_t j = 0;
|
||||
|
||||
for (i = 0, j = 0; i < input_length; i++) {
|
||||
if (tok_mode->last_expr_buffer[i] == '#') {
|
||||
// Skip characters until newline or end of string
|
||||
while (tok_mode->last_expr_buffer[i] != '\0' && i < input_length) {
|
||||
if (tok_mode->last_expr_buffer[i] == '\n') {
|
||||
result[j++] = tok_mode->last_expr_buffer[i];
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
result[j++] = tok_mode->last_expr_buffer[i];
|
||||
}
|
||||
}
|
||||
|
||||
result[j] = '\0'; // Null-terminate the result string
|
||||
res = PyUnicode_DecodeUTF8(result, j, NULL);
|
||||
PyObject_Free(result);
|
||||
} else {
|
||||
res = PyUnicode_DecodeUTF8(
|
||||
tok_mode->last_expr_buffer,
|
||||
tok_mode->last_expr_size - tok_mode->last_expr_end,
|
||||
NULL
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (!res) {
|
||||
return -1;
|
||||
}
|
||||
token->metadata = res;
|
||||
|
|
Loading…
Reference in New Issue