summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2021-05-15 11:53:07 +0100
committerGitHub <noreply@github.com>2021-05-15 11:53:07 +0100
commit6efab28de5b8bab0c95fb141152baf2ff1beadfc (patch)
tree70604c9c0fc18be0be89dbb6928a05bae7b49207
parent5450d23ab2598e3553e9d4020b4488101c3ecc3e (diff)
parent7db889e77fc2c51e6e2977366041bea0c8ae1eaa (diff)
downloadzope-tal-6efab28de5b8bab0c95fb141152baf2ff1beadfc.tar.gz
Merge pull request #14 from cjwatson/traceback-reference-cycle
Avoid traceback reference cycle in TALInterpreter.do_onError_tal
-rw-r--r--CHANGES.rst2
-rw-r--r--src/zope/tal/talinterpreter.py13
2 files changed, 10 insertions, 5 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index db87896..89411df 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -5,7 +5,7 @@
4.5 (unreleased)
================
-- Nothing changed yet.
+- Avoid traceback reference cycle in ``TALInterpreter.do_onError_tal``.
4.4 (2018-10-05)
diff --git a/src/zope/tal/talinterpreter.py b/src/zope/tal/talinterpreter.py
index 82154db..ce2837e 100644
--- a/src/zope/tal/talinterpreter.py
+++ b/src/zope/tal/talinterpreter.py
@@ -987,10 +987,15 @@ class TALInterpreter(object):
# handled.
except:
exc = sys.exc_info()[1]
- self.restoreState(state)
- engine = self.engine
- engine.beginScope()
- error = engine.createErrorInfo(exc, self.position)
+ try:
+ self.restoreState(state)
+ engine = self.engine
+ engine.beginScope()
+ error = engine.createErrorInfo(exc, self.position)
+ finally:
+ # Avoid traceback reference cycle due to the __traceback__
+ # attribute on Python 3.
+ del exc
engine.setLocal('error', error)
try:
self.interpret(handler)