00001 package gov.nasa.arc.ase.jpf.jvm.bytecode;
00002
00003 import de.fub.bytecode.classfile.ConstantPool;
00004 import de.fub.bytecode.generic.ConstantPoolGen;
00005 import gov.nasa.arc.ase.jpf.jvm.SystemState;
00006 import gov.nasa.arc.ase.jpf.jvm.KernelState;
00007 import gov.nasa.arc.ase.jpf.jvm.ThreadInfo;
00008 import gov.nasa.arc.ase.jpf.jvm.ElementInfo;
00009 import gov.nasa.arc.ase.jpf.InternalErrorException;
00010 import gov.nasa.arc.ase.jpf.jvm.Types;
00011 import gov.nasa.arc.ase.util.Debug;
00012
00013
00014
00015
00016 public class GETFIELD extends Instruction {
00017 private String fname;
00018 private int size;
00019
00020 public Instruction execute(SystemState ss, KernelState ks, ThreadInfo th) {
00021 int objref = th.pop();
00022
00023 ElementInfo e = ks.da.get(objref);
00024
00025 switch(size) {
00026 case 1:
00027 if(e.isFieldRef(fname))
00028 th.push(e.getField(fname), true);
00029 else
00030 th.push(e.getField(fname), false);
00031 break;
00032
00033 case 2:
00034 th.longPush(e.getLongField(fname));
00035 break;
00036
00037 default:
00038 throw new InternalErrorException("invalid field type");
00039 }
00040
00041
00042
00043
00044
00045
00046 return th.getPC().getNext();
00047 }
00048 public void setPeer(de.fub.bytecode.generic.Instruction i, ConstantPool cp) {
00049 fname = ((de.fub.bytecode.generic.GETFIELD)i).getFieldName(new ConstantPoolGen(cp));
00050 size = ((de.fub.bytecode.generic.GETFIELD)i).getFieldType(new ConstantPoolGen(cp)).getSize();
00051 }
00052 }