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)
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,
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)
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)
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)
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"