From 9429250889790bb562ca1821c25138e53dda0313 Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Wed, 24 Oct 2007 21:35:02 -0700 Subject: [PATCH] cache builtins at module level --- Cython/Compiler/ModuleNode.py | 4 ++-- Cython/Compiler/Nodes.py | 2 +- Cython/Compiler/Symtab.py | 30 ++++++++++++++++-------------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index f541f1f1..74708b24 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -1293,7 +1293,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): code.put_decref("((PyObject*)%s)" % type.typeptr_cname, PyrexTypes.py_object_type) if Options.cache_builtins: 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.putln("/*--- Intern cleanup code ---*/") for entry in env.pynum_entries: @@ -1370,7 +1370,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): def generate_builtin_init_code(self, env, code): # Lookup and cache builtin objects. if Options.cache_builtins: - for entry in env.builtin_scope().cached_entries: + for entry in env.cached_builtins: if Options.intern_names: #assert entry.interned_cname is not None code.putln( diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 515ed394..00082716 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -129,7 +129,7 @@ class BlockNode: del entries[:] 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: code.putln("") for entry in entries: diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index 3ad1b484..f1ae18ff 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -560,8 +560,6 @@ class BuiltinScope(Scope): for name, definition in self.builtin_entries.iteritems(): cname, type = definition self.declare_var(name, type, None, cname) - self.cached_entries = [] - self.undeclared_cached_entries = [] def declare_builtin(self, name, pos): if not hasattr(__builtin__, name): @@ -569,16 +567,6 @@ class BuiltinScope(Scope): 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_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, utility_code = None): @@ -688,6 +676,8 @@ class ModuleScope(Scope): self.types_imported = {} self.pynum_entries = [] self.has_extern_class = 0 + self.cached_builtins = [] + self.undeclared_cached_builtins = [] def qualifying_scope(self): return self.parent_module @@ -696,8 +686,20 @@ class ModuleScope(Scope): return self def declare_builtin(self, name, pos): - entry = Scope.declare_builtin(self, name, pos) - #entry.interned_cname = self.intern(name) + if not hasattr(__builtin__, 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 def intern(self, name): -- 2.26.2