Commit 6d16147e authored by Robert Bradshaw's avatar Robert Bradshaw

empty tuple optimization

parent 30aff7fb
......@@ -2119,6 +2119,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)
try:
......@@ -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,
......
......@@ -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)
......@@ -1272,6 +1273,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
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)
......
......@@ -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"
......
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