python/retrace: Process the trace call-by-call (instead of reading everything into...
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Fri, 22 Aug 2008 00:23:48 +0000 (01:23 +0100)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Fri, 22 Aug 2008 00:23:48 +0000 (01:23 +0100)
src/gallium/state_trackers/python/retrace/interpreter.py
src/gallium/state_trackers/python/retrace/parser.py

index f596a54..a2f924f 100755 (executable)
@@ -22,7 +22,7 @@
 import sys
 import gallium
 import model
-from parser import TraceParser
+import parser
 
 
 def make_image(surface):
@@ -426,9 +426,10 @@ class Context(Object):
             show_image(self.cbufs[0])
     
 
-class Interpreter:
+class Interpreter(parser.TraceParser):
     
-    def __init__(self):
+    def __init__(self, stream):
+        parser.TraceParser.__init__(self, stream)
         self.objects = {}
         self.result = None
         self.globl = Global(self, None)
@@ -447,7 +448,7 @@ class Interpreter:
         for call in trace.calls:
             self.interpret_call(call)
 
-    def interpret_call(self, call):
+    def handle_call(self, call):
         sys.stderr.write("%s\n" % call)
         
         args = [self.interpret_arg(arg) for name, arg in call.args] 
@@ -469,18 +470,5 @@ class Interpreter:
         return translator.visit(node)
     
 
-def main():
-    for arg in sys.argv[1:]:
-        if arg.endswith('.gz'):
-            import gzip
-            stream = gzip.GzipFile(arg, 'rt')
-        else:
-            stream = open(arg, 'rt')
-        parser = TraceParser(stream)
-        trace = parser.parse()
-        interpreter = Interpreter()
-        interpreter.interpret(trace)
-
-
 if __name__ == '__main__':
-    main()
+    parser.main(Interpreter)
index 2ee4d30..6bc75ad 100755 (executable)
@@ -183,12 +183,11 @@ class TraceParser(XmlParser):
 
     def parse(self):
         self.element_start('trace')
-        calls = []
         while self.token.type not in (ELEMENT_END, EOF):
-            calls.append(self.parse_call())
+            call = self.parse_call()
+            self.handle_call(call)
         if self.token.type != EOF:
             self.element_end('trace')
-        return Trace(calls)
 
     def parse_call(self):
         attrs = self.element_start('call')
@@ -319,19 +318,28 @@ class TraceParser(XmlParser):
 
         return Pointer(address)
 
+    def handle_call(self, call):
+        
+        pass
+    
+    
+class TraceDumper(TraceParser):
+    
+
+    def handle_call(self, call):
+        print call
+        
 
-def main():
+def main(ParserFactory):
     for arg in sys.argv[1:]:
         if arg.endswith('.gz'):
             import gzip
             stream = gzip.GzipFile(arg, 'rt')
         else:
             stream = open(arg, 'rt')
-        parser = TraceParser(stream)
-        trace = parser.parse()
-        for call in trace.calls:
-            print call
+        parser = ParserFactory(stream)
+        parser.parse()
 
 
 if __name__ == '__main__':
-    main()
+    main(TraceDumper)