forked from LeenkxTeam/LNXSDK
		
	Update Files
This commit is contained in:
		
							
								
								
									
										149
									
								
								Kha/Backends/Kinc-hxcpp/khacpp/test/haxe/native/TestFinalizer.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								Kha/Backends/Kinc-hxcpp/khacpp/test/haxe/native/TestFinalizer.hx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,149 @@ | ||||
| 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); | ||||
|    } | ||||
| } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user