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