Package org.eclipse.jdt.internal.debug.eval.ast.instructions

Source Code of org.eclipse.jdt.internal.debug.eval.ast.instructions.Instruction

/*******************************************************************************
* Copyright (c) 2000, 2012 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.debug.core.model.IVariable;
import org.eclipse.jdt.debug.core.IJavaArrayType;
import org.eclipse.jdt.debug.core.IJavaClassObject;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaFieldVariable;
import org.eclipse.jdt.debug.core.IJavaObject;
import org.eclipse.jdt.debug.core.IJavaReferenceType;
import org.eclipse.jdt.debug.core.IJavaType;
import org.eclipse.jdt.debug.core.IJavaValue;
import org.eclipse.jdt.debug.core.IJavaVariable;
import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
import org.eclipse.jdt.internal.debug.eval.ast.engine.IRuntimeContext;
import org.eclipse.jdt.internal.debug.eval.ast.engine.Interpreter;
import org.eclipse.osgi.util.NLS;

/**
* Common behavior for instructions.
*/
public abstract class Instruction {

  private Interpreter fInterpreter;

  public abstract int getSize();

  public void setInterpreter(Interpreter interpreter) {
    fInterpreter = interpreter;
  }

  public void setLastValue(IJavaValue value) {
    fInterpreter.setLastValue(value);
  }

  public void stop() {
    fInterpreter.stop();
  }

  public static int getBinaryPromotionType(int left, int right) {
    return fTypeTable[left][right];
  }

  public abstract void execute() throws CoreException;

  protected IRuntimeContext getContext() {
    return fInterpreter.getContext();
  }

  protected IJavaDebugTarget getVM() {
    return getContext().getVM();
  }

  /**
   * Return the internal variable with the given name.
   *
   * @see Interpreter#getInternalVariable(String)
   */
  protected IVariable getInternalVariable(String name) {
    return fInterpreter.getInternalVariable(name);
  }

  /**
   * Create and return a new internal variable with the given name and the
   * given type.
   *
   * @see Interpreter#createInternalVariable(String, String)
   */
  protected IVariable createInternalVariable(String name,
      IJavaType referencType) {
    return fInterpreter.createInternalVariable(name, referencType);
  }

  /**
   * Answers the instance of Class that the given type represents.
   */
  protected IJavaObject getClassObject(IJavaType type) throws CoreException {
    if (type instanceof IJavaReferenceType) {
      return ((IJavaReferenceType) type).getClassObject();
    }
    return null;
  }

  protected void jump(int offset) {
    fInterpreter.jump(offset);
  }

  protected void push(Object object) {
    fInterpreter.push(object);
  }

  protected Object pop() {
    return fInterpreter.pop();
  }

  protected IJavaValue popValue() throws CoreException {
    Object element = fInterpreter.pop();
    if (element instanceof IJavaVariable) {
      return (IJavaValue) ((IJavaVariable) element).getValue();
    }
    return (IJavaValue) element;
  }

  protected void pushNewValue(boolean value) {
    fInterpreter.push(newValue(value));
  }

  protected IJavaValue newValue(boolean value) {
    return getVM().newValue(value);
  }

  protected void pushNewValue(byte value) {
    fInterpreter.push(newValue(value));
  }

  protected IJavaValue newValue(byte value) {
    return getVM().newValue(value);
  }

  protected void pushNewValue(short value) {
    fInterpreter.push(newValue(value));
  }

  protected IJavaValue newValue(short value) {
    return getVM().newValue(value);
  }

  protected void pushNewValue(int value) {
    fInterpreter.push(newValue(value));
  }

  protected IJavaValue newValue(int value) {
    return getVM().newValue(value);
  }

  protected void pushNewValue(long value) {
    fInterpreter.push(newValue(value));
  }

  protected IJavaValue newValue(long value) {
    return getVM().newValue(value);
  }

  protected void pushNewValue(char value) {
    fInterpreter.push(newValue(value));
  }

  protected IJavaValue newValue(char value) {
    return getVM().newValue(value);
  }

  protected void pushNewValue(float value) {
    fInterpreter.push(newValue(value));
  }

  protected IJavaValue newValue(float value) {
    return getVM().newValue(value);
  }

  protected void pushNewValue(double value) {
    fInterpreter.push(newValue(value));
  }

  protected IJavaValue newValue(double value) {
    return getVM().newValue(value);
  }

