150 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| package native;
 | |
| 
 | |
| @:native("ExternStruct")
 | |
| extern class ExternStruct
 | |
| {
 | |
|    @:native("~ExternStruct")
 | |
|    public function destroy():Void;
 | |
| 
 | |
|    @:native("new ExternStruct")
 | |
|    public static function create():cpp.Pointer<ExternStruct>;
 | |
| }
 | |
| 
 | |
| 
 | |
| #if !cppia
 | |
| @:headerCode('
 | |
|    struct ExternStruct {
 | |
|       ExternStruct() {  }
 | |
|       ~ExternStruct() {  }
 | |
|    };
 | |
| ')
 | |
| class ExternWrapper
 | |
| {
 | |
|     var pointer:cpp.Pointer<ExternStruct>;
 | |
|     public static var instances:Int = 0;
 | |
| 
 | |
|     public function new()
 | |
|     {
 | |
|        pointer = ExternStruct.create();
 | |
|        instances++;
 | |
|        cpp.vm.Gc.setFinalizer(this, cpp.Function.fromStaticFunction(destroy));
 | |
|     }
 | |
| 
 | |
|     @:void static public function destroy(ExternWrapper : ExternWrapper) : Void {
 | |
|        instances--;
 | |
| 	 	 ExternWrapper.pointer.destroy();
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| class CustomFinalizable
 | |
| {
 | |
|    public static var count = 0;
 | |
| 
 | |
|    public function new()
 | |
|    {
 | |
|       cpp.vm.Gc.setFinalizer(this, cpp.Function.fromStaticFunction(__finalizeCallback));
 | |
|    }
 | |
| 
 | |
|    function __finalize() : Void count++;
 | |
| 
 | |
|    @:void public static function __finalizeCallback(o : CustomFinalizable) : Void
 | |
|    {
 | |
|       if(o != null)
 | |
|          o.__finalize();
 | |
|       else
 | |
|          Sys.println("Null callback object?");
 | |
|    }
 | |
| } 
 | |
| 
 | |
| 
 | |
| 
 | |
| #end
 | |
| 
 | |
| 
 | |
| class MyFinalizable extends cpp.Finalizable
 | |
| {
 | |
|    public static var count = 0;
 | |
| 
 | |
|    public function new()
 | |
|    {
 | |
|       super();
 | |
|    }
 | |
| 
 | |
|    override public function finalize()
 | |
|    {
 | |
|       count ++;
 | |
|    }
 | |
| }
 | |
| 
 | |
| 
 | |
| class TestFinalizer extends haxe.unit.TestCase
 | |
| {
 | |
| 
 | |
|    override public function setup()
 | |
|    {
 | |
|       MyFinalizable.count = 0;
 | |
|       CustomFinalizable.count = 0;
 | |
|    }
 | |
| 
 | |
|    #if !cppia
 | |
|    function createExternWrapper(i:Int)
 | |
|    {
 | |
|       if (i<=0)
 | |
|          new ExternWrapper();
 | |
|       else
 | |
|         createExternWrapper(i-1);
 | |
|    }
 | |
| 
 | |
| 
 | |
|    public function testCount()
 | |
|    {
 | |
|       for(i in 0...10)
 | |
|       {
 | |
|           createExternWrapper(2);
 | |
|           cpp.vm.Gc.run(true);
 | |
|       }
 | |
|       Sys.println("\nExtern instances remaining:" + ExternWrapper.instances);
 | |
|       assertTrue( ExternWrapper.instances < 10 );
 | |
|    }
 | |
| 
 | |
|    function createCustomFinalizable(i:Int)
 | |
|    {
 | |
|       if (i<=0)
 | |
|          new CustomFinalizable();
 | |
|       else
 | |
|          createCustomFinalizable(i-1);
 | |
|    }
 | |
| 
 | |
| 
 | |
|    public function testCustomFinalizable()
 | |
|    {
 | |
|       for(i in 0...100)
 | |
|          createCustomFinalizable(2);
 | |
|       cpp.vm.Gc.run(true);
 | |
|       Sys.println("custom cleared:" + CustomFinalizable.count);
 | |
|       assertTrue(CustomFinalizable.count>0);
 | |
|    }
 | |
| 
 | |
|    #end
 | |
| 
 | |
|    function createMyFinalizable(i:Int)
 | |
|    {
 | |
|       if (i<=0)
 | |
|          new MyFinalizable();
 | |
|       else
 | |
|          createMyFinalizable(i-1);
 | |
|    }
 | |
| 
 | |
|    public function testFinalizable()
 | |
|    {
 | |
|       for(i in 0...100)
 | |
|          createMyFinalizable(2);
 | |
|       cpp.vm.Gc.run(true);
 | |
|       Sys.println("MyFinalizable cleared:" + MyFinalizable.count);
 | |
|       assertTrue(MyFinalizable.count>0);
 | |
|    }
 | |
| }
 | |
| 
 | |
| 
 |