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