  protected void pushNewValue(String value) {
    fInterpreter.push(newValue(value));
  }

  protected IJavaValue newValue(String value) {
    return getVM().newValue(value);
  }

  protected void pushNullValue() {
    fInterpreter.push(nullValue());
  }

  protected IJavaValue nullValue() {
    return getVM().nullValue();
  }

  public static int getUnaryPromotionType(int typeId) {
    return fTypeTable[typeId][T_int];
  }

  protected IJavaType getType(String qualifiedName) throws CoreException {
    // Force the class to be loaded, and record the class reference
    // for later use if there are multiple classes with the same name.
    IJavaClassObject classReference = getContext().classForName(
        qualifiedName);
    // Found many classes, look for the right one for this scope.
    if (classReference == null) {
      throw new CoreException(new Status(IStatus.ERROR,
          JDIDebugPlugin.getUniqueIdentifier(), IStatus.OK,
          NLS.bind(
              InstructionsEvaluationMessages.Instruction_No_type,
              new String[] { qualifiedName }), null));
    }
    return classReference.getInstanceType();
  }

  /**
   * Returns the primitive type with the given name.
   *
   * @param name
   *            type name, for example - "int"
   * @return primitive type
   * @throws CoreException
   */
  protected IJavaType getPrimitiveType(String name) throws CoreException {
    IJavaReferenceType type = null;
    if ("boolean".equals(name)) { //$NON-NLS-1$
      type = (IJavaReferenceType) getType("java.lang.Boolean"); //$NON-NLS-1$
    } else if ("byte".equals(name)) { //$NON-NLS-1$
      type = (IJavaReferenceType) getType("java.lang.Byte"); //$NON-NLS-1$
    } else if ("char".equals(name)) { //$NON-NLS-1$
      type = (IJavaReferenceType) getType("java.lang.Character"); //$NON-NLS-1$
    } else if ("double".equals(name)) { //$NON-NLS-1$
      type = (IJavaReferenceType) getType("java.lang.Double"); //$NON-NLS-1$
    } else if ("float".equals(name)) { //$NON-NLS-1$
      type = (IJavaReferenceType) getType("java.lang.Float"); //$NON-NLS-1$
    } else if ("int".equals(name)) { //$NON-NLS-1$
      type = (IJavaReferenceType) getType("java.lang.Integer"); //$NON-NLS-1$
    } else if ("long".equals(name)) { //$NON-NLS-1$
      type = (IJavaReferenceType) getType("java.lang.Long"); //$NON-NLS-1$
    } else if ("short".equals(name)) { //$NON-NLS-1$
      type = (IJavaReferenceType) getType("java.lang.Short"); //$NON-NLS-1$
    } else if ("void".equals(name)) { //$NON-NLS-1$
      type = (IJavaReferenceType) getType("java.lang.Void"); //$NON-NLS-1$
    }
    if (type != null) {
      IJavaFieldVariable field = type.getField("TYPE"); //$NON-NLS-1$
      IJavaClassObject clazz = (IJavaClassObject) field.getValue();
      return clazz.getInstanceType();
    }
    throw new CoreException(new Status(IStatus.ERROR,
        JDIDebugPlugin.getUniqueIdentifier(), IStatus.OK,
        NLS.bind(
            InstructionsEvaluationMessages.Instruction_No_type,
            new String[] { name }), null));
  }

  protected IJavaArrayType getArrayType(String typeSignature, int dimension)
      throws CoreException {
    String qualifiedName = RuntimeSignature.toString(typeSignature);
    String braces = ""; //$NON-NLS-1$
    for (int i = 0; i < dimension; i++) {
      qualifiedName += "[]"; //$NON-NLS-1$
      braces += "["; //$NON-NLS-1$
    }
    String signature = braces + typeSignature;
    // Force the class to be loaded, and record the class reference
    // for later use if there are multiple classes with the same name.
    IJavaObject classReference = getContext().classForName(signature);
    if (classReference == null) {
      throw new CoreException(new Status(IStatus.ERROR,
          JDIDebugPlugin.getUniqueIdentifier(), IStatus.OK,
          NLS.bind(
              InstructionsEvaluationMessages.Instruction_No_type,
              new String[] { qualifiedName }), null));
    }
    IJavaType[] types = getVM().getJavaTypes(qualifiedName);
    checkTypes(types, qualifiedName);
    if (types.length == 1) {
      // Found only one class.
      return (IJavaArrayType) types[0];
    }
    // Found many classes, look for the right one for this scope.
    for (IJavaType type : types) {
      if (classReference.equals(getClassObject(type))) {
        return (IJavaArrayType) type;
      }
    }

    // At this point a very strange thing has happened,
    // the VM was able to return multiple types in the classesByName
    // call, but none of them were the class that was returned in
    // the classForName call.

    throw new CoreException(new Status(IStatus.ERROR,
        JDIDebugPlugin.getUniqueIdentifier(), IStatus.OK,
        NLS.bind(
            InstructionsEvaluationMessages.Instruction_No_type,
            new String[] { qualifiedName }), null));
  }

  protected void checkTypes(IJavaType[] types, String qualifiedName)
      throws CoreException {
    if (types == null || types.length == 0) {
      throw new CoreException(new Status(IStatus.ERROR,
          JDIDebugPlugin.getUniqueIdentifier(), IStatus.OK,
          NLS.bind(
              InstructionsEvaluationMessages.Instruction_No_type,
              new String[] { qualifiedName }), null));
    }
  }

  static public final int T_undefined = 0;
  static public final int T_Object = 1;
  static public final int T_char = 2;
  static public final int T_byte = 3;
  static public final int T_short = 4;
  static public final int T_boolean = 5;
  static public final int T_void = 6;
  static public final int T_long = 7;
  static public final int T_double = 8;
  static public final int T_float = 9;
  static public final int T_int = 10;
  static public final int T_String = 11;
  static public final int T_null = 12;

  private static final int[][] fTypeTable = {
      /* undefined */{ T_undefined, T_undefined, T_undefined,
          T_undefined, T_undefined, T_undefined, T_undefined,
          T_undefined, T_undefined, T_undefined, T_undefined,
          T_undefined, T_undefined },
      /* object */{ T_undefined, T_undefined, T_undefined, T_undefined,
          T_undefined, T_undefined, T_undefined, T_undefined,
          T_undefined, T_undefined, T_undefined, T_String,
          T_undefined },
      /* char */{ T_undefined, T_undefined, T_int, T_int, T_int,
          T_undefined, T_undefined, T_long, T_double, T_float, T_int,
          T_String, T_undefined },
      /* byte */{ T_undefined, T_undefined, T_int, T_int, T_int,
          T_undefined, T_undefined, T_long, T_double, T_float, T_int,
          T_String, T_undefined },
      /* short */{ T_undefined, T_undefined, T_int, T_int, T_int,
          T_undefined, T_undefined, T_long, T_double, T_float, T_int,
          T_String, T_undefined },
      /* boolean */{ T_undefined, T_undefined, T_undefined, T_undefined,
          T_undefined, T_boolean, T_undefined, T_undefined,
          T_undefined, T_undefined, T_undefined, T_String,
          T_undefined },
      /* void */{ T_undefined, T_undefined, T_undefined, T_undefined,
          T_undefined, T_undefined, T_undefined, T_undefined,
          T_undefined, T_undefined, T_undefined, T_undefined,
          T_undefined },
      /* long */{ T_undefined, T_undefined, T_long, T_long, T_long,
          T_undefined, T_undefined, T_long, T_double, T_float,
          T_long, T_String, T_undefined },
      /* double */{ T_undefined, T_undefined, T_double, T_double,
          T_double, T_undefined, T_undefined, T_double, T_double,
          T_double, T_double, T_String, T_undefined },
      /* float */{ T_undefined, T_undefined, T_float, T_float, T_float,
          T_undefined, T_undefined, T_float, T_double, T_float,
          T_float, T_String, T_undefined },
      /* int */{ T_undefined, T_undefined, T_int, T_int, T_int,
          T_undefined, T_undefined, T_long, T_double, T_float, T_int,
          T_String, T_undefined },
      /* String */{ T_undefined, T_String, T_String, T_String, T_String,
          T_String, T_undefined, T_String, T_String, T_String,
          T_String, T_String, T_String },
      /* null */{ T_undefined, T_undefined, T_undefined, T_undefined,
          T_undefined, T_undefined, T_undefined, T_undefined,
          T_undefined, T_undefined, T_undefined, T_String,
          T_undefined }, };
}
TOP

Related Classes of org.eclipse.jdt.internal.debug.eval.ast.instructions.Instruction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.