1.1 --- a/annotate.py Tue Jul 18 00:34:32 2006 +0200
1.2 +++ b/annotate.py Wed Jul 19 00:21:49 2006 +0200
1.3 @@ -25,15 +25,25 @@
1.4 import compiler
1.5
1.6 class Namespace:
1.7 - def __init__(self, parent=None):
1.8 + def __init__(self, local_is_structure=0, parent=None):
1.9 + if local_is_structure:
1.10 + self.local = "structure"
1.11 + else:
1.12 + self.local = "local"
1.13 + self.parent = parent
1.14 self.names = {}
1.15 self.not_local = []
1.16 - self.parent = parent
1.17
1.18 def make_global(self, name):
1.19 if name not in self.not_local:
1.20 self.not_local.append(name)
1.21
1.22 + def find(self, name):
1.23 + if name not in self.not_local:
1.24 + return self.local
1.25 + else:
1.26 + return "global"
1.27 +
1.28 def store(self, name, types):
1.29 if name not in self.not_local:
1.30 self.names[name] = types
1.31 @@ -68,58 +78,100 @@
1.32 node.types.append(type)
1.33 self.count += 1
1.34
1.35 -class Traverser(Visitor):
1.36 +class Annotator(Visitor):
1.37 def __init__(self):
1.38 Visitor.__init__(self)
1.39 self.system = System()
1.40 self.types = None
1.41 self.temp = {}
1.42
1.43 - def traverse(self, node):
1.44 - self.namespace = Namespace()
1.45 - compiler.walk(node, self, self)
1.46 + def process(self, node):
1.47 if hasattr(node, "structure"):
1.48 + self.structure = node.structure
1.49 + has_structure = 1
1.50 + else:
1.51 + self.structure = None
1.52 + has_structure = 0
1.53 +
1.54 + self.namespace = Namespace(self.structure is not None)
1.55 + if has_structure:
1.56 node.structure.namespace = self.namespace
1.57
1.58 + self.visitor = self
1.59 + result = self.dispatch(node)
1.60 +
1.61 + return result
1.62 +
1.63 def default(self, node):
1.64 for attr in ("args", "params"):
1.65 value = getattr(node, attr, None)
1.66 if value is not None:
1.67 - self.dispatches(value)
1.68 + setattr(node, attr, self.dispatches(value))
1.69 for attr in ("expr", "lvalue", "test", "handler", "star", "dstar"):
1.70 value = getattr(node, attr, None)
1.71 if value is not None:
1.72 - self.dispatch(value)
1.73 + setattr(node, attr, self.dispatch(value))
1.74 for attr in ("body", "else_", "finally_", "code"):
1.75 value = getattr(node, attr, None)
1.76 if value is not None:
1.77 - for n in value:
1.78 - self.dispatch(n)
1.79 - print node
1.80 + setattr(node, attr, self.dispatches(value))
1.81 + return node
1.82 +
1.83 + def dispatch(self, node, *args):
1.84 + return Visitor.dispatch(self, node, *args)
1.85
1.86 def visitGlobal(self, global_):
1.87 for name in global_.names:
1.88 self.make_global(name)
1.89 + return global_
1.90
1.91 def visitLoadRef(self, loadref):
1.92 self.types = [loadref.ref]
1.93 + return loadref
1.94
1.95 def visitLoadName(self, loadname):
1.96 - self.types = self.namespace.load(loadname.name)
1.97 + if self.namespace.find(loadname.name) == "structure":
1.98 + return self.dispatch(LoadAttr(expr=LoadRef(ref=self.structure), name=loadname.name))
1.99 + else:
1.100 + self.types = self.namespace.load(loadname, loadname.name)
1.101 + return loadname
1.102
1.103 def visitStoreName(self, storename):
1.104 - self.namespace.store(storename.name, self.types)
1.105 + if self.namespace.find(storename.name) == "structure":
1.106 + return self.dispatch(StoreAttr(lvalue=LoadRef(ref=self.structure), name=storename.name, expr=storename.expr))
1.107 + else:
1.108 + self.namespace.store(storename, storename.name, self.types)
1.109 + return storename
1.110
1.111 def visitLoadTemp(self, loadtemp):
1.112 index = getattr(loadtemp, "index", None)
1.113 self.types = self.temp[index]
1.114 + return loadtemp
1.115
1.116 def visitStoreTemp(self, storetemp):
1.117 index = getattr(storetemp, "index", None)
1.118 self.temp[index] = self.types
1.119 + return storetemp
1.120
1.121 def visitReleaseTemp(self, releasetemp):
1.122 index = getattr(releasetemp, "index", None)
1.123 del self.temp[index]
1.124 + return releasetemp
1.125 +
1.126 + def visitLoadAttr(self, loadattr):
1.127 + self.dispatch(loadattr.expr)
1.128 + types = []
1.129 + for ref in self.types:
1.130 + types += ref.namespace.load(loadattr.name)
1.131 + self.types = types
1.132 + return loadattr
1.133 +
1.134 + def visitStoreAttr(self, storeattr):
1.135 + self.dispatch(storeattr.expr)
1.136 + expr = self.types
1.137 + self.dispatch(storeattr.lvalue)
1.138 + for ref in self.types:
1.139 + ref.namespace.store(storeattr.name, expr)
1.140 + return storeattr
1.141
1.142 # vim: tabstop=4 expandtab shiftwidth=4
3.1 --- a/simplify.py Tue Jul 18 00:34:32 2006 +0200
3.2 +++ b/simplify.py Wed Jul 19 00:21:49 2006 +0200
3.3 @@ -49,6 +49,10 @@
3.4 self.structures = [] # Structures/classes
3.5 self.current_subprograms = [] # Current subprograms being processed.
3.6
3.7 + def process(self, node):
3.8 + self.visitor = self
3.9 + return self.dispatch(node)
3.10 +
3.11 def dispatch_or_none(self, node, *args):
3.12 if node is not None:
3.13 return self.dispatch(node, *args)
4.1 --- a/test.py Tue Jul 18 00:34:32 2006 +0200
4.2 +++ b/test.py Wed Jul 19 00:21:49 2006 +0200
4.3 @@ -1,11 +1,7 @@
4.4 import simplify, compiler, sys
4.5 import annotate
4.6
4.7 -def traverse(n):
4.8 - traverser = annotate.Traverser()
4.9 - traverser.traverse(n)
4.10 - return traverser
4.11 -
4.12 -visitor = simplify.Simplifier()
4.13 +v = simplify.Simplifier()
4.14 +a = annotate.Annotator()
4.15 m = compiler.parseFile(sys.argv[1])
4.16 -v = compiler.walk(m, visitor, visitor)
4.17 +r = v.process(m)