From 6d16147e4e1552c4beba9b69ed9ee55d09f994a0 Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Thu, 17 Jan 2008 02:08:48 -0800 Subject: [PATCH] empty tuple optimization --- Cython/Compiler/ExprNodes.py | 16 ++++++++++++++++ Cython/Compiler/ModuleNode.py | 4 ++++ Cython/Compiler/Naming.py | 2 ++ 3 files changed, 22 insertions(+) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index dcf6532b..f571cc03 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -2118,6 +2118,19 @@ class SequenceNode(ExprNode): class TupleNode(SequenceNode): # Tuple constructor. + + def analyse_types(self, env): + if len(self.args) == 0: + self.type = py_object_type + self.is_temp = 0 + else: + SequenceNode.analyse_types(self, env) + + def calculate_result_code(self): + if len(self.args) > 0: + error(pos, "Positive length tuples must be constructed.") + else: + return Naming.empty_tuple def compile_time_value(self, denv): values = self.compile_time_value_list(denv) @@ -2127,6 +2140,9 @@ class TupleNode(SequenceNode): self.compile_time_value_error(e) def generate_operation_code(self, code): + if len(self.args) == 0: + # result_code is Naming.empty_tuple + return code.putln( "%s = PyTuple_New(%s); %s" % ( self.result_code, diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index c7e4f1fe..6deb2f79 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -286,6 +286,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): code.putln('') code.putln('static PyObject *%s;' % env.module_cname) code.putln('static PyObject *%s;' % Naming.builtins_cname) + code.putln('static PyObject *%s;' % Naming.empty_tuple) if Options.pre_import is not None: code.putln('static PyObject *%s;' % Naming.preimport_cname) code.putln('static int %s;' % Naming.lineno_cname) @@ -1271,6 +1272,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): if Options.cache_builtins: code.putln("/*--- Builtin init code ---*/") self.generate_builtin_init_code(env, code) + + code.putln("%s = PyTuple_New(0); %s" % (Naming.empty_tuple, code.error_goto_if_null(Naming.empty_tuple, self.pos))); code.putln("/*--- Global init code ---*/") self.generate_global_init_code(env, code) @@ -1324,6 +1327,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): code.putln("/*--- Builtin cleanup code ---*/") for entry in env.cached_builtins: code.put_var_decref_clear(entry) + code.putln("Py_DECREF(%s); %s = 0;" % (Naming.empty_tuple, Naming.empty_tuple)); code.putln("/*--- Intern cleanup code ---*/") for entry in env.pynum_entries: code.put_var_decref_clear(entry) diff --git a/Cython/Compiler/Naming.py b/Cython/Compiler/Naming.py index 6ad9ae2a..acdd674f 100644 --- a/Cython/Compiler/Naming.py +++ b/Cython/Compiler/Naming.py @@ -58,6 +58,8 @@ vtabslot_cname = pyrex_prefix + "vtab" c_api_tab_cname = pyrex_prefix + "c_api_tab" gilstate_cname = pyrex_prefix + "state" skip_dispatch_cname = pyrex_prefix + "skip_dispatch" +empty_tuple = pyrex_prefix + "empty_tuple" + extern_c_macro = pyrex_prefix.upper() + "EXTERN_C" -- 2.26.2