Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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();
        }