Commit 9eee898c authored by Stefan Behnel's avatar Stefan Behnel

patch for ticket #646 by klepa: provide dedicated switches for 'c_line_in_traceback' option

parent 38a051cb
...@@ -116,6 +116,8 @@ def parse_command_line(args): ...@@ -116,6 +116,8 @@ def parse_command_line(args):
Options.convert_range = True Options.convert_range = True
elif option == "--line-directives": elif option == "--line-directives":
options.emit_linenums = True options.emit_linenums = True
elif option == "--no-c-in-traceback":
options.c_line_in_traceback = False
elif option == "--gdb": elif option == "--gdb":
options.gdb_debug = True options.gdb_debug = True
options.output_dir = os.curdir options.output_dir = os.curdir
......
...@@ -860,24 +860,26 @@ class CCodeWriter(object): ...@@ -860,24 +860,26 @@ class CCodeWriter(object):
coming from the same root share the same instances simultaneously. coming from the same root share the same instances simultaneously.
""" """
# f file output file # f file output file
# buffer StringIOTree # buffer StringIOTree
# level int indentation level # level int indentation level
# bol bool beginning of line? # bol bool beginning of line?
# marker string comment to emit before next line # marker string comment to emit before next line
# funcstate FunctionState contains state local to a C function used for code # funcstate FunctionState contains state local to a C function used for code
# generation (labels and temps state etc.) # generation (labels and temps state etc.)
# globalstate GlobalState contains state global for a C file (input file info, # globalstate GlobalState contains state global for a C file (input file info,
# utility code, declared constants etc.) # utility code, declared constants etc.)
# emit_linenums boolean whether or not to write #line pragmas # emit_linenums boolean whether or not to write #line pragmas
# #
# pyclass_stack list used during recursive code generation to pass information # c_line_in_traceback boolean append the c file and line number to the traceback for exceptions
# about the current class one is in #
# pyclass_stack list used during recursive code generation to pass information
# about the current class one is in
globalstate = None globalstate = None
def __init__(self, create_from=None, buffer=None, copy_formatting=False, emit_linenums=None): def __init__(self, create_from=None, buffer=None, copy_formatting=False, emit_linenums=None, c_line_in_traceback=True):
if buffer is None: buffer = StringIOTree() if buffer is None: buffer = StringIOTree()
self.buffer = buffer self.buffer = buffer
self.marker = None self.marker = None
...@@ -902,11 +904,12 @@ class CCodeWriter(object): ...@@ -902,11 +904,12 @@ class CCodeWriter(object):
self.emit_linenums = self.globalstate.emit_linenums self.emit_linenums = self.globalstate.emit_linenums
else: else:
self.emit_linenums = emit_linenums self.emit_linenums = emit_linenums
self.c_line_in_traceback = c_line_in_traceback
def create_new(self, create_from, buffer, copy_formatting): def create_new(self, create_from, buffer, copy_formatting):
# polymorphic constructor -- very slightly more versatile # polymorphic constructor -- very slightly more versatile
# than using __class__ # than using __class__
result = CCodeWriter(create_from, buffer, copy_formatting) result = CCodeWriter(create_from, buffer, copy_formatting, c_line_in_traceback=self.c_line_in_traceback)
return result return result
def copyto(self, f): def copyto(self, f):
...@@ -935,7 +938,7 @@ class CCodeWriter(object): ...@@ -935,7 +938,7 @@ class CCodeWriter(object):
Creates a new CCodeWriter connected to the same global state, which Creates a new CCodeWriter connected to the same global state, which
can later be inserted using insert. can later be inserted using insert.
""" """
return CCodeWriter(create_from=self) return CCodeWriter(create_from=self, c_line_in_traceback=self.c_line_in_traceback)
def insert(self, writer): def insert(self, writer):
""" """
...@@ -1319,7 +1322,7 @@ class CCodeWriter(object): ...@@ -1319,7 +1322,7 @@ class CCodeWriter(object):
return self.putln("if (%s < 0) %s" % (value, self.error_goto(pos))) return self.putln("if (%s < 0) %s" % (value, self.error_goto(pos)))
def set_error_info(self, pos): def set_error_info(self, pos):
if Options.c_line_in_traceback: if self.c_line_in_traceback:
cinfo = " %s = %s;" % (Naming.clineno_cname, Naming.line_c_macro) cinfo = " %s = %s;" % (Naming.clineno_cname, Naming.line_c_macro)
else: else:
cinfo = "" cinfo = ""
......
...@@ -837,6 +837,7 @@ default_options = dict( ...@@ -837,6 +837,7 @@ default_options = dict(
evaluate_tree_assertions = False, evaluate_tree_assertions = False,
emit_linenums = False, emit_linenums = False,
relative_path_in_code_position_comments = True, relative_path_in_code_position_comments = True,
c_line_in_traceback = True,
language_level = 2, language_level = 2,
gdb_debug = False, gdb_debug = False,
) )
...@@ -258,7 +258,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -258,7 +258,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
rootwriter = Annotate.AnnotationCCodeWriter() rootwriter = Annotate.AnnotationCCodeWriter()
else: else:
emit_linenums = options.emit_linenums emit_linenums = options.emit_linenums
rootwriter = Code.CCodeWriter(emit_linenums=emit_linenums) rootwriter = Code.CCodeWriter(emit_linenums=emit_linenums, c_line_in_traceback=options.c_line_in_traceback)
globalstate = Code.GlobalState(rootwriter, emit_linenums) globalstate = Code.GlobalState(rootwriter, emit_linenums)
globalstate.initialize_main_c_code() globalstate.initialize_main_c_code()
h_code = globalstate['h_code'] h_code = globalstate['h_code']
......
...@@ -43,9 +43,6 @@ lookup_module_cpdef = 0 ...@@ -43,9 +43,6 @@ lookup_module_cpdef = 0
# WARNING: This is a work in progress, may currently segfault. # WARNING: This is a work in progress, may currently segfault.
init_local_none = 1 init_local_none = 1
# Append the c file and line number to the traceback for exceptions.
c_line_in_traceback = 1
# Whether or not to embed the Python interpreter, for use in making a # Whether or not to embed the Python interpreter, for use in making a
# standalone executable. This will provide a main() method which simply # standalone executable. This will provide a main() method which simply
# executes the body of this module. # executes the body of this module.
......
...@@ -110,6 +110,7 @@ class build_ext(_build_ext.build_ext): ...@@ -110,6 +110,7 @@ class build_ext(_build_ext.build_ext):
self.pyrex_c_in_temp = 0 self.pyrex_c_in_temp = 0
self.pyrex_gen_pxi = 0 self.pyrex_gen_pxi = 0
self.pyrex_gdb = False self.pyrex_gdb = False
self.no_c_in_traceback = 0
def finalize_options (self): def finalize_options (self):
_build_ext.build_ext.finalize_options(self) _build_ext.build_ext.finalize_options(self)
...@@ -185,6 +186,8 @@ class build_ext(_build_ext.build_ext): ...@@ -185,6 +186,8 @@ class build_ext(_build_ext.build_ext):
getattr(extension, 'pyrex_create_listing', 0) getattr(extension, 'pyrex_create_listing', 0)
line_directives = self.pyrex_line_directives or \ line_directives = self.pyrex_line_directives or \
getattr(extension, 'pyrex_line_directives', 0) getattr(extension, 'pyrex_line_directives', 0)
no_c_in_traceback = self.no_c_in_traceback or \
getattr(extension, 'no_c_in_traceback', 0)
cplus = self.pyrex_cplus or getattr(extension, 'pyrex_cplus', 0) or \ cplus = self.pyrex_cplus or getattr(extension, 'pyrex_cplus', 0) or \
(extension.language and extension.language.lower() == 'c++') (extension.language and extension.language.lower() == 'c++')
pyrex_gen_pxi = self.pyrex_gen_pxi or getattr(extension, 'pyrex_gen_pxi', 0) pyrex_gen_pxi = self.pyrex_gen_pxi or getattr(extension, 'pyrex_gen_pxi', 0)
...@@ -274,6 +277,7 @@ class build_ext(_build_ext.build_ext): ...@@ -274,6 +277,7 @@ class build_ext(_build_ext.build_ext):
output_file = target, output_file = target,
cplus = cplus, cplus = cplus,
emit_linenums = line_directives, emit_linenums = line_directives,
c_line_in_traceback = not no_c_in_traceback,
generate_pxi = pyrex_gen_pxi, generate_pxi = pyrex_gen_pxi,
output_dir = output_dir, output_dir = output_dir,
gdb_debug = pyrex_gdb) gdb_debug = pyrex_gdb)
......
...@@ -33,6 +33,8 @@ class Extension(_Extension.Extension): ...@@ -33,6 +33,8 @@ class Extension(_Extension.Extension):
generate .pxi file for public declarations generate .pxi file for public declarations
pyrex_gdb : boolean pyrex_gdb : boolean
generate Cython debug information for this extension for cygdb generate Cython debug information for this extension for cygdb
no_c_in_traceback : boolean
emit the c file and line number from the traceback for exceptions
""" """
# When adding arguments to this constructor, be sure to update # When adding arguments to this constructor, be sure to update
...@@ -59,6 +61,7 @@ class Extension(_Extension.Extension): ...@@ -59,6 +61,7 @@ class Extension(_Extension.Extension):
pyrex_c_in_temp = 0, pyrex_c_in_temp = 0,
pyrex_gen_pxi = 0, pyrex_gen_pxi = 0,
pyrex_gdb = False, pyrex_gdb = False,
no_c_in_traceback = False,
**kw): **kw):
_Extension.Extension.__init__(self, name, sources, _Extension.Extension.__init__(self, name, sources,
...@@ -85,6 +88,7 @@ class Extension(_Extension.Extension): ...@@ -85,6 +88,7 @@ class Extension(_Extension.Extension):
self.pyrex_c_in_temp = pyrex_c_in_temp self.pyrex_c_in_temp = pyrex_c_in_temp
self.pyrex_gen_pxi = pyrex_gen_pxi self.pyrex_gen_pxi = pyrex_gen_pxi
self.pyrex_gdb = pyrex_gdb self.pyrex_gdb = pyrex_gdb
self.no_c_in_traceback = no_c_in_traceback
# class Extension # class Extension
......
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