opu.lljvm-python.0.2.0-EXPERIMENTAL.source-code.VerificationTypeInfo Maven / Gradle / Ivy
The newest version!
/**
* VerificationTypeInfo are used by StackMap attributes
* @author $Author: Daniel Reynaud $
* @version $Revision: 1.0 $
*/
package jas;
import java.io.*;
public class VerificationTypeInfo
{
private int tag;
private ClassCP cls;
private int index;
private Label un_label;
public VerificationTypeInfo(String item) throws jasError
{ this(item, null); }
public VerificationTypeInfo(String item, String val)
throws jasError {
if(item.equals("Top"))
tag = 0;
else if(item.equals("Integer"))
tag = 1;
else if(item.equals("Float"))
tag = 2;
else if(item.equals("Long"))
tag = 4;
else if(item.equals("Double"))
tag = 3;
else if(item.equals("Null"))
tag = 5;
else if(item.equals("UninitializedThis"))
tag = 6;
else if(item.equals("Object")) {
if(val==null) throw new jasError("Object requires a class name");
cls = new ClassCP(val);
tag = 7;
}
else if(item.equals("Uninitialized")) {
if(val==null)
throw new jasError("Uninitialized requires an integer or label");
try {
index = Integer.parseInt(val);
} catch(Exception e) {
un_label = new Label(val);
}
tag = 8;
}
else throw new jasError("Unknown item verification type : "+item);
}
void resolve(ClassEnv e)
{
if(tag == 7) {
cls.resolve(e);
e.addCPItem(cls);
}
}
void write(ClassEnv e, CodeAttr ce, DataOutputStream out)
throws IOException, jasError
{
out.writeByte(tag);
if(tag == 7)
out.writeShort(e.getCPIndex(cls));
else if(tag == 8) { // Uninitialized
// the following is not fully compliant to the CLDC spec !
if(un_label != null)
un_label.writeOffset(ce, null, out);
else {
if((index&0xFFFF) == index) // fits as a short
out.writeShort(index);
else
out.writeInt(index);
}
}
}
// next methods used for StackMapFrame attribute (jdk1.6)
private int getOffset(CodeAttr ce) throws jasError
{
if(un_label != null)
return un_label.getOffset(ce);
return index;
}
boolean isEqual(ClassEnv e, CodeAttr ce, VerificationTypeInfo cmp)
throws jasError
{
if(tag != cmp.tag)
return false;
if(tag == 7)
return e.getCPIndex(cls) == e.getCPIndex(cmp.cls);
if(tag == 8)
return getOffset(ce) == cmp.getOffset(ce);
return true;
}
}