blob: 149ff6102e33fbe988be1e19e9137f87734c9b10 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}
}
}
}