130 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| package gc;
 | |
| import haxe.io.Bytes;
 | |
| import cpp.vm.Gc;
 | |
| 
 | |
| class CustomObject {
 | |
| 	public function new():Void {}
 | |
| }
 | |
| 
 | |
| class TestGC extends haxe.unit.TestCase {
 | |
| 	function createDummy(val:Dynamic):Dynamic {
 | |
|       return { dummy: val };
 | |
|    }
 | |
| 
 | |
| 	function gc():Dynamic {
 | |
|       Gc.run(true);
 | |
| 		return Gc.getNextZombie();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 		For avoiding the simple call being optimized in some way.
 | |
| 	*/
 | |
| 	function create(f:Void->Void):Void {
 | |
| 		f();
 | |
|       clearStack(10);
 | |
| 	}
 | |
| 
 | |
|    function clearStack(count:Int, ?nothing:Dynamic):Dynamic
 | |
|    {
 | |
|       if (count==0)
 | |
|          return 0;
 | |
|       return clearStack(count-1);
 | |
|    }
 | |
| 
 | |
| 
 | |
| 	function createAbc():Void {
 | |
| 		var object = { test: "abc" };
 | |
| 		Gc.doNotKill(object);
 | |
| 	}
 | |
| 	public function testObject():Void {
 | |
| 		create(createAbc);
 | |
| 		var zombie = gc();
 | |
| 		assertTrue(zombie != null);
 | |
| 		assertEquals("abc", zombie.test);
 | |
| 		assertTrue(gc() == null);
 | |
| 	}
 | |
| 
 | |
|    // Null<int> for numbers < 256 are special cases
 | |
|    // Infact, there are no guarantees that Null<Int> will be actual objects in the future
 | |
|    /*
 | |
| 	function create1234():Void {
 | |
| 		var object:Null<Int> = 1234;
 | |
| 		Gc.doNotKill(object);
 | |
| 	};
 | |
| 	public function testBoxedInt():Void {
 | |
| 		create(create1234);
 | |
| 		var zombie:Dynamic = gc();
 | |
| 		assertTrue(zombie != null);
 | |
| 		assertEquals(1234, zombie);
 | |
| 		assertTrue(gc() == null);
 | |
| 	}
 | |
|    */
 | |
| 
 | |
| 	function createFunction():Void {
 | |
| 		var object = function() return "abc";
 | |
| 		Gc.doNotKill(object);
 | |
| 	};
 | |
| 	public function testFunc():Void {
 | |
| 		create(createFunction);
 | |
| 		var zombie = gc();
 | |
| 		assertTrue(zombie != null);
 | |
| 		assertEquals("abc", zombie());
 | |
| 		assertTrue(gc() == null);
 | |
| 	}
 | |
| 
 | |
| 	function createCustom():Void {
 | |
| 		var object = new CustomObject();
 | |
| 		Gc.doNotKill(object);
 | |
| 	};
 | |
| 	public function testCustomObject():Void {
 | |
| 		create(createCustom);
 | |
| 		var zombie = gc();
 | |
| 		assertTrue(zombie != null);
 | |
| 		assertTrue(Std.isOfType(zombie, CustomObject));
 | |
| 		assertTrue(gc() == null);
 | |
| 	}
 | |
| 
 | |
| 	function createBytes():Void {
 | |
| 		var object = Bytes.alloc(1);
 | |
| 		Gc.doNotKill(object);
 | |
| 	};
 | |
| 	public function testBytes():Void {
 | |
| 		create(createBytes);
 | |
| 		var zombie = gc();
 | |
| 		assertTrue(zombie != null);
 | |
| 		assertTrue(Std.isOfType(zombie, Bytes));
 | |
| 		assertTrue(gc() == null);
 | |
| 	}
 | |
| 
 | |
| 	public function testBigStack():Void {
 | |
|       assertTrue( TestBigStack.test() );
 | |
|    }
 | |
| 
 | |
|    #if !cppia
 | |
| 	public function testConstStrings():Void {
 | |
|       // Const strings void Gc overhead
 | |
|       var strings = new Array<String>();
 | |
|       strings.push( haxe.Resource.getString("TestMain.hx") );
 | |
|       strings.push( "some string" );
 | |
|       var chars = "abc123";
 | |
|       // Optimization for single chars...
 | |
|       for(c in 0...chars.length)
 | |
|          strings.push( chars.substr(c,1) );
 | |
|       for(string in strings)
 | |
|          assertTrue( untyped __global__.__hxcpp_is_const_string(string) );
 | |
|       Gc.run(true);
 | |
|       for(string in strings)
 | |
|          assertTrue( untyped __global__.__hxcpp_is_const_string(string) );
 | |
| 
 | |
|       var strings = new Array<String>();
 | |
|       strings.push( haxe.Resource.getString("TestMain.hx").substr(10) );
 | |
|       strings.push( "some string" + chars );
 | |
|       for(c in 0...chars.length-1)
 | |
|          strings.push( chars.substr(c,2) );
 | |
| 
 | |
|       for(string in strings)
 | |
|          assertFalse( untyped __global__.__hxcpp_is_const_string(string) );
 | |
|    }
 | |
|    #end
 | |
| }
 |