From 461611165f5088edf02c40dc1544dd5b78fa0c24 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 14 Oct 2011 10:04:55 +0100 Subject: [PATCH] Generate more compact switch statements for polymorphic types. --- specs/stdapi.py | 16 ++++++++++++++++ trace.py | 8 +++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/specs/stdapi.py b/specs/stdapi.py index 1b9bf58..fa371cf 100644 --- a/specs/stdapi.py +++ b/specs/stdapi.py @@ -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: diff --git a/trace.py b/trace.py index 2c31c92..9cc2b0a 100644 --- 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 ' }' -- 2.43.0