Commit 1b3eacbe authored by Stefan Behnel's avatar Stefan Behnel

distribute code.mark_pos() calls in various places to get more accurate line numbers for tracing

parent 23c1e193
...@@ -1496,6 +1496,7 @@ class CEnumDefNode(StatNode): ...@@ -1496,6 +1496,7 @@ class CEnumDefNode(StatNode):
def generate_execution_code(self, code): def generate_execution_code(self, code):
if self.visibility == 'public' or self.api: if self.visibility == 'public' or self.api:
code.mark_pos(self.pos)
temp = code.funcstate.allocate_temp(PyrexTypes.py_object_type, manage_ref=True) temp = code.funcstate.allocate_temp(PyrexTypes.py_object_type, manage_ref=True)
for item in self.entry.enum_values: for item in self.entry.enum_values:
code.putln("%s = PyInt_FromLong(%s); %s" % ( code.putln("%s = PyInt_FromLong(%s); %s" % (
...@@ -2126,6 +2127,7 @@ class FuncDefNode(StatNode, BlockNode): ...@@ -2126,6 +2127,7 @@ class FuncDefNode(StatNode, BlockNode):
pass pass
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
# Evaluate and store argument default values # Evaluate and store argument default values
for arg in self.args: for arg in self.args:
if not arg.is_dynamic: if not arg.is_dynamic:
...@@ -4320,6 +4322,7 @@ class PyClassDefNode(ClassDefNode): ...@@ -4320,6 +4322,7 @@ class PyClassDefNode(ClassDefNode):
self.body.generate_function_definitions(self.scope, code) self.body.generate_function_definitions(self.scope, code)
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
code.pyclass_stack.append(self) code.pyclass_stack.append(self)
cenv = self.scope cenv = self.scope
if self.bases: if self.bases:
...@@ -4551,6 +4554,7 @@ class CClassDefNode(ClassDefNode): ...@@ -4551,6 +4554,7 @@ class CClassDefNode(ClassDefNode):
def generate_execution_code(self, code): def generate_execution_code(self, code):
# This is needed to generate evaluation code for # This is needed to generate evaluation code for
# default values of method arguments. # default values of method arguments.
code.mark_pos(self.pos)
if self.body: if self.body:
self.body.generate_execution_code(code) self.body.generate_execution_code(code)
...@@ -4659,6 +4663,7 @@ class ExprStatNode(StatNode): ...@@ -4659,6 +4663,7 @@ class ExprStatNode(StatNode):
gil_message = "Discarding owned Python object" gil_message = "Discarding owned Python object"
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
self.expr.generate_evaluation_code(code) self.expr.generate_evaluation_code(code)
if not self.expr.is_temp and self.expr.result(): if not self.expr.is_temp and self.expr.result():
code.putln("%s;" % self.expr.result()) code.putln("%s;" % self.expr.result())
...@@ -4693,6 +4698,7 @@ class AssignmentNode(StatNode): ...@@ -4693,6 +4698,7 @@ class AssignmentNode(StatNode):
# self.analyse_expressions_2(env) # self.analyse_expressions_2(env)
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
self.generate_rhs_evaluation_code(code) self.generate_rhs_evaluation_code(code)
self.generate_assignment_code(code) self.generate_assignment_code(code)
...@@ -5103,6 +5109,7 @@ class ParallelAssignmentNode(AssignmentNode): ...@@ -5103,6 +5109,7 @@ class ParallelAssignmentNode(AssignmentNode):
# stat.analyse_expressions_2(env) # stat.analyse_expressions_2(env)
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
for stat in self.stats: for stat in self.stats:
stat.generate_rhs_evaluation_code(code) stat.generate_rhs_evaluation_code(code)
for stat in self.stats: for stat in self.stats:
...@@ -5154,6 +5161,7 @@ class InPlaceAssignmentNode(AssignmentNode): ...@@ -5154,6 +5161,7 @@ class InPlaceAssignmentNode(AssignmentNode):
return self return self
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
self.rhs.generate_evaluation_code(code) self.rhs.generate_evaluation_code(code)
self.lhs.generate_subexpr_evaluation_code(code) self.lhs.generate_subexpr_evaluation_code(code)
c_op = self.operator c_op = self.operator
...@@ -5210,6 +5218,7 @@ class PrintStatNode(StatNode): ...@@ -5210,6 +5218,7 @@ class PrintStatNode(StatNode):
gil_message = "Python print statement" gil_message = "Python print statement"
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
if self.stream: if self.stream:
self.stream.generate_evaluation_code(code) self.stream.generate_evaluation_code(code)
stream_result = self.stream.py_result() stream_result = self.stream.py_result()
...@@ -5271,6 +5280,7 @@ class ExecStatNode(StatNode): ...@@ -5271,6 +5280,7 @@ class ExecStatNode(StatNode):
gil_message = "Python exec statement" gil_message = "Python exec statement"
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
args = [] args = []
for arg in self.args: for arg in self.args:
arg.generate_evaluation_code(code) arg.generate_evaluation_code(code)
...@@ -5331,6 +5341,7 @@ class DelStatNode(StatNode): ...@@ -5331,6 +5341,7 @@ class DelStatNode(StatNode):
gil_message = "Deleting Python object" gil_message = "Deleting Python object"
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
for arg in self.args: for arg in self.args:
if (arg.type.is_pyobject or if (arg.type.is_pyobject or
arg.type.is_memoryviewslice or arg.type.is_memoryviewslice or
...@@ -5377,6 +5388,7 @@ class BreakStatNode(StatNode): ...@@ -5377,6 +5388,7 @@ class BreakStatNode(StatNode):
return self return self
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
if not code.break_label: if not code.break_label:
error(self.pos, "break statement not inside loop") error(self.pos, "break statement not inside loop")
else: else:
...@@ -5392,6 +5404,7 @@ class ContinueStatNode(StatNode): ...@@ -5392,6 +5404,7 @@ class ContinueStatNode(StatNode):
return self return self
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
if code.funcstate.in_try_finally: if code.funcstate.in_try_finally:
error(self.pos, "continue statement inside try of try...finally") error(self.pos, "continue statement inside try of try...finally")
elif not code.continue_label: elif not code.continue_label:
...@@ -5543,6 +5556,7 @@ class RaiseStatNode(StatNode): ...@@ -5543,6 +5556,7 @@ class RaiseStatNode(StatNode):
gil_message = "Raising exception" gil_message = "Raising exception"
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
if self.builtin_exc_name == 'MemoryError': if self.builtin_exc_name == 'MemoryError':
code.putln('PyErr_NoMemory(); %s' % code.error_goto(self.pos)) code.putln('PyErr_NoMemory(); %s' % code.error_goto(self.pos))
return return
...@@ -5614,6 +5628,7 @@ class ReraiseStatNode(StatNode): ...@@ -5614,6 +5628,7 @@ class ReraiseStatNode(StatNode):
gil_message = "Raising exception" gil_message = "Raising exception"
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
vars = code.funcstate.exc_vars vars = code.funcstate.exc_vars
if vars: if vars:
code.globalstate.use_utility_code(restore_exception_utility_code) code.globalstate.use_utility_code(restore_exception_utility_code)
...@@ -5658,6 +5673,7 @@ class AssertStatNode(StatNode): ...@@ -5658,6 +5673,7 @@ class AssertStatNode(StatNode):
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.putln("#ifndef CYTHON_WITHOUT_ASSERTIONS") code.putln("#ifndef CYTHON_WITHOUT_ASSERTIONS")
code.putln("if (unlikely(!Py_OptimizeFlag)) {") code.putln("if (unlikely(!Py_OptimizeFlag)) {")
code.mark_pos(self.pos)
self.cond.generate_evaluation_code(code) self.cond.generate_evaluation_code(code)
code.putln( code.putln(
"if (unlikely(!%s)) {" % "if (unlikely(!%s)) {" %
...@@ -5813,6 +5829,7 @@ class SwitchStatNode(StatNode): ...@@ -5813,6 +5829,7 @@ class SwitchStatNode(StatNode):
def generate_execution_code(self, code): def generate_execution_code(self, code):
self.test.generate_evaluation_code(code) self.test.generate_evaluation_code(code)
code.mark_pos(self.pos)
code.putln("switch (%s) {" % self.test.result()) code.putln("switch (%s) {" % self.test.result())
for case in self.cases: for case in self.cases:
case.generate_execution_code(code) case.generate_execution_code(code)
...@@ -5868,6 +5885,7 @@ class WhileStatNode(LoopNode, StatNode): ...@@ -5868,6 +5885,7 @@ class WhileStatNode(LoopNode, StatNode):
return self return self
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
old_loop_labels = code.new_loop_labels() old_loop_labels = code.new_loop_labels()
code.putln( code.putln(
"while (1) {") "while (1) {")
...@@ -6040,6 +6058,7 @@ class ForInStatNode(LoopNode, StatNode): ...@@ -6040,6 +6058,7 @@ class ForInStatNode(LoopNode, StatNode):
return self return self
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
old_loop_labels = code.new_loop_labels() old_loop_labels = code.new_loop_labels()
self.iterator.generate_evaluation_code(code) self.iterator.generate_evaluation_code(code)
code.putln("for (;;) {") code.putln("for (;;) {")
...@@ -6183,6 +6202,7 @@ class ForFromStatNode(LoopNode, StatNode): ...@@ -6183,6 +6202,7 @@ class ForFromStatNode(LoopNode, StatNode):
return self return self
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
old_loop_labels = code.new_loop_labels() old_loop_labels = code.new_loop_labels()
from_range = self.from_range from_range = self.from_range
self.bound1.generate_evaluation_code(code) self.bound1.generate_evaluation_code(code)
...@@ -6370,6 +6390,7 @@ class WithStatNode(StatNode): ...@@ -6370,6 +6390,7 @@ class WithStatNode(StatNode):
self.body.generate_function_definitions(env, code) self.body.generate_function_definitions(env, code)
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
code.putln("/*with:*/ {") code.putln("/*with:*/ {")
self.manager.generate_evaluation_code(code) self.manager.generate_evaluation_code(code)
self.exit_var = code.funcstate.allocate_temp(py_object_type, manage_ref=False) self.exit_var = code.funcstate.allocate_temp(py_object_type, manage_ref=False)
...@@ -6484,6 +6505,7 @@ class TryExceptStatNode(StatNode): ...@@ -6484,6 +6505,7 @@ class TryExceptStatNode(StatNode):
gil_message = "Try-except statement" gil_message = "Try-except statement"
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
old_return_label = code.return_label old_return_label = code.return_label
old_break_label = code.break_label old_break_label = code.break_label
old_continue_label = code.continue_label old_continue_label = code.continue_label
...@@ -6791,6 +6813,7 @@ class TryFinallyStatNode(StatNode): ...@@ -6791,6 +6813,7 @@ class TryFinallyStatNode(StatNode):
gil_message = "Try-finally statement" gil_message = "Try-finally statement"
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
old_error_label = code.error_label old_error_label = code.error_label
old_labels = code.all_new_labels() old_labels = code.all_new_labels()
new_labels = code.get_all_labels() new_labels = code.get_all_labels()
...@@ -7313,6 +7336,7 @@ class FromImportStatNode(StatNode): ...@@ -7313,6 +7336,7 @@ class FromImportStatNode(StatNode):
return self return self
def generate_execution_code(self, code): def generate_execution_code(self, code):
code.mark_pos(self.pos)
self.module.generate_evaluation_code(code) self.module.generate_evaluation_code(code)
if self.import_star: if self.import_star:
code.putln( code.putln(
......
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