You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.8 KiB
79 lines
1.8 KiB
import gc
|
|
|
|
|
|
def test_alias_delay_initialization1(capture):
|
|
"""A only initializes its trampoline class when we inherit from it; if we just
|
|
create and use an A instance directly, the trampoline initialization is bypassed
|
|
and we only initialize an A() instead (for performance reasons).
|
|
"""
|
|
from pybind11_tests import A, call_f
|
|
|
|
class B(A):
|
|
def __init__(self):
|
|
super(B, self).__init__()
|
|
|
|
def f(self):
|
|
print("In python f()")
|
|
|
|
# C++ version
|
|
with capture:
|
|
a = A()
|
|
call_f(a)
|
|
del a
|
|
gc.collect()
|
|
assert capture == "A.f()"
|
|
|
|
# Python version
|
|
with capture:
|
|
b = B()
|
|
call_f(b)
|
|
del b
|
|
gc.collect()
|
|
assert capture == """
|
|
PyA.PyA()
|
|
PyA.f()
|
|
In python f()
|
|
PyA.~PyA()
|
|
"""
|
|
|
|
|
|
def test_alias_delay_initialization2(capture):
|
|
"""A2, unlike the above, is configured to always initialize the alias; while
|
|
the extra initialization and extra class layer has small virtual dispatch
|
|
performance penalty, it also allows us to do more things with the trampoline
|
|
class such as defining local variables and performing construction/destruction.
|
|
"""
|
|
from pybind11_tests import A2, call_f
|
|
|
|
class B2(A2):
|
|
def __init__(self):
|
|
super(B2, self).__init__()
|
|
|
|
def f(self):
|
|
print("In python B2.f()")
|
|
|
|
# No python subclass version
|
|
with capture:
|
|
a2 = A2()
|
|
call_f(a2)
|
|
del a2
|
|
gc.collect()
|
|
assert capture == """
|
|
PyA2.PyA2()
|
|
PyA2.f()
|
|
A2.f()
|
|
PyA2.~PyA2()
|
|
"""
|
|
|
|
# Python subclass version
|
|
with capture:
|
|
b2 = B2()
|
|
call_f(b2)
|
|
del b2
|
|
gc.collect()
|
|
assert capture == """
|
|
PyA2.PyA2()
|
|
PyA2.f()
|
|
In python B2.f()
|
|
PyA2.~PyA2()
|
|
"""
|