diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 14e0bd81f294806092294595eb6a5c9f8db84462..269f1f2fbe07af96b5e10278ae47d4c5ef5a6f54 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -2886,19 +2886,24 @@ class JoinedStrNode(ExprNode): self.values = [v.analyse_types(env) for v in self.values] self.values = [v.coerce_to_pyobject(env) for v in self.values] self.is_temp = 1 + # TODO make this actually work + return self.values[1] if len(self.values) > 1 else self.values[0] return self def generate_result_code(self, code): - # TODO this just returns the first value - code.putln('%s = %s;' % (self.result(), self.values[0].py_result())) + # TODO this just returns the first value and the refnanny doesn't like it + val = self.values[1] if len(self.values) > 1 else self.values[0] + code.putln('%s = %s;' % (self.result(), val.py_result())) + code.putln('__Pyx_INCREF(%s);' % self.result()) + code.put_gotref(self.py_result()) class FormattedValueNode(ExprNode): # {}-delimited portions of an f-string # - # value ExprNode The expression itself - # conversion str or None Type conversion (!s, !r, !a, or none) - # format_spec JoinedStrNode or None Format string passed to __format__ + # value ExprNode The expression itself + # conversion_char str or None Type conversion (!s, !r, !a, or none) + # format_spec JoinedStrNode or None Format string passed to __format__ subexprs = ['value', 'format_spec'] conversion_chars = 'sra' @@ -2916,13 +2921,34 @@ class FormattedValueNode(ExprNode): value_result = self.value.py_result() format_spec_result = self.format_spec.py_result() # TODO conversion chars + 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 + + if fn is not None: + code.putln('%s = %s(%s); %s' % ( + value_result, + fn, + value_result, + code.error_goto_if_null(value_result, self.pos) + )) + code.put_gotref(value_result) + decref_line = '__Pyx_DECREF(%s);' % value_result + else: + decref_line = '' - code.putln("%s = PyObject_Format(%s, %s); %s" % ( + code.putln("%s = PyObject_Format(%s, %s); %s %s" % ( self.result(), value_result, format_spec_result, + decref_line, code.error_goto_if_null(self.result(), self.pos))) - code.put_gotref(self.result()) + code.put_gotref(self.py_result()) #-------------------------------------------------------------------