| /******************************************************************************* |
| * Copyright (c) 2000, 2011 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.debug.eval.ast.instructions; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.jdt.debug.core.IJavaArray; |
| import org.eclipse.jdt.debug.core.IJavaArrayType; |
| import org.eclipse.jdt.debug.core.IJavaPrimitiveValue; |
| import org.eclipse.jdt.debug.core.IJavaType; |
| |
| public class ArrayAllocation extends ArrayInstruction { |
| |
| private int fDimension; |
| |
| private int fExprDimension; |
| |
| private boolean fHasInitializer; |
| |
| private IJavaArrayType[] fCachedArrayTypes; |
| |
| /** |
| * Constructor for ArrayAllocation. |
| * |
| * @param start |
| */ |
| public ArrayAllocation(int dimension, int exprDimension, |
| boolean hasInitializer, int start) { |
| super(start); |
| fDimension = dimension; |
| fExprDimension = exprDimension; |
| fHasInitializer = hasInitializer; |
| } |
| |
| /* |
| * @see Instruction#execute() |
| */ |
| @Override |
| public void execute() throws CoreException { |
| if (fHasInitializer) { |
| IJavaArray array = (IJavaArray) popValue(); |
| pop(); // pop the type |
| push(array); |
| } else { |
| |
| int[] exprDimensions = new int[fExprDimension]; |
| |
| for (int i = fExprDimension - 1; i >= 0; i--) { |
| exprDimensions[i] = ((IJavaPrimitiveValue) popValue()) |
| .getIntValue(); |
| } |
| |
| IJavaType type = (IJavaType) pop(); |
| |
| fCachedArrayTypes = new IJavaArrayType[fDimension + 1]; |
| |
| for (int i = fDimension, lim = fDimension - fExprDimension; i > lim; i--) { |
| fCachedArrayTypes[i] = (IJavaArrayType) type; |
| type = ((IJavaArrayType) type).getComponentType(); |
| } |
| |
| IJavaArray array = createArray(fDimension, exprDimensions); |
| |
| push(array); |
| } |
| } |
| |
| /** |
| * Create and populate an array. |
| */ |
| private IJavaArray createArray(int dimension, int[] exprDimensions) |
| throws CoreException { |
| |
| IJavaArray array = fCachedArrayTypes[dimension] |
| .newInstance(exprDimensions[0]); |
| |
| if (exprDimensions.length > 1) { |
| int[] newExprDimension = new int[exprDimensions.length - 1]; |
| for (int i = 0; i < newExprDimension.length; i++) { |
| newExprDimension[i] = exprDimensions[i + 1]; |
| } |
| |
| for (int i = 0; i < exprDimensions[0]; i++) { |
| array.setValue(i, createArray(dimension - 1, newExprDimension)); |
| } |
| |
| } |
| |
| return array; |
| } |
| |
| @Override |
| public String toString() { |
| return InstructionsEvaluationMessages.ArrayAllocation_array_allocation_1; |
| } |
| |
| } |