Commit 6524acb7 authored by Jelle Zijlstra's avatar Jelle Zijlstra Committed by Jelle Zijlstra

fstrings: fix more bugs

Not sure about the refcounting
parent 25417282
...@@ -2907,8 +2907,8 @@ class JoinedStrNode(ExprNode): ...@@ -2907,8 +2907,8 @@ class JoinedStrNode(ExprNode):
code.put_giveref(value.py_result()) code.put_giveref(value.py_result())
code.putln('PyList_SET_ITEM(%s, %s, %s);' % (list_var, i, 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' % ( code.putln('%s = PyUnicode_Join(%s, %s); __Pyx_DECREF(%s); %s' % (
self.result(), self.result(),
Naming.empty_unicode, Naming.empty_unicode,
list_var, list_var,
list_var, list_var,
code.error_goto_if_null(list_var, self.pos))) code.error_goto_if_null(list_var, self.pos)))
...@@ -2937,8 +2937,8 @@ class FormattedValueNode(ExprNode): ...@@ -2937,8 +2937,8 @@ class FormattedValueNode(ExprNode):
def generate_result_code(self, code): def generate_result_code(self, code):
value_result = self.value.py_result() value_result = self.value.py_result()
conversion_result = Naming.quick_temp_cname
format_spec_result = self.format_spec.py_result() format_spec_result = self.format_spec.py_result()
# TODO conversion chars
if self.conversion_char == 's': if self.conversion_char == 's':
fn = 'PyObject_Str' fn = 'PyObject_Str'
elif self.conversion_char == 'r': elif self.conversion_char == 'r':
...@@ -2948,25 +2948,31 @@ class FormattedValueNode(ExprNode): ...@@ -2948,25 +2948,31 @@ class FormattedValueNode(ExprNode):
else: else:
fn = None fn = None
code.putln('{')
if fn is not None: if fn is not None:
code.putln('%s = %s(%s); %s' % ( code.putln('PyObject *%s = %s(%s); %s' % (
value_result, conversion_result,
fn, fn,
value_result, value_result,
code.error_goto_if_null(value_result, self.pos) code.error_goto_if_null(conversion_result, self.pos)
)) ))
code.put_gotref(value_result)
decref_line = '__Pyx_DECREF(%s);' % value_result
else: else:
decref_line = '' 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.putln("%s = PyObject_Format(%s, %s); %s %s" % (
self.result(), self.result(),
value_result, conversion_result,
format_spec_result, format_spec_result,
decref_line, decref_line,
code.error_goto_if_null(self.result(), self.pos))) code.error_goto_if_null(self.result(), self.pos)))
code.put_gotref(self.py_result()) code.put_gotref(self.py_result())
code.putln('}')
#------------------------------------------------------------------- #-------------------------------------------------------------------
......
...@@ -998,15 +998,14 @@ def p_f_string(s, unicode_value, pos): ...@@ -998,15 +998,14 @@ def p_f_string(s, unicode_value, pos):
current_literal_start = 0 current_literal_start = 0
while i < size: while i < size:
c = unicode_value[i] c = unicode_value[i]
if c == '}': if c in ('{', '}'):
if i + 1 >= size or unicode_value[i + 1] != '}': if i + 1 < size and unicode_value[i + 1] == c:
s.error("single '}' encountered in format string") encoded_str = EncodedString(unicode_value[current_literal_start:i + 1])
else: values.append(ExprNodes.UnicodeNode(pos, value = encoded_str))
i += 2
elif c == '{':
# double { escapes it
if i + 1 < size and unicode_value[i + 1] == '{':
i += 2 i += 2
current_literal_start = i
elif c == '}':
s.error("single '}' encountered in format string")
else: else:
encoded_str = EncodedString(unicode_value[current_literal_start:i]) encoded_str = EncodedString(unicode_value[current_literal_start:i])
values.append(ExprNodes.UnicodeNode(pos, value = encoded_str)) values.append(ExprNodes.UnicodeNode(pos, value = encoded_str))
...@@ -1018,7 +1017,6 @@ def p_f_string(s, unicode_value, pos): ...@@ -1018,7 +1017,6 @@ def p_f_string(s, unicode_value, pos):
encoded_str = EncodedString(unicode_value[current_literal_start:]) encoded_str = EncodedString(unicode_value[current_literal_start:])
values.append(ExprNodes.UnicodeNode(pos, value = encoded_str)) values.append(ExprNodes.UnicodeNode(pos, value = encoded_str))
print("F-STRING VALUES", values)
return values return values
...@@ -1109,8 +1107,6 @@ def p_f_string_expr(s, unicode_value, pos, starting_index): ...@@ -1109,8 +1107,6 @@ def p_f_string_expr(s, unicode_value, pos, starting_index):
if terminal_char != '}': if terminal_char != '}':
s.error("missing '}' in format string expression'") s.error("missing '}' in format string expression'")
print('expr=%r, conversion_char=%r, format_spec=%r' % (expr_str, conversion_char, format_spec_str))
# parse the expression # parse the expression
name = 'format string expression' name = 'format string expression'
code_source = StringSourceDescriptor(name, expr_str) code_source = StringSourceDescriptor(name, expr_str)
......
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