summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Fonseca <jose.r.fonseca@gmail.com>2011-10-14 10:15:02 +0100
committerJosé Fonseca <jose.r.fonseca@gmail.com>2011-10-14 10:15:02 +0100
commitc636b9d7041f5046dd5bdc1b459b06979915dc79 (patch)
tree81eb8e742b50a4734687899f71c9c59cbd819b93
parent461611165f5088edf02c40dc1544dd5b78fa0c24 (diff)
Factor out polymorphic type generated code into functions.
-rw-r--r--trace.py19
1 files changed, 11 insertions, 8 deletions
diff --git a/trace.py b/trace.py
index 9cc2b0a..68cfa2d 100644
--- a/trace.py
+++ b/trace.py
@@ -136,7 +136,16 @@ class DumpDeclarator(stdapi.OnceVisitor):
print
def visit_polymorphic(self, polymorphic):
- pass
+ print 'static void __tracePolymorphic%s(int selector, const %s & value) {' % (polymorphic.id, polymorphic.expr)
+ print ' switch (selector) {'
+ for cases, type in polymorphic.iterswitch():
+ for case in cases:
+ print ' %s:' % case
+ dump_instance(type, 'static_cast<%s>(value)' % (type,))
+ print ' break;'
+ print ' }'
+ print '}'
+ print
class DumpImplementer(stdapi.Visitor):
@@ -206,13 +215,7 @@ class DumpImplementer(stdapi.Visitor):
print ' Trace::localWriter.writeOpaque((const void *)&%s);' % instance
def visit_polymorphic(self, polymorphic, instance):
- print ' switch (%s) {' % polymorphic.switch_expr
- for cases, type in polymorphic.iterswitch():
- for case in cases:
- print ' %s:' % case
- self.visit(type, 'static_cast<%s>(%s)' % (type, instance));
- print ' break;'
- print ' }'
+ print ' __tracePolymorphic%s(%s, %s);' % (polymorphic.id, polymorphic.switch_expr, instance)
dump_instance = DumpImplementer().visit