summaryrefslogtreecommitdiff
path: root/Cython/Compiler/ModuleNode.py
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2015-02-22 11:02:51 +0100
committerStefan Behnel <stefan_ml@behnel.de>2015-02-22 11:02:51 +0100
commite62a143062b629dce1dcdff3cfe12d4aa931d495 (patch)
tree9cda942ce4af950c9a0d92fb2d29cd8cecdf0145 /Cython/Compiler/ModuleNode.py
parentf6f110e115717c794d5273c60631020b19eba700 (diff)
downloadcython-e62a143062b629dce1dcdff3cfe12d4aa931d495.tar.gz
enable profiling/tracing for module init code
Diffstat (limited to 'Cython/Compiler/ModuleNode.py')
-rw-r--r--Cython/Compiler/ModuleNode.py16
1 files changed, 16 insertions, 0 deletions
diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py
index e377dc4a7..b75912b03 100644
--- a/Cython/Compiler/ModuleNode.py
+++ b/Cython/Compiler/ModuleNode.py
@@ -2049,7 +2049,15 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("{")
tempdecl_code = code.insertion_point()
+ profile = code.globalstate.directives['profile']
+ linetrace = code.globalstate.directives['linetrace']
+ if profile or linetrace:
+ code.globalstate.use_utility_code(UtilityCode.load_cached("Profile", "Profile.c"))
+
code.put_declare_refcount_context()
+ if profile or linetrace:
+ tempdecl_code.put_trace_declarations(None)
+
code.putln("#if CYTHON_REFNANNY")
code.putln("__Pyx_RefNanny = __Pyx_RefNannyImportAPI(\"refnanny\");")
code.putln("if (!__Pyx_RefNanny) {")
@@ -2149,8 +2157,16 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("/*--- Execution code ---*/")
code.mark_pos(None)
+ if profile or linetrace:
+ code.put_trace_call(header3, self.pos, nogil=not code.funcstate.gil_owned)
+ code.funcstate.can_trace = True
+
self.body.generate_execution_code(code)
+ if profile or linetrace:
+ code.funcstate.can_trace = False
+ code.put_trace_return("Py_None", nogil=not code.funcstate.gil_owned)
+
code.putln()
code.putln("/*--- Wrapped vars code ---*/")
self.generate_wrapped_entries_code(env, code)