Commit f524e1e8 authored by Stefan Behnel's avatar Stefan Behnel

reduce code overhead for common f-string formatting case without format specifier

parent 0a631b46
...@@ -2994,53 +2994,48 @@ class FormattedValueNode(ExprNode): ...@@ -2994,53 +2994,48 @@ class FormattedValueNode(ExprNode):
conversion_chars = 'sra' conversion_chars = 'sra'
type = py_object_type type = py_object_type
is_temp = True
find_conversion_func = {
's': 'PyObject_Str',
'r': 'PyObject_Repr',
'a': 'PyObject_ASCII', # NOTE: Py3-only!
}.get
def analyse_types(self, env): def analyse_types(self, env):
value = self.value.analyse_types(env) self.value = self.value.analyse_types(env).coerce_to_pyobject(env)
format_spec = self.format_spec.analyse_types(env) self.format_spec = self.format_spec.analyse_types(env).coerce_to_pyobject(env)
self.value = value.coerce_to_pyobject(env)
self.format_spec = format_spec.coerce_to_pyobject(env)
self.is_temp = True
return self return self
def generate_result_code(self, code): def generate_result_code(self, code):
value_result = self.value.py_result() conversion_result = value_result = self.value.py_result()
conversion_result = Naming.quick_temp_cname
format_spec_result = self.format_spec.py_result()
if self.conversion_char == 's':
fn = 'PyObject_Str'
elif self.conversion_char == 'r':
fn = 'PyObject_Repr'
elif self.conversion_char == 'a':
fn = 'PyObject_ASCII'
else:
fn = None
code.putln('{') if self.conversion_char:
fn = self.find_conversion_func(self.conversion_char)
if fn is None:
assert False, "invalid conversion character found: '%s'" % self.conversion_char
if fn is not None: code.putln('{')
conversion_result = Naming.quick_temp_cname
code.putln('PyObject *%s = %s(%s); %s' % ( code.putln('PyObject *%s = %s(%s); %s' % (
conversion_result, conversion_result,
fn, fn,
value_result, value_result,
code.error_goto_if_null(conversion_result, self.pos) code.error_goto_if_null(conversion_result, self.pos)
)) ))
else: code.put_gotref(conversion_result)
code.putln('PyObject *%s = %s;' % (conversion_result, value_result))
#code.put_incref(conversion_result, py_object_type)
# TODO this should need more refcounting, figure out whether this is correct
#code.put_gotref(conversion_result)
#code.put_decref(value_result, self.value.ctype())
decref_line = '' # '__Pyx_DECREF(%s);' % conversion_result
code.putln("%s = PyObject_Format(%s, %s); %s %s" % ( code.put("%s = PyObject_Format(%s, %s); " % (
self.result(), self.result(),
conversion_result, conversion_result,
format_spec_result, self.format_spec.py_result()))
decref_line,
code.error_goto_if_null(self.result(), self.pos))) if self.conversion_char:
code.put_decref(conversion_result, py_object_type)
code.putln('}')
code.putln(code.error_goto_if_null(self.result(), self.pos))
code.put_gotref(self.py_result()) code.put_gotref(self.py_result())
code.putln('}')
#------------------------------------------------------------------- #-------------------------------------------------------------------
......
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