/*******************************************************************************
 * 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;
	}

}
