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()
							 | 
						|
								    """
							 |