/******************************************************************************* * Copyright (c) 2000, 2008 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.compiler.codegen; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeIds; public class VerificationTypeInfo { /** * The tag value representing top variable info * * @since 3.2 */ public static final int ITEM_TOP= 0; /** * The tag value representing integer variable info * * @since 3.2 */ public static final int ITEM_INTEGER= 1; /** * The tag value representing float variable info * * @since 3.2 */ public static final int ITEM_FLOAT= 2; /** * The tag value representing double variable info * * @since 3.2 */ public static final int ITEM_DOUBLE= 3; /** * The tag value representing long variable info * * @since 3.2 */ public static final int ITEM_LONG= 4; /** * The tag value representing null variable info * * @since 3.2 */ public static final int ITEM_NULL= 5; /** * The tag value representing uninitialized this variable info * * @since 3.2 */ public static final int ITEM_UNINITIALIZED_THIS= 6; /** * The tag value representing object variable info * * @since 3.2 */ public static final int ITEM_OBJECT= 7; /** * The tag value representing uninitialized variable info * * @since 3.2 */ public static final int ITEM_UNINITIALIZED= 8; public int tag; private int id; private char[] constantPoolName; public int offset; private VerificationTypeInfo() { // for duplication } public VerificationTypeInfo(int id, char[] constantPoolName) { this(id, VerificationTypeInfo.ITEM_OBJECT, constantPoolName); } public VerificationTypeInfo(int id, int tag, char[] constantPoolName) { this.id= id; this.tag= tag; this.constantPoolName= constantPoolName; } public VerificationTypeInfo(int tag, TypeBinding binding) { this(binding); this.tag= tag; } public VerificationTypeInfo(TypeBinding binding) { this.id= binding.id; switch (binding.id) { case TypeIds.T_boolean: case TypeIds.T_byte: case TypeIds.T_char: case TypeIds.T_int: case TypeIds.T_short: this.tag= VerificationTypeInfo.ITEM_INTEGER; break; case TypeIds.T_float: this.tag= VerificationTypeInfo.ITEM_FLOAT; break; case TypeIds.T_long: this.tag= VerificationTypeInfo.ITEM_LONG; break; case TypeIds.T_double: this.tag= VerificationTypeInfo.ITEM_DOUBLE; break; case TypeIds.T_null: this.tag= VerificationTypeInfo.ITEM_NULL; break; default: this.tag= VerificationTypeInfo.ITEM_OBJECT; this.constantPoolName= binding.constantPoolName(); } } public void setBinding(TypeBinding binding) { this.constantPoolName= binding.constantPoolName(); final int typeBindingId= binding.id; this.id= typeBindingId; switch (typeBindingId) { case TypeIds.T_boolean: case TypeIds.T_byte: case TypeIds.T_char: case TypeIds.T_int: case TypeIds.T_short: this.tag= VerificationTypeInfo.ITEM_INTEGER; break; case TypeIds.T_float: this.tag= VerificationTypeInfo.ITEM_FLOAT; break; case TypeIds.T_long: this.tag= VerificationTypeInfo.ITEM_LONG; break; case TypeIds.T_double: this.tag= VerificationTypeInfo.ITEM_DOUBLE; break; case TypeIds.T_null: this.tag= VerificationTypeInfo.ITEM_NULL; break; default: this.tag= VerificationTypeInfo.ITEM_OBJECT; } } public int id() { return this.id; } public String toString() { StringBuffer buffer= new StringBuffer(); switch (this.tag) { case VerificationTypeInfo.ITEM_UNINITIALIZED_THIS: buffer.append("uninitialized_this(").append(readableName()).append(")"); //$NON-NLS-1$//$NON-NLS-2$ break; case VerificationTypeInfo.ITEM_UNINITIALIZED: buffer.append("uninitialized(").append(readableName()).append(")"); //$NON-NLS-1$//$NON-NLS-2$ break; case VerificationTypeInfo.ITEM_OBJECT: buffer.append(readableName()); break; case VerificationTypeInfo.ITEM_DOUBLE: buffer.append('D'); break; case VerificationTypeInfo.ITEM_FLOAT: buffer.append('F'); break; case VerificationTypeInfo.ITEM_INTEGER: buffer.append('I'); break; case VerificationTypeInfo.ITEM_LONG: buffer.append('J'); break; case VerificationTypeInfo.ITEM_NULL: buffer.append("null"); //$NON-NLS-1$ break; case VerificationTypeInfo.ITEM_TOP: buffer.append("top"); //$NON-NLS-1$ break; } return String.valueOf(buffer); } public VerificationTypeInfo duplicate() { final VerificationTypeInfo verificationTypeInfo= new VerificationTypeInfo(); verificationTypeInfo.id= this.id; verificationTypeInfo.tag= this.tag; verificationTypeInfo.constantPoolName= this.constantPoolName; verificationTypeInfo.offset= this.offset; return verificationTypeInfo; } public boolean equals(Object obj) { if (obj instanceof VerificationTypeInfo) { VerificationTypeInfo info1= (VerificationTypeInfo)obj; return info1.tag == this.tag && CharOperation.equals(info1.constantPoolName(), constantPoolName()); } return false; } public int hashCode() { return this.tag + this.id + this.constantPoolName.length + this.offset; } public char[] constantPoolName() { return this.constantPoolName; } public char[] readableName() { return this.constantPoolName; } public void replaceWithElementType() { if (this.constantPoolName[1] == 'L') { this.constantPoolName= CharOperation.subarray(this.constantPoolName, 2, this.constantPoolName.length - 1); } else { this.constantPoolName= CharOperation.subarray(this.constantPoolName, 1, this.constantPoolName.length); if (this.constantPoolName.length == 1) { switch (this.constantPoolName[0]) { case 'I': this.id= TypeIds.T_int; break; case 'B': this.id= TypeIds.T_byte; break; case 'S': this.id= TypeIds.T_short; break; case 'C': this.id= TypeIds.T_char; break; case 'J': this.id= TypeIds.T_long; break; case 'F': this.id= TypeIds.T_float; break; case 'D': this.id= TypeIds.T_double; break; case 'Z': this.id= TypeIds.T_boolean; break; case 'N': this.id= TypeIds.T_null; break; case 'V': this.id= TypeIds.T_void; break; } } } } }