According to <https://docs.python.org/3/reference/compound_stmts.html#try>:
> Exceptions are cleared because with the traceback attached to them,
> they form a reference cycle with the stack frame, keeping all locals
> in that frame alive until the next garbage collection occurs.
According to <http://portingguide.readthedocs.io/en/latest/exceptions.html>:
> As discussed previously, in Python 3, all information about an
> exception, including the traceback, is contained in the exception
> object. Since the traceback holds references to the values of all
> local variables, storing an exception in a local variable usually
> forms a reference cycle, keeping all local variables allocated until
> the next garbage collection pass.
This reference cycle can make some tests fail because, with the
Babeltrace Python bindings, some operations are performed when a
Babeltrace native object is destroyed: this means the Python reference
count must be "stable" and as deterministic as possible so as to avoid
gc.collect() when using the bindings.
Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
raise ValueError('{} is not a power of two'.format(a))
raise ValueError('{} is not a power of two'.format(a))
+def _raise_bt2_error(msg):
+ if msg is None:
+ raise bt2.Error
+ else:
+ raise bt2.Error(msg)
+
def _handle_ret(ret, msg=None):
if int(ret) < 0:
def _handle_ret(ret, msg=None):
if int(ret) < 0:
- if msg is None:
- error = bt2.Error()
- else:
- error = bt2.Error(msg)
-
- raise error
def _handle_ptr(ptr, msg=None):
if ptr is None:
def _handle_ptr(ptr, msg=None):
if ptr is None:
- if msg is None:
- error = bt2.Error()
- else:
- error = bt2.Error(msg)
-
- raise error