Example #1
0
        private static ArgumentAtLevel GetArgumentAtLevel(StackValue argument, AtLevel atLevel, RuntimeCore runtimeCore)
        {
            if (atLevel.Level >= 0)
            {
                return(new ArgumentAtLevel(argument));
            }

            int maxDepth    = Replicator.GetMaxReductionDepth(argument, runtimeCore);
            int nestedLevel = maxDepth + atLevel.Level;

            // Promote the array
            while (nestedLevel < 0)
            {
                try
                {
                    argument = runtimeCore.RuntimeMemory.Heap.AllocateArray(new StackValue[1] {
                        argument
                    });
                }
                catch (RunOutOfMemoryException)
                {
                    runtimeCore.RuntimeStatus.LogWarning(Runtime.WarningID.RunOutOfMemory, Resources.RunOutOfMemory);
                    return(null);
                }
                nestedLevel++;
            }

            if (nestedLevel == 0)
            {
                return(new ArgumentAtLevel(argument));
            }
            else
            {
                var elements = GetElementsAtLevel(argument, nestedLevel, new List <int>(), atLevel.IsDominant, runtimeCore);
                try
                {
                    argument = runtimeCore.RuntimeMemory.Heap.AllocateArray(elements.Select(e => e.Element).ToArray());
                }
                catch (RunOutOfMemoryException)
                {
                    runtimeCore.RuntimeStatus.LogWarning(Runtime.WarningID.RunOutOfMemory, Resources.RunOutOfMemory);
                    return(null);
                }
                var indices = elements.Select(e => e.Indices).ToList();
                return(new ArgumentAtLevel(argument, indices, atLevel.IsDominant));
            }
        }
Example #2
0
        private static ArgumentAtLevel GetArgumentAtLevel(StackValue argument, AtLevel atLevel, RuntimeCore runtimeCore)
        {
            if (atLevel.Level >= 0)
            {
                return new ArgumentAtLevel(argument);
            }

            int maxDepth = Replicator.GetMaxReductionDepth(argument, runtimeCore);
            int nestedLevel = maxDepth + atLevel.Level;

            // Promote the array
            while (nestedLevel < 0)
            {
                argument = runtimeCore.RuntimeMemory.Heap.AllocateArray(new StackValue[1] { argument });
                nestedLevel++;
            }

            if (nestedLevel == 0)
            {
                return new ArgumentAtLevel(argument);
            }
            else
            {
                var elements = GetElementsAtLevel(argument, nestedLevel, new List<int>(), atLevel.IsDominant, runtimeCore);
                argument = runtimeCore.RuntimeMemory.Heap.AllocateArray(elements.Select(e => e.Element).ToArray());
                var indices = elements.Select(e => e.Indices).ToList();
                return new ArgumentAtLevel(argument, indices, atLevel.IsDominant);
            }
        }
Example #3
0
        private static ArgumentAtLevel GetArgumentAtLevel(StackValue argument, AtLevel atLevel, RuntimeCore runtimeCore)
        {
            if (atLevel.Level >= 0)
            {
                return new ArgumentAtLevel(argument);
            }

            int maxDepth = Replicator.GetMaxReductionDepth(argument, runtimeCore);
            int nestedLevel = maxDepth + atLevel.Level;

            // Promote the array
            while (nestedLevel < 0)
            {
                try
                {
                    argument = runtimeCore.RuntimeMemory.Heap.AllocateArray(new StackValue[1] { argument });
                }
                catch (RunOutOfMemoryException)
                {
                    runtimeCore.RuntimeStatus.LogWarning(Runtime.WarningID.RunOutOfMemory, Resources.RunOutOfMemory);
                    return null;
                }
                nestedLevel++;
            }

            if (nestedLevel == 0)
            {
                return new ArgumentAtLevel(argument);
            }
            else
            {
                var elements = GetElementsAtLevel(argument, nestedLevel, new List<int>(), atLevel.IsDominant, runtimeCore);
                try
                {
                    argument = runtimeCore.RuntimeMemory.Heap.AllocateArray(elements.Select(e => e.Element).ToArray());
                }
                catch (RunOutOfMemoryException)
                {
                    runtimeCore.RuntimeStatus.LogWarning(Runtime.WarningID.RunOutOfMemory, Resources.RunOutOfMemory);
                    return null;
                }
                var indices = elements.Select(e => e.Indices).ToList();
                return new ArgumentAtLevel(argument, indices, atLevel.IsDominant);
            }
        }