Commit 9083f4da authored by Stefan Behnel's avatar Stefan Behnel

Generate function-local error indicator variables whenever "error_goto()" is used.

This was previously broken by the introduction of the "__PYX_ERR()" macro.
parent ae8b0ebf
......@@ -2353,24 +2353,18 @@ class CCodeWriter(object):
self.funcstate.should_declare_error_indicator = True
if used:
self.funcstate.uses_error_indicator = True
if self.code_config.c_line_in_traceback:
cinfo = " %s = %s;" % (Naming.clineno_cname, Naming.line_c_macro)
else:
cinfo = ""
return "%s = %s[%s]; %s = %s;%s" % (
Naming.filename_cname,
Naming.filetable_cname,
return "__PYX_MARK_ERR_POS(%s, %s)" % (
self.lookup_filename(pos[0]),
Naming.lineno_cname,
pos[1],
cinfo)
pos[1])
def error_goto(self, pos):
def error_goto(self, pos, used=True):
lbl = self.funcstate.error_label
self.funcstate.use_label(lbl)
if pos is None:
return 'goto %s;' % lbl
self.funcstate.should_declare_error_indicator = True
if used:
self.funcstate.uses_error_indicator = True
return "__PYX_ERR(%s, %s, %s)" % (
self.lookup_filename(pos[0]),
pos[1],
......
......@@ -693,16 +693,19 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
self._put_setup_code(code, "PythonCompatibility")
self._put_setup_code(code, "MathInitCode")
# Using "(void)cname" to prevent "unused" warnings.
if options.c_line_in_traceback:
cinfo = "%s = %s; " % (Naming.clineno_cname, Naming.line_c_macro)
cinfo = "%s = %s; (void)%s; " % (Naming.clineno_cname, Naming.line_c_macro, Naming.clineno_cname)
else:
cinfo = ""
code.put("""
#define __PYX_ERR(f_index, lineno, Ln_error) \\
{ \\
%s = %s[f_index]; %s = lineno; %sgoto Ln_error; \\
}
""" % (Naming.filename_cname, Naming.filetable_cname, Naming.lineno_cname, cinfo))
code.putln("#define __PYX_MARK_ERR_POS(f_index, lineno) \\")
code.putln(" { %s = %s[f_index]; (void)%s; %s = lineno; (void)%s; %s}" % (
Naming.filename_cname, Naming.filetable_cname, Naming.filename_cname,
Naming.lineno_cname, Naming.lineno_cname,
cinfo
))
code.putln("#define __PYX_ERR(f_index, lineno, Ln_error) \\")
code.putln(" { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; }")
code.putln("")
self.generate_extern_c_macro_definition(code)
......@@ -765,11 +768,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln('static PyObject *%s;' % Naming.empty_unicode)
if Options.pre_import is not None:
code.putln('static PyObject *%s;' % Naming.preimport_cname)
code.putln('#endif')
code.putln('static int %s;' % Naming.lineno_cname)
code.putln('static int %s = 0;' % Naming.clineno_cname)
code.putln('static const char * %s= %s;' % (Naming.cfilenm_cname, Naming.file_c_macro))
code.putln('static const char *%s;' % Naming.filename_cname)
code.putln('#endif')
env.use_utility_code(UtilityCode.load_cached("FastTypeChecks", "ModuleSetupCode.c"))
if has_np_pythran(env):
......@@ -2432,9 +2436,6 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln('PyObject *%s;' % Naming.empty_unicode)
if Options.pre_import is not None:
code.putln('PyObject *%s;' % Naming.preimport_cname)
code.putln('int %s;' % Naming.lineno_cname)
code.putln('int %s;' % Naming.clineno_cname)
code.putln('const char *%s;' % Naming.filename_cname)
code.putln('#ifdef __Pyx_CyFunction_USED')
code.putln('PyTypeObject *%s;' % Naming.cyfunction_type_cname)
code.putln('#endif')
......@@ -2505,18 +2506,6 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
Naming.preimport_cname,
Naming.modulestateglobal_cname,
Naming.preimport_cname))
code.putln('#define %s %s->%s' % (
Naming.lineno_cname,
Naming.modulestateglobal_cname,
Naming.lineno_cname))
code.putln('#define %s %s->%s' % (
Naming.clineno_cname,
Naming.modulestateglobal_cname,
Naming.clineno_cname))
code.putln('#define %s %s->%s' % (
Naming.filename_cname,
Naming.modulestateglobal_cname,
Naming.filename_cname))
code.putln('#ifdef __Pyx_CyFunction_USED')
code.putln('#define %s %s->%s' % (
Naming.cyfunction_type_cname,
......
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