Commit 2fa17728 authored by Stefan Behnel's avatar Stefan Behnel

simplify JoinedStrNode implementation by moving its substring values into a ListNode

parent d782772e
...@@ -2964,7 +2964,7 @@ class RawCNameExprNode(ExprNode): ...@@ -2964,7 +2964,7 @@ class RawCNameExprNode(ExprNode):
class JoinedStrNode(ExprNode): class JoinedStrNode(ExprNode):
# F-strings # F-strings
# #
# values [UnicodeNode|FormattedValueNode] Substrings of the f-string # values ListNode([UnicodeNode|FormattedValueNode]) Substrings of the f-string
# #
type = py_object_type type = py_object_type
is_temp = True is_temp = True
...@@ -2972,35 +2972,16 @@ class JoinedStrNode(ExprNode): ...@@ -2972,35 +2972,16 @@ class JoinedStrNode(ExprNode):
subexprs = ['values'] subexprs = ['values']
def analyse_types(self, env): def analyse_types(self, env):
values = [v.analyse_types(env).coerce_to_pyobject(env) for v in self.values] self.values = self.values.analyse_expressions(env)
if len(values) == 1:
# this is not uncommon because f-string format specs are parsed into JoinedStrNodes
return values[0]
self.values = values
return self return self
def generate_result_code(self, code): def generate_result_code(self, code):
list_var = Naming.quick_temp_cname code.putln('%s = PyUnicode_Join(%s, %s); %s' % (
num_items = len(self.values)
code.putln('{')
code.putln('PyObject *%s = PyList_New(%s); %s' % (
list_var,
num_items,
code.error_goto_if_null(list_var, self.pos)))
code.put_gotref(list_var)
for i, value in enumerate(self.values):
code.put_incref(value.result(), value.ctype())
code.put_giveref(value.py_result())
code.putln('PyList_SET_ITEM(%s, %s, %s);' % (list_var, i, value.py_result()))
code.putln('%s = PyUnicode_Join(%s, %s); __Pyx_DECREF(%s); %s' % (
self.result(), self.result(),
Naming.empty_unicode, Naming.empty_unicode,
list_var, self.values.py_result(),
list_var, code.error_goto_if_null(self.result(), self.pos)))
code.error_goto_if_null(list_var, self.pos)))
code.put_gotref(self.py_result()) code.put_gotref(self.py_result())
code.putln('}')
class FormattedValueNode(ExprNode): class FormattedValueNode(ExprNode):
......
...@@ -348,6 +348,14 @@ class PostParse(ScopeTrackingTransform): ...@@ -348,6 +348,14 @@ class PostParse(ScopeTrackingTransform):
self.visitchildren(node) self.visitchildren(node)
return node return node
def visit_JoinedStrNode(self, node):
if len(node.values) == 1:
# this is not uncommon because f-string format specs are parsed into JoinedStrNodes
return node.values[0]
node.values = ExprNodes.ListNode(node.pos, args=node.values)
self.visitchildren(node)
return node
def eliminate_rhs_duplicates(expr_list_list, ref_node_sequence): def eliminate_rhs_duplicates(expr_list_list, ref_node_sequence):
"""Replace rhs items by LetRefNodes if they appear more than once. """Replace rhs items by LetRefNodes if they appear more than once.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment