python/retrace: Process the trace call-by-call (instead of reading everything into memory).

This commit is contained in:
José Fonseca
2008-08-22 01:23:48 +01:00
parent 10624065b0
commit 7f3c3683ce
2 changed files with 23 additions and 27 deletions

View File

@@ -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)

View File

@@ -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 main():
def handle_call(self, call):
print call
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)