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