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