]> git.cworth.org Git - apitrace/commitdiff
Generate more compact switch statements for polymorphic types.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 14 Oct 2011 09:04:55 +0000 (10:04 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 14 Oct 2011 09:04:55 +0000 (10:04 +0100)
specs/stdapi.py
trace.py

index 1b9bf58ad5f5ab0f4b6cb57f5f6f275048e3f628..fa371cf2d8706d8286d88d9d9ee0065f18123eed 100644 (file)
@@ -349,6 +349,22 @@ class Polymorphic(Type):
     def visit(self, visitor, *args, **kwargs):
         return visitor.visit_polymorphic(self, *args, **kwargs)
 
+    def iterswitch(self):
+        cases = [['default']]
+        types = [self.default_type]
+
+        for expr, type in self.switch_types:
+            case = 'case %s' % expr
+            try:
+                i = types.index(type)
+            except ValueError:
+                cases.append([case])
+                types.append(type)
+            else:
+                cases[i].append(case)
+
+        return zip(cases, types)
+
 
 class Visitor:
 
index 2c31c92073ee1db29eca5fc665e2a2ccf4283706..9cc2b0a77a3e746c424d05aae3f84c13af0a0fe1 100644 (file)
--- a/trace.py
+++ b/trace.py
@@ -207,13 +207,11 @@ class DumpImplementer(stdapi.Visitor):
 
     def visit_polymorphic(self, polymorphic, instance):
         print '    switch (%s) {' % polymorphic.switch_expr
-        for expr, type in polymorphic.switch_types:
-            print '    case %s:' % 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 '    default:'
-        self.visit(polymorphic.default_type, instance);
-        print '        break;'
         print '    }'