public void TestBasic() { var heap = new Heap(); var values = new StackValue[] { StackValue.BuildInt(0), StackValue.BuildInt(1), StackValue.BuildInt(2) }; var array = heap.AllocateArray(values); var str = heap.AllocateString("hello world"); heap.GCMarkAndSweep(new List<StackValue>(), testExecutive); var arrayHeapElement = heap.GetHeapElement(array); Assert.IsNull(arrayHeapElement); var strHeapElement = heap.GetHeapElement(str); Assert.IsNull(strHeapElement); }
public void TestCircularReference() { var heap = new Heap(); var array1 = heap.AllocateArray(new StackValue[] { StackValue.Null }); var array2 = heap.AllocateArray(new StackValue[] { array1 }); var array1HeapElement = heap.GetHeapElement(array1); // self reference array1HeapElement.Stack[0] = array2; heap.GCMarkAndSweep(new List<StackValue>() { }, testExecutive); HeapElement array1Hpe; Assert.IsFalse(heap.TryGetHeapElement(array1, out array1Hpe)); HeapElement array2Hpe; Assert.IsFalse(heap.TryGetHeapElement(array2, out array2Hpe)); }
public void TestSelfReference() { var heap = new Heap(); var array = heap.AllocateArray(new StackValue[] { StackValue.Null }); var arrayHeapElement = heap.GetHeapElement(array); // self reference arrayHeapElement.Stack[0] = array; heap.GCMarkAndSweep(new List<StackValue>() {}, testExecutive); HeapElement releasedHeapElement; Assert.IsFalse(heap.TryGetHeapElement(array, out releasedHeapElement)); }
public void TestNonPointers01() { var heap = new Heap(); var values = new StackValue[] { StackValue.BuildInt(0), StackValue.BuildInt(1), StackValue.BuildInt(2) }; var array1 = heap.AllocateArray(values); var allTypes = new List<StackValue>(); var rawPointer = (int)array1.RawIntValue; for (int i = 0; i < (int)AddressType.ArrayKey; ++i) { var val = new StackValue() { optype = (AddressType)i, opdata = rawPointer }; if (!val.IsReferenceType) { allTypes.Add(val); } } var array2 = heap.AllocateArray(allTypes.ToArray()); heap.GCMarkAndSweep(new List<StackValue>() { array1}, testExecutive); var arrayHeapElement = heap.GetHeapElement(array1); Assert.IsNotNull(arrayHeapElement); heap.Free(); }
public void TestDictionary() { var heap = new Heap(); var key = heap.AllocateArray(new StackValue[] { StackValue.BuildInt(42) }); var val = heap.AllocateString("Hello world"); var dict = new Dictionary<StackValue, StackValue>(); dict[key] = val; var array = heap.AllocateArray(new StackValue[] { }, dict); heap.GCMarkAndSweep(new List<StackValue>() {}, testExecutive); var valHeapElement = heap.GetHeapElement(val); Assert.IsNull(valHeapElement); var arrayHeapElement = heap.GetHeapElement(array); Assert.IsNull(arrayHeapElement); }
public void TestMultiDimensionaldArray() { var heap = new Heap(); var array1 = heap.AllocateArray(new StackValue[] { StackValue.BuildInt(0) }); var array2 = heap.AllocateArray(new StackValue[] { array1 }); var array3 = heap.AllocateArray(new StackValue[] { array2 }); heap.GCMarkAndSweep(new List<StackValue>() {}, testExecutive); var array1HeapElement = heap.GetHeapElement(array1); Assert.IsNull(array1HeapElement); var array2HeapElement = heap.GetHeapElement(array2); Assert.IsNull(array2HeapElement); var array3HeapElement = heap.GetHeapElement(array3); Assert.IsNull(array3HeapElement); }
public void TestNonPointers02() { var heap = new Heap(); var values = new StackValue[] { StackValue.BuildInt(0), StackValue.BuildInt(1), StackValue.BuildInt(2) }; var array = heap.AllocateArray(values); var allTypes = new List<StackValue>(); var rawPointer = (int)array.RawIntValue; for (int i = 0; i < (int)AddressType.ArrayKey; ++i) { var val = new StackValue() { optype = (AddressType)i, opdata = rawPointer }; if (!val.IsReferenceType) { allTypes.Add(val); } } // non pointer gc root won't retain memory heap.GCMarkAndSweep(allTypes, testExecutive); var arrayHeapElement = heap.GetHeapElement(array); Assert.IsNull(arrayHeapElement); heap.Free(); }