mirror of
https://github.com/python/cpython
synced 2024-09-15 23:57:10 +00:00
gh-99606: Make code generated for an empty f-string identical to that of a normal empty string (#112407)
This commit is contained in:
parent
418d585feb
commit
fb202af447
|
@ -8,6 +8,7 @@
|
||||||
# Unicode identifiers in tests is allowed by PEP 3131.
|
# Unicode identifiers in tests is allowed by PEP 3131.
|
||||||
|
|
||||||
import ast
|
import ast
|
||||||
|
import dis
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import types
|
import types
|
||||||
|
@ -1738,5 +1739,14 @@ def test_syntax_warning_infinite_recursion_in_file(self):
|
||||||
self.assertIn(rb'\1', stdout)
|
self.assertIn(rb'\1', stdout)
|
||||||
self.assertEqual(len(stderr.strip().splitlines()), 2)
|
self.assertEqual(len(stderr.strip().splitlines()), 2)
|
||||||
|
|
||||||
|
def test_fstring_without_formatting_bytecode(self):
|
||||||
|
# f-string without any formatting should emit the same bytecode
|
||||||
|
# as a normal string. See gh-99606.
|
||||||
|
def get_code(s):
|
||||||
|
return [(i.opname, i.oparg) for i in dis.get_instructions(s)]
|
||||||
|
|
||||||
|
for s in ["", "some string"]:
|
||||||
|
self.assertEqual(get_code(f"'{s}'"), get_code(f"f'{s}'"))
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Make code generated for an empty f-string identical to the code of an empty
|
||||||
|
normal string.
|
|
@ -5042,8 +5042,12 @@ compiler_joined_str(struct compiler *c, expr_ty e)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
VISIT_SEQ(c, expr, e->v.JoinedStr.values);
|
VISIT_SEQ(c, expr, e->v.JoinedStr.values);
|
||||||
if (asdl_seq_LEN(e->v.JoinedStr.values) != 1) {
|
if (value_count > 1) {
|
||||||
ADDOP_I(c, loc, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
|
ADDOP_I(c, loc, BUILD_STRING, value_count);
|
||||||
|
}
|
||||||
|
else if (value_count == 0) {
|
||||||
|
_Py_DECLARE_STR(empty, "");
|
||||||
|
ADDOP_LOAD_CONST_NEW(c, loc, Py_NewRef(&_Py_STR(empty)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
|
|
Loading…
Reference in a new issue