forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			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);
 | 
						|
   }
 | 
						|
}
 | 
						|
 | 
						|
 |