Commit 91525792 authored by Stefan Behnel's avatar Stefan Behnel

some profiler guided streamlining in compiler output writers

parent f630bc37
...@@ -603,10 +603,16 @@ class CCodeWriter(object): ...@@ -603,10 +603,16 @@ class CCodeWriter(object):
def put(self, code): def put(self, code):
fix_indent = False fix_indent = False
dl = code.count("{") - code.count("}") if "{" in code:
dl = code.count("{")
else:
dl = 0
if "}" in code:
dl -= code.count("}")
if dl < 0: if dl < 0:
self.level += dl self.level += dl
elif dl == 0 and code.startswith('}'): elif dl == 0 and code[0] == "}":
# special cases like "} else {" need a temporary dedent
fix_indent = True fix_indent = True
self.level -= 1 self.level -= 1
if self.bol: if self.bol:
......
...@@ -156,12 +156,13 @@ class Node(object): ...@@ -156,12 +156,13 @@ class Node(object):
self.body.annotate(code) self.body.annotate(code)
def end_pos(self): def end_pos(self):
if not self.child_attrs:
return self.pos
try: try:
return self._end_pos return self._end_pos
except AttributeError: except AttributeError:
pos = self.pos pos = self.pos
if not self.child_attrs:
self._end_pos = pos
return pos
for attr in self.child_attrs: for attr in self.child_attrs:
child = getattr(self, attr) child = getattr(self, attr)
# Sometimes lists, sometimes nodes # Sometimes lists, sometimes nodes
......
...@@ -7,31 +7,32 @@ class StringIOTree(object): ...@@ -7,31 +7,32 @@ class StringIOTree(object):
def __init__(self, stream=None): def __init__(self, stream=None):
self.prepended_children = [] self.prepended_children = []
self.stream = stream # if set to None, it will be constructed on first write if stream is None:
stream = StringIO()
self.stream = stream
self.write = stream.write
def getvalue(self): def getvalue(self):
return ("".join([x.getvalue() for x in self.prepended_children]) + content = [x.getvalue() for x in self.prepended_children]
self.stream.getvalue()) content.append(self.stream.getvalue())
return "".join(content)
def copyto(self, target): def copyto(self, target):
"""Potentially cheaper than getvalue as no string concatenation """Potentially cheaper than getvalue as no string concatenation
needs to happen.""" needs to happen."""
for child in self.prepended_children: for child in self.prepended_children:
child.copyto(target) child.copyto(target)
if self.stream: stream_content = self.stream.getvalue()
target.write(self.stream.getvalue()) if stream_content:
target.write(stream_content)
def write(self, what):
if not self.stream:
self.stream = StringIO()
self.stream.write(what)
def commit(self): def commit(self):
# Save what we have written until now so that the buffer # Save what we have written until now so that the buffer
# itself is empty -- this makes it ready for insertion # itself is empty -- this makes it ready for insertion
if self.stream: if self.stream.tell():
self.prepended_children.append(StringIOTree(self.stream)) self.prepended_children.append(StringIOTree(self.stream))
self.stream = None self.stream = StringIO()
self.write = self.stream.write
def insert(self, iotree): def insert(self, iotree):
""" """
......
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