/******************************************************************************* * Copyright (c) 2000, 2015 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.jdi.internal; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import com.sun.jdi.InternalException; import com.sun.jdi.PrimitiveType; import com.sun.jdi.PrimitiveValue; /** * this class implements the corresponding interfaces declared by the JDI * specification. See the com.sun.jdi package for more information. * */ public abstract class PrimitiveValueImpl extends ValueImpl implements PrimitiveValue { /** Primitive value in wrapper. */ Object fValue; /** * Creates new ValueImpl. */ public PrimitiveValueImpl(String description, VirtualMachineImpl vmImpl, Object value) { super(description, vmImpl); fValue = value; } /** * @return Returns Primitive Value converted to required type. */ @Override public boolean booleanValue() { if (fValue instanceof Boolean) return ((Boolean) fValue).booleanValue(); else if (fValue instanceof Character) return ((Character) fValue).charValue() != 0; else return ((Number) fValue).doubleValue() != 0; } /** * @return Returns Primitive Value converted to required type. */ @Override public char charValue() { if (fValue instanceof Boolean) return ((Boolean) fValue).booleanValue() ? (char) 1 : (char) 0; else if (fValue instanceof Character) return ((Character) fValue).charValue(); else return (char) ((Number) fValue).intValue(); } /** * @return Returns Primitive Value converted to required type. */ @Override public byte byteValue() { if (fValue instanceof Boolean) return ((Boolean) fValue).booleanValue() ? (byte) 1 : (byte) 0; else if (fValue instanceof Character) return (byte) ((Character) fValue).charValue(); else return ((Number) fValue).byteValue(); } /** * @return Returns Primitive Value converted to required type. */ @Override public double doubleValue() { if (fValue instanceof Boolean) return ((Boolean) fValue).booleanValue() ? (double) 1 : (double) 0; else if (fValue instanceof Character) return ((Character) fValue).charValue(); else return ((Number) fValue).doubleValue(); } /** * @return Returns Primitive Value converted to required type. */ @Override public float floatValue() { if (fValue instanceof Boolean) return ((Boolean) fValue).booleanValue() ? (float) 1 : (float) 0; else if (fValue instanceof Character) return ((Character) fValue).charValue(); else return ((Number) fValue).floatValue(); } /** * @return Returns Primitive Value converted to required type. */ @Override public int intValue() { if (fValue instanceof Boolean) return ((Boolean) fValue).booleanValue() ? (int) 1 : (int) 0; else if (fValue instanceof Character) return ((Character) fValue).charValue(); else return ((Number) fValue).intValue(); } /** * @return Returns Primitive Value converted to required type. */ @Override public long longValue() { if (fValue instanceof Boolean) return ((Boolean) fValue).booleanValue() ? (long) 1 : (long) 0; else if (fValue instanceof Character) return ((Character) fValue).charValue(); else return ((Number) fValue).longValue(); } /** * @return Returns Primitive Value converted to required type. */ @Override public short shortValue() { if (fValue instanceof Boolean) return ((Boolean) fValue).booleanValue() ? (short) 1 : (short) 0; else if (fValue instanceof Character) return (short) ((Character) fValue).charValue(); else return ((Number) fValue).shortValue(); } /** * @return Returns true if two values are equal. * @see java.lang.Object#equals(Object) */ @Override public boolean equals(Object object) { return object != null && object.getClass().equals(this.getClass()) && fValue.equals(((PrimitiveValueImpl) object).fValue); } /** * @return Returns a has code for this object. * @see java.lang.Object#hashCode */ @Override public int hashCode() { return fValue.hashCode(); } /** * @return Returns description of Mirror object. */ @Override public String toString() { return fValue.toString(); } /** * Writes value without value tag. */ @Override public abstract void write(MirrorImpl target, DataOutputStream out) throws IOException; /** * @return Reads JDWP representation and returns new instance. */ public static PrimitiveValueImpl readWithoutTag(MirrorImpl target, PrimitiveType type, DataInputStream in) throws IOException { switch (((PrimitiveTypeImpl) type).tag()) { case 0: return null; case BooleanValueImpl.tag: return BooleanValueImpl.read(target, in); case ByteValueImpl.tag: return ByteValueImpl.read(target, in); case CharValueImpl.tag: return CharValueImpl.read(target, in); case DoubleValueImpl.tag: return DoubleValueImpl.read(target, in); case FloatValueImpl.tag: return FloatValueImpl.read(target, in); case IntegerValueImpl.tag: return IntegerValueImpl.read(target, in); case LongValueImpl.tag: return LongValueImpl.read(target, in); case ShortValueImpl.tag: return ShortValueImpl.read(target, in); } throw new InternalException( JDIMessages.PrimitiveValueImpl_Invalid_Primitive_Value_tag_encountered___2 + type); } }