2.1 --- a/simplify.py Sun Dec 03 00:51:30 2006 +0100
2.2 +++ b/simplify.py Sun Dec 03 01:25:17 2006 +0100
2.3 @@ -223,9 +223,9 @@
2.4 if not in_sequence:
2.5 expr = LoadTemp()
2.6 else:
2.7 - expr = InvokeFunction(expr=LoadAttr(expr=LoadTemp(), name="next"), star=None, dstar=None, args=[])
2.8 + expr = InvokeFunction(expr=LoadAttr(expr=LoadTemp(), name="next"))
2.9 result = Assign(asslist, 1)
2.10 - store = StoreTemp(expr=InvokeFunction(expr=LoadAttr(name="__iter__", expr=expr), star=None, dstar=None, args=[]))
2.11 + store = StoreTemp(expr=InvokeFunction(expr=LoadAttr(name="__iter__", expr=expr)))
2.12 release = ReleaseTemp()
2.13 result.code = [store] + self.dispatches(asslist.nodes, 1) + [release]
2.14 return result
2.15 @@ -236,7 +236,7 @@
2.16 if not in_sequence:
2.17 return LoadTemp()
2.18 else:
2.19 - return InvokeFunction(expr=LoadAttr(expr=LoadTemp(), name="next"), star=None, dstar=None, args=[])
2.20 + return InvokeFunction(expr=LoadAttr(expr=LoadTemp(), name="next"))
2.21
2.22 def visitAssName(self, assname, in_sequence=0):
2.23 expr = self._visitAssNameOrAttr(assname, in_sequence)
2.24 @@ -650,7 +650,7 @@
2.25 body=[
2.26 Assign(
2.27 code=[
2.28 - StoreTemp(expr=InvokeFunction(expr=LoadAttr(expr=LoadTemp(), name="next"), args=[], star=None, dstar=None)),
2.29 + StoreTemp(expr=InvokeFunction(expr=LoadAttr(expr=LoadTemp(), name="next"))),
2.30 self.dispatch(for_.assign),
2.31 ReleaseTemp()
2.32 ])
2.33 @@ -684,22 +684,26 @@
2.34 # Obtain an iterator for the sequence involved.
2.35 # Then, make an invocation of the subprogram.
2.36
2.37 - result = Assign(for_, 1)
2.38 - result.code = [
2.39 - StoreTemp(
2.40 - expr=InvokeFunction(
2.41 - expr=LoadAttr(
2.42 - name="__iter__",
2.43 - expr=self.dispatch(for_.list)
2.44 - ),
2.45 - args=[],
2.46 - star=None,
2.47 - dstar=None
2.48 - )
2.49 - ),
2.50 - InvokeBlock(expr=LoadRef(ref=subprogram)),
2.51 - ReleaseTemp()
2.52 - ]
2.53 + result = Assign(for_, 1,
2.54 + code=[
2.55 + StoreTemp(
2.56 + expr=InvokeFunction(
2.57 + expr=LoadAttr(
2.58 + name="__iter__",
2.59 + expr=self.dispatch(for_.list)
2.60 + )
2.61 + )
2.62 + ),
2.63 + InvokeBlock(expr=LoadRef(ref=subprogram)),
2.64 + ReleaseTemp()
2.65 + ]
2.66 + )
2.67 +
2.68 + # Make nice annotations for the viewer.
2.69 +
2.70 + for_._iter_call = result.code[0].expr
2.71 + for_._next_call = subprogram.code[0].body[0].code[0].expr
2.72 +
2.73 return result
2.74
2.75 def visitFrom(self, from_):
2.76 @@ -747,14 +751,14 @@
2.77 if has_star:
2.78 star = (
2.79 function.argnames[npositional],
2.80 - InvokeFunction(expr=LoadName(name="list"), args=[], star=None, dstar=None)
2.81 + InvokeFunction(expr=LoadName(name="list"))
2.82 )
2.83 else:
2.84 star = None
2.85 if has_dstar:
2.86 dstar = (
2.87 function.argnames[npositional + has_star],
2.88 - InvokeFunction(expr=LoadName(name="dict"), args=[], star=None, dstar=None)
2.89 + InvokeFunction(expr=LoadName(name="dict"))
2.90 )
2.91 else:
2.92 dstar = None
2.93 @@ -853,9 +857,7 @@
2.94 expr=self.dispatch(compare),
2.95 name="__bool__"
2.96 ),
2.97 - args=[],
2.98 - star=None,
2.99 - dstar=None)
2.100 + )
2.101 )
2.102 test.body = self.dispatch(stmt)
2.103 nodes.append(test)
2.104 @@ -921,9 +923,6 @@
2.105 expr=expr,
2.106 name="__bool__"
2.107 ),
2.108 - args=[],
2.109 - star=None,
2.110 - dstar=None
2.111 )
2.112 if not_ is not None:
2.113 result = Not(not_, 1, expr=invocation)
2.114 @@ -968,7 +967,7 @@
2.115
2.116 if node is not last:
2.117 nodes.append(StoreTemp(expr=expr))
2.118 - invocation = InvokeFunction(expr=LoadAttr(expr=LoadTemp(), name="__bool__"), args=[], star=None, dstar=None)
2.119 + invocation = InvokeFunction(expr=LoadAttr(expr=LoadTemp(), name="__bool__"))
2.120 test = Conditional(test=invocation, body=[ReturnFromBlock(expr=LoadTemp())])
2.121 nodes.append(test)
2.122
2.123 @@ -1328,9 +1327,6 @@
2.124 expr=LoadAttr(
2.125 expr=self.dispatch(while_.test),
2.126 name="__bool__"),
2.127 - args=[],
2.128 - star=None,
2.129 - dstar=None
2.130 ),
2.131 body=self.dispatch(while_.body) + [
2.132 InvokeBlock(
2.133 @@ -1358,6 +1354,11 @@
2.134 result = InvokeBlock(while_, 1,
2.135 expr=LoadRef(ref=subprogram)
2.136 )
2.137 +
2.138 + # Make nice annotations for the viewer.
2.139 +
2.140 + while_._test_call = subprogram.code[0].test
2.141 +
2.142 return result
2.143
2.144 # Convenience methods.
2.145 @@ -1412,8 +1413,16 @@
2.146 self.current_subprograms.pop()
2.147 self.subprograms.append(subprogram); self.subnames[subprogram.full_name()] = subprogram
2.148
2.149 - result = InvokeBlock(produces_result=1)
2.150 - result.expr = LoadRef(ref=subprogram)
2.151 + result = InvokeBlock(
2.152 + produces_result=1,
2.153 + expr=LoadRef(ref=subprogram)
2.154 + )
2.155 +
2.156 + # Make nice annotations for the viewer.
2.157 +
2.158 + binary._left_call = subprogram.code[0].body[0].expr
2.159 + binary._right_call = subprogram.code[0].handler[0].body[0].expr
2.160 +
2.161 return result
2.162
2.163 def _visitBuiltin(self, builtin, name):
2.164 @@ -1421,16 +1430,19 @@
2.165 return result
2.166
2.167 def _visitUnary(self, unary, name):
2.168 - return InvokeFunction(unary, 1,
2.169 + result = InvokeFunction(unary, 1,
2.170 expr=LoadAttr(
2.171 expr=self.dispatch(unary.expr),
2.172 name=name
2.173 - ),
2.174 - args=[],
2.175 - star=None,
2.176 - dstar=None
2.177 + )
2.178 )
2.179
2.180 + # Make nice annotations for the viewer.
2.181 +
2.182 + unary._unary_call = result
2.183 +
2.184 + return result
2.185 +
2.186 # Convenience functions.
2.187
2.188 def simplify(filename, builtins=0):
4.1 --- a/viewer.py Sun Dec 03 00:51:30 2006 +0100
4.2 +++ b/viewer.py Sun Dec 03 01:25:17 2006 +0100
4.3 @@ -27,75 +27,8 @@
4.4 import os
4.5 import textwrap
4.6
4.7 -# Exceptions.
4.8 -
4.9 -class ViewerError(SimplifiedError):
4.10 -
4.11 - "An error in viewing."
4.12 -
4.13 - pass
4.14 -
4.15 # Classes.
4.16
4.17 -class Viewer(ASTVisitor):
4.18 -
4.19 - """
4.20 - A viewing visitor for AST nodes.
4.21 - """
4.22 -
4.23 - def __init__(self, stream):
4.24 - ASTVisitor.__init__(self)
4.25 - self.cached_files = {}
4.26 - self.printed_lines = {}
4.27 - self.visitor = self
4.28 - self.stream = stream
4.29 -
4.30 - def process(self, module):
4.31 - self.dispatch(module)
4.32 -
4.33 - def dispatch(self, node):
4.34 - self.dispatch_only(node)
4.35 - ASTVisitor.dispatch(self, node)
4.36 -
4.37 - def dispatch_only(self, node, every_time=0):
4.38 - self.print_line(getattr(node, "filename", None), getattr(node, "lineno", None), every_time)
4.39 -
4.40 - def print_line(self, filename, lineno, every_time):
4.41 - last_printed = self.printed_lines.get(filename, 0)
4.42 - if lineno > last_printed or every_time:
4.43 - self.stream.write(self.get_line(filename, lineno))
4.44 - self.printed_lines[filename] = lineno
4.45 -
4.46 - def get_line(self, filename, lineno):
4.47 - if filename is None or lineno is None:
4.48 - return ""
4.49 -
4.50 - if self.cached_files.has_key(filename):
4.51 - lines = self.cached_files[filename]
4.52 - else:
4.53 - f = open(filename)
4.54 - try:
4.55 - self.cached_files[filename] = lines = f.readlines()
4.56 - finally:
4.57 - f.close()
4.58 -
4.59 - try:
4.60 - return lines[lineno - 1]
4.61 - except IndexError:
4.62 - return ""
4.63 -
4.64 - def report(self, exc):
4.65 - self.stream.write("Exception was:\n\n" + str(exc.exc) + "\n\n")
4.66 - self.stream.write("Nodes:\n\n")
4.67 - for node in exc.nodes:
4.68 - self.stream.write(repr(node) + "\n")
4.69 - if node is not None and hasattr(node, "original"):
4.70 - self.dispatch_only(node.original, every_time=1)
4.71 - if hasattr(exc.nodes[0], "original"):
4.72 - self.stream.write("\nOriginal node was:\n\n" + repr(exc.nodes[0].original) + "\n")
4.73 - self.stream.write("\nSimplified node was:\n\n")
4.74 - exc.nodes[0].pprint(stream=self.stream)
4.75 -
4.76 # HTML-related output production.
4.77
4.78 html_header = """<?xml version="1.0" encoding="iso-8859-15"?>
4.79 @@ -213,16 +146,6 @@
4.80 self.dispatch(module)
4.81 self.stream.write(html_footer)
4.82
4.83 - def dispatch(self, node):
4.84 - ASTVisitor.dispatch(self, node)
4.85 - #try:
4.86 - # ASTVisitor.dispatch(self, node)
4.87 - #except ViewerError, exc:
4.88 - # exc.add(node)
4.89 - # raise
4.90 - #except Exception, exc:
4.91 - # raise ViewerError(exc, node)
4.92 -
4.93 def visitModule(self, node):
4.94 self.default(node)
4.95
4.96 @@ -304,14 +227,14 @@
4.97 self.stream.write("<span class='iterator'>\n")
4.98 self._keyword("for")
4.99 self._popup_start()
4.100 - self._invocations(node._node.code[1].expr.ref.code[0].body[0].code[0].expr) # Link to next call in subprogram.
4.101 + self._invocations(node._next_call)
4.102 self._popup_end()
4.103 self.stream.write("</span>\n")
4.104 self.dispatch(node.assign)
4.105 self.stream.write("<span class='iterator'>\n")
4.106 self._keyword("in")
4.107 self._popup_start()
4.108 - self._invocations(node._node.code[0].expr) # Link to __iter__ call.
4.109 + self._invocations(node._iter_call)
4.110 self._popup_end()
4.111 self.stream.write("</span>\n")
4.112 self.dispatch(node.list)
4.113 @@ -505,7 +428,7 @@
4.114 self.stream.write("<span class='conditional'>\n")
4.115 self._keyword("while")
4.116 self._popup_start()
4.117 - self._invocations(node._node.expr.ref.code[0].test)
4.118 + self._invocations(node._test_call)
4.119 self._popup_end()
4.120 self.stream.write("</span>\n")
4.121 self.dispatch(node.test)
4.122 @@ -533,8 +456,8 @@
4.123 self.stream.write(symbol)
4.124 self._popup_start()
4.125 self.stream.write("<div class='invocations'>\n")
4.126 - self._invocations_list(node._node.body[0].expr) # NOTE: See visitAdd in simplify.
4.127 - self._invocations_list(node._node.handler[0].body[0].expr) # NOTE: See visitAdd in simplify.
4.128 + self._invocations_list(node._left_call)
4.129 + self._invocations_list(node._right_call)
4.130 self.stream.write("</div>\n")
4.131 self._popup_end()
4.132 self.stream.write("</span>\n")
4.133 @@ -547,7 +470,7 @@
4.134 self.stream.write(symbol)
4.135 self._popup_start()
4.136 self.stream.write("<div class='invocations'>\n")
4.137 - self._invocations_list(node._node) # NOTE: See _visitUnary in simplify.
4.138 + self._invocations_list(node._unary_call)
4.139 self.stream.write("</div>\n")
4.140 self._popup_end()
4.141 self.stream.write("</span>\n")
4.142 @@ -874,14 +797,22 @@
4.143 if node.types:
4.144 self._types_list(node.types)
4.145 else:
4.146 - self.stream.write("<div class='types'>\n")
4.147 - self.stream.write("no types\n")
4.148 - self.stream.write("</div>\n")
4.149 + self._no_types()
4.150 + elif hasattr(node, "writes"):
4.151 + if node.writes:
4.152 + self._types_list(flatten(node.writes.values()))
4.153 + else:
4.154 + self._no_types()
4.155 else:
4.156 self.stream.write("<div class='types'>\n")
4.157 self.stream.write("unvisited\n")
4.158 self.stream.write("</div>\n")
4.159
4.160 + def _no_types(self):
4.161 + self.stream.write("<div class='types'>\n")
4.162 + self.stream.write("no types\n")
4.163 + self.stream.write("</div>\n")
4.164 +
4.165 def _types_list(self, types, style_class="types"):
4.166 self.stream.write("<div class='%s'>\n" % style_class)
4.167 for type in types:
4.168 @@ -922,14 +853,6 @@
4.169
4.170 # Convenience functions.
4.171
4.172 -def view(module, stream=None):
4.173 - viewer = Viewer(stream or sys.stdout)
4.174 - viewer.process(module.original)
4.175 -
4.176 -def report(exc):
4.177 - viewer = Viewer(stream or sys.stdout)
4.178 - viewer.report(exc)
4.179 -
4.180 def browse(module, stream=None):
4.181 browser = Browser(stream or sys.stdout)
4.182 browser.process(module.original)
4.183 @@ -943,13 +866,10 @@
4.184 stream.close()
4.185
4.186 def makedocs(module, builtins):
4.187 - try:
4.188 - dirname = "%s-docs" % module.name
4.189 - if not os.path.exists(dirname):
4.190 - os.mkdir(dirname)
4.191 - makedoc(module, os.path.join(dirname, "%s%shtml" % (module.name, os.path.extsep)))
4.192 - makedoc(builtins, os.path.join(dirname, "%s%shtml" % (builtins.name, os.path.extsep)))
4.193 - except ViewerError, exc:
4.194 - raise
4.195 + dirname = "%s-docs" % module.name
4.196 + if not os.path.exists(dirname):
4.197 + os.mkdir(dirname)
4.198 + makedoc(module, os.path.join(dirname, "%s%shtml" % (module.name, os.path.extsep)))
4.199 + makedoc(builtins, os.path.join(dirname, "%s%shtml" % (builtins.name, os.path.extsep)))
4.200
4.201 # vim: tabstop=4 expandtab shiftwidth=4