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);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |