Commit ed02fd9b authored by Stefan Behnel's avatar Stefan Behnel

blacklist for uncachable builtins

parent f3972ce8
...@@ -25,12 +25,19 @@ except ImportError: ...@@ -25,12 +25,19 @@ except ImportError:
non_portable_builtins_map = { non_portable_builtins_map = {
# builtins that have different names in different Python versions
'bytes' : ('PY_MAJOR_VERSION < 3', 'str'), 'bytes' : ('PY_MAJOR_VERSION < 3', 'str'),
'unicode' : ('PY_MAJOR_VERSION >= 3', 'str'), 'unicode' : ('PY_MAJOR_VERSION >= 3', 'str'),
'xrange' : ('PY_MAJOR_VERSION >= 3', 'range'), 'xrange' : ('PY_MAJOR_VERSION >= 3', 'range'),
'BaseException' : ('PY_VERSION_HEX < 0x02050000', 'Exception'), '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): class UtilityCode(object):
# Stores utility code to add during code generation. # Stores utility code to add during code generation.
# #
......
...@@ -916,21 +916,18 @@ class ModuleScope(Scope): ...@@ -916,21 +916,18 @@ class ModuleScope(Scope):
return self.outer_scope.lookup(name, language_level = self.context.language_level) return self.outer_scope.lookup(name, language_level = self.context.language_level)
def declare_builtin(self, name, pos): def declare_builtin(self, name, pos):
if not hasattr(builtins, name) and name not in Code.non_portable_builtins_map: if not hasattr(builtins, name) \
# 'xrange' and 'BaseException' are special cased in Code.py and name not in Code.non_portable_builtins_map \
and name not in Code.uncachable_builtins:
if self.has_import_star: if self.has_import_star:
entry = self.declare_var(name, py_object_type, pos) entry = self.declare_var(name, py_object_type, pos)
return entry return entry
## elif self.outer_scope is not None:
## entry = self.outer_scope.declare_builtin(name, pos)
## print entry
## return entry
else: else:
# unknown - assume it's builtin and look it up at runtime
if Options.error_on_unknown_names: if Options.error_on_unknown_names:
error(pos, "undeclared name not builtin: %s" % name) error(pos, "undeclared name not builtin: %s" % name)
else: else:
warning(pos, "undeclared name not builtin: %s" % name, 2) 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 = self.declare(name, None, py_object_type, pos, 'private')
entry.is_builtin = 1 entry.is_builtin = 1
return entry return entry
...@@ -939,7 +936,7 @@ class ModuleScope(Scope): ...@@ -939,7 +936,7 @@ class ModuleScope(Scope):
if entry.name == name: if entry.name == name:
return entry return entry
entry = self.declare(None, None, py_object_type, pos, 'private') 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_builtin = 1
entry.is_const = 1 # cached entry.is_const = 1 # cached
entry.name = name entry.name = name
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment