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