Sage compiles.
authorRobert Bradshaw <robertwb@math.washington.edu>
Fri, 8 Aug 2008 08:46:23 +0000 (01:46 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Fri, 8 Aug 2008 08:46:23 +0000 (01:46 -0700)
Cython/Compiler/Nodes.py
Cython/Compiler/Optimize.py
Cython/Compiler/Symtab.py

index a17463a94d6a2766c9d08e540595a6f7a46f0bb1..5d43e81f322c282a42e4f6443a0f1b990396ae19 100644 (file)
@@ -771,7 +771,7 @@ class CEnumDefItemNode(StatNode):
         else:
             value = self.name
         entry = env.declare_const(self.name, enum_entry.type, 
-            value, self.pos, cname = self.cname)
+            value, self.pos, cname = self.cname, visibility = enum_entry.visibility)
         enum_entry.enum_values.append(entry)
 
 
index eb4195a1f443d0caf8500f9d888d25fe4fb248d5..6036a5ade29364a62d1e3c75c6204979dd5c3196 100644 (file)
@@ -22,7 +22,7 @@ class SwitchTransform(Visitor.VisitorTransform):
     """
     This transformation tries to turn long if statements into C switch statements. 
     The requirement is that every clause be an (or of) var == value, where the var
-    is common among all clauses and both var and value are not Python objects. 
+    is common among all clauses and both var and value are ints. 
     """
     def extract_conditions(self, cond):
     
@@ -66,6 +66,8 @@ class SwitchTransform(Visitor.VisitorTransform):
                 return node
             elif common_var is not None and not is_common_value(var, common_var):
                 return node
+            elif not var.type.is_int or sum([not cond.type.is_int for cond in conditions]):
+                return node
             else:
                 common_var = var
                 cases.append(Nodes.SwitchCaseNode(pos = if_clause.pos,
index 69b12d7916356ac2017b0cbab40f09923866c462..062ba696fd12f6313531d71263e6ac77ef06a9bf 100644 (file)
@@ -286,14 +286,14 @@ class Scope:
     def qualify_name(self, name):
         return "%s.%s" % (self.qualified_name, name)
     
-    def declare_const(self, name, type, value, pos, cname = None):
+    def declare_const(self, name, type, value, pos, cname = None, visibility = 'private'):
         # Add an entry for a named constant.
         if not cname:
             if self.in_cinclude:
                 cname = name
             else:
                 cname = self.mangle(Naming.enum_prefix, name)
-        entry = self.declare(name, cname, type, pos, 'private')
+        entry = self.declare(name, cname, type, pos, visibility)
         entry.is_const = 1
         entry.value = value
         return entry