From ed02fd9b6936d10acec48c0a12dc49cbe9cd8da6 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Thu, 21 Apr 2011 07:12:13 +0200 Subject: [PATCH] blacklist for uncachable builtins --- Cython/Compiler/Code.py | 7 +++++++ Cython/Compiler/Symtab.py | 13 +++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Cython/Compiler/Code.py b/Cython/Compiler/Code.py index 5ff695b5..7abbc39f 100644 --- a/Cython/Compiler/Code.py +++ b/Cython/Compiler/Code.py @@ -25,12 +25,19 @@ except ImportError: non_portable_builtins_map = { + # builtins that have different names in different Python versions 'bytes' : ('PY_MAJOR_VERSION < 3', 'str'), 'unicode' : ('PY_MAJOR_VERSION >= 3', 'str'), 'xrange' : ('PY_MAJOR_VERSION >= 3', 'range'), 'BaseException' : ('PY_VERSION_HEX < 0x02050000', 'Exception'), } +uncachable_builtins = [ + # builtin names that cannot be cached because they may or may not + # be available at import time + 'WindowsError', + ] + class UtilityCode(object): # Stores utility code to add during code generation. # diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index 6d6f7e1c..cae9e1ab 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -916,21 +916,18 @@ 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 not in Code.non_portable_builtins_map: - # 'xrange' and 'BaseException' are special cased in Code.py + if not hasattr(builtins, name) \ + and name not in Code.non_portable_builtins_map \ + and name not in Code.uncachable_builtins: if self.has_import_star: entry = self.declare_var(name, py_object_type, pos) return entry - ## elif self.outer_scope is not None: - ## entry = self.outer_scope.declare_builtin(name, pos) - ## print entry - ## return entry else: - # unknown - assume it's builtin and look it up at runtime if Options.error_on_unknown_names: error(pos, "undeclared name not builtin: %s" % name) else: warning(pos, "undeclared name not builtin: %s" % name, 2) + # unknown - assume it's builtin and look it up at runtime entry = self.declare(name, None, py_object_type, pos, 'private') entry.is_builtin = 1 return entry @@ -939,7 +936,7 @@ class ModuleScope(Scope): if entry.name == name: return entry entry = self.declare(None, None, py_object_type, pos, 'private') - if Options.cache_builtins: + if Options.cache_builtins and name not in Code.uncachable_builtins: entry.is_builtin = 1 entry.is_const = 1 # cached entry.name = name -- 2.26.2