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