Commit 94292508 authored by Robert Bradshaw's avatar Robert Bradshaw

cache builtins at module level

parent fce655c1
...@@ -1293,7 +1293,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1293,7 +1293,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.put_decref("((PyObject*)%s)" % type.typeptr_cname, PyrexTypes.py_object_type) code.put_decref("((PyObject*)%s)" % type.typeptr_cname, PyrexTypes.py_object_type)
if Options.cache_builtins: if Options.cache_builtins:
code.putln("/*--- Builtin cleanup code ---*/") code.putln("/*--- Builtin cleanup code ---*/")
for entry in env.builtin_scope().cached_entries: for entry in env.cached_builtins:
code.put_var_decref_clear(entry) code.put_var_decref_clear(entry)
code.putln("/*--- Intern cleanup code ---*/") code.putln("/*--- Intern cleanup code ---*/")
for entry in env.pynum_entries: for entry in env.pynum_entries:
...@@ -1370,7 +1370,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1370,7 +1370,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
def generate_builtin_init_code(self, env, code): def generate_builtin_init_code(self, env, code):
# Lookup and cache builtin objects. # Lookup and cache builtin objects.
if Options.cache_builtins: if Options.cache_builtins:
for entry in env.builtin_scope().cached_entries: for entry in env.cached_builtins:
if Options.intern_names: if Options.intern_names:
#assert entry.interned_cname is not None #assert entry.interned_cname is not None
code.putln( code.putln(
......
...@@ -129,7 +129,7 @@ class BlockNode: ...@@ -129,7 +129,7 @@ class BlockNode:
del entries[:] del entries[:]
def generate_cached_builtins_decls(self, env, code): def generate_cached_builtins_decls(self, env, code):
entries = env.builtin_scope().undeclared_cached_entries entries = env.global_scope().undeclared_cached_builtins
if len(entries) > 0: if len(entries) > 0:
code.putln("") code.putln("")
for entry in entries: for entry in entries:
......
...@@ -560,8 +560,6 @@ class BuiltinScope(Scope): ...@@ -560,8 +560,6 @@ class BuiltinScope(Scope):
for name, definition in self.builtin_entries.iteritems(): for name, definition in self.builtin_entries.iteritems():
cname, type = definition cname, type = definition
self.declare_var(name, type, None, cname) self.declare_var(name, type, None, cname)
self.cached_entries = []
self.undeclared_cached_entries = []
def declare_builtin(self, name, pos): def declare_builtin(self, name, pos):
if not hasattr(__builtin__, name): if not hasattr(__builtin__, name):
...@@ -569,16 +567,6 @@ class BuiltinScope(Scope): ...@@ -569,16 +567,6 @@ class BuiltinScope(Scope):
return self.outer_scope.declare_builtin(name, pos) return self.outer_scope.declare_builtin(name, pos)
else: else:
error(pos, "undeclared name not builtin: %s"%name) error(pos, "undeclared name not builtin: %s"%name)
entry = self.declare(name, name, py_object_type, pos)
if Options.cache_builtins:
entry.is_builtin = 1
entry.is_const = 1
entry.cname = Naming.builtin_prefix + name
self.cached_entries.append(entry)
self.undeclared_cached_entries.append(entry)
else:
entry.is_builtin = 1
return entry
def declare_builtin_cfunction(self, name, type, cname, python_equiv = None, def declare_builtin_cfunction(self, name, type, cname, python_equiv = None,
utility_code = None): utility_code = None):
...@@ -688,6 +676,8 @@ class ModuleScope(Scope): ...@@ -688,6 +676,8 @@ class ModuleScope(Scope):
self.types_imported = {} self.types_imported = {}
self.pynum_entries = [] self.pynum_entries = []
self.has_extern_class = 0 self.has_extern_class = 0
self.cached_builtins = []
self.undeclared_cached_builtins = []
def qualifying_scope(self): def qualifying_scope(self):
return self.parent_module return self.parent_module
...@@ -696,8 +686,20 @@ class ModuleScope(Scope): ...@@ -696,8 +686,20 @@ class ModuleScope(Scope):
return self return self
def declare_builtin(self, name, pos): def declare_builtin(self, name, pos):
entry = Scope.declare_builtin(self, name, pos) if not hasattr(__builtin__, name):
#entry.interned_cname = self.intern(name) if self.outer_scope is not None:
return self.outer_scope.declare_builtin(name, pos)
else:
error(pos, "undeclared name not builtin: %s"%name)
entry = self.declare(name, name, py_object_type, pos)
if Options.cache_builtins:
entry.is_builtin = 1
entry.is_const = 1
entry.cname = Naming.builtin_prefix + name
self.cached_builtins.append(entry)
self.undeclared_cached_builtins.append(entry)
else:
entry.is_builtin = 1
return entry return entry
def intern(self, name): def intern(self, 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