Commit db2dd527 authored by Robert Bradshaw's avatar Robert Bradshaw

Cleaner code annotation

parent ff15efef
...@@ -510,6 +510,7 @@ class CCodeWriter(object): ...@@ -510,6 +510,7 @@ class CCodeWriter(object):
self.funcstate = None self.funcstate = None
self.level = 0 self.level = 0
self.call_level = 0
self.bol = 1 self.bol = 1
if create_from is None: if create_from is None:
# Root CCodeWriter # Root CCodeWriter
...@@ -523,6 +524,7 @@ class CCodeWriter(object): ...@@ -523,6 +524,7 @@ class CCodeWriter(object):
if copy_formatting: if copy_formatting:
self.level = create_from.level self.level = create_from.level
self.bol = create_from.bol self.bol = create_from.bol
self.call_level = create_from.call_level
if emit_linenums is None: if emit_linenums is None:
self.emit_linenums = self.globalstate.emit_linenums self.emit_linenums = self.globalstate.emit_linenums
else: else:
......
...@@ -76,13 +76,33 @@ from types import FunctionType ...@@ -76,13 +76,33 @@ from types import FunctionType
def write_func_call(func): def write_func_call(func):
def f(*args, **kwds): def f(*args, **kwds):
if len(args) > 1 and isinstance(args[1], CCodeWriter): if len(args) > 1 and isinstance(args[1], CCodeWriter):
# here we annotate the code with this function call
# but only if new code is generated
node, code = args[:2] node, code = args[:2]
code.putln('/* %s.%s %s */' % (node.__class__.__name__, func.__name__, node.pos[1:])) marker = ' /* %s -> %s.%s %s */' % (
return func(*args, **kwds) ' ' * code.call_level,
node.__class__.__name__,
func.__name__,
node.pos[1:])
pristine = code.buffer.stream.tell()
code.putln(marker)
start = code.buffer.stream.tell()
code.call_level += 4
res = func(*args, **kwds)
code.call_level -= 4
if start == code.buffer.stream.tell():
code.buffer.stream.seek(pristine)
else:
marker = marker.replace('->', '<-')
code.putln(marker)
return res
else:
return func(*args, **kwds)
return f return f
class VerboseCodeWriter(type): class VerboseCodeWriter(type):
# Set this as a metaclass to trace function calls in code. # Set this as a metaclass to trace function calls in code.
# This slows down code generation and makes much larger files.
def __new__(cls, name, bases, attrs): def __new__(cls, name, bases, attrs):
attrs = dict(attrs) attrs = dict(attrs)
for mname, m in attrs.items(): for mname, m in attrs.items():
......
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