/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * 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.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.debug.core.IJavaArray; import org.eclipse.jdt.debug.core.IJavaPrimitiveValue; import org.eclipse.jdt.debug.core.IJavaValue; import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin; import com.ibm.icu.text.MessageFormat; /** * Resolves an array access - the top of the stack is the position, and the * second from top is the array object. */ public class ArrayAccess extends ArrayInstruction { public ArrayAccess(int start) { super(start); } @Override public void execute() throws CoreException { int index = ((IJavaPrimitiveValue) popValue()).getIntValue(); IJavaArray array = popArray(); if (index >= array.getLength() || index < 0) { throw new CoreException( new Status( IStatus.ERROR, JDIDebugPlugin.getUniqueIdentifier(), IStatus.OK, MessageFormat .format(InstructionsEvaluationMessages.ArrayAccess_illegal_index, new Object[] { new Integer(index) }), null)); } push(array.getVariable(index)); } @Override public String toString() { return InstructionsEvaluationMessages.ArrayAccess_array_access_1; } /** * Pops an array object off the top of the stack. Throws an exception if not * an array object or <code>null</code>. * * @return array object on top of the stack * @throws CoreException * if not available */ protected IJavaArray popArray() throws CoreException { IJavaValue value = popValue(); if (value instanceof IJavaArray) { return (IJavaArray) value; } else if (value.isNull()) { // null pointer throw new CoreException(new Status(IStatus.ERROR, JDIDebugPlugin.getUniqueIdentifier(), IStatus.OK, InstructionsEvaluationMessages.ArrayAccess_0, null)); } else { // internal error throw new CoreException(new Status(IStatus.ERROR, JDIDebugPlugin.getUniqueIdentifier(), IStatus.OK, "Internal error: attempt to access non-array object", null)); //$NON-NLS-1$ } } }