provide BaseException in Python 2.3/2.4
authorStefan Behnel <scoder@users.berlios.de>
Fri, 18 Mar 2011 14:46:28 +0000 (15:46 +0100)
committerStefan Behnel <scoder@users.berlios.de>
Fri, 18 Mar 2011 14:46:28 +0000 (15:46 +0100)
Cython/Compiler/Code.py
Cython/Compiler/Symtab.py
tests/run/builtinnames.pyx

index 41221cf8833979a76cbb6083d0cd77a278026488..2c34515c2a496d5574aaa6c183f6e0faf9c7fbc6 100644 (file)
@@ -650,17 +650,27 @@ class GlobalState(object):
             if self.should_declare(entry.cname, entry):
                 self.put_pyobject_decl(entry)
                 w = self.parts['cached_builtins']
+                conditional_name = False
                 if entry.name == 'xrange':
                     # replaced by range() in Py3
+                    conditional_name = True
                     w.putln('#if PY_MAJOR_VERSION >= 3')
                     self.put_cached_builtin_init(
                         entry.pos, StringEncoding.EncodedString('range'),
                         entry.cname)
+                elif entry.name == 'BaseException':
+                    # replace BaseException by Exception in Py<2.5
+                    conditional_name = True
+                    w.putln('#if PY_VERSION_HEX < 0x02050000')
+                    self.put_cached_builtin_init(
+                        entry.pos, StringEncoding.EncodedString('Exception'),
+                        entry.cname)
+                if conditional_name:
                     w.putln('#else')
                 self.put_cached_builtin_init(
                     entry.pos, StringEncoding.EncodedString(entry.name),
                     entry.cname)
-                if entry.name == 'xrange':
+                if conditional_name:
                     w.putln('#endif')
 
     def put_cached_builtin_init(self, pos, name, cname):
index 17fc975864bcce199c40cccef12d9c1814eb6282..d5c8dd20e3c4a6c530fdbdb8f6f325d8785b9b1f 100644 (file)
@@ -902,8 +902,8 @@ class ModuleScope(Scope):
         return self.outer_scope.lookup(name, language_level = self.context.language_level)
 
     def declare_builtin(self, name, pos):
-        if not hasattr(builtins, name) and name != 'xrange':
-            # 'xrange' is special cased in Code.py
+        if not hasattr(builtins, name) and name not in ('xrange', 'BaseException'):
+            # 'xrange' and 'BaseException' are special cased in Code.py
             if self.has_import_star:
                 entry = self.declare_var(name, py_object_type, pos)
                 return entry
index 465395829f507ac913e5e833617c2b29fa86ccf2..1d018a55aaeb05e15395ba8c7d2dd13a29d854e4 100644 (file)
@@ -56,3 +56,14 @@ def test_for_in_range(arg):
     for c in range(arg):
         l.append(c)
     return l
+
+def raise_and_catch_BaseException():
+    """
+    >>> raise_and_catch_BaseException()
+    1
+    """
+    try:
+        raise BaseException
+    except BaseException:
+        return 1
+    return 2