00001 package gov.nasa.arc.ase.jpf.jvm.bytecode;
00002
00003 import de.fub.bytecode.generic.InstructionHandle;
00004 import gov.nasa.arc.ase.jpf.*;
00005 import gov.nasa.arc.ase.jpf.jvm.*;
00006 import gov.nasa.arc.ase.util.Debug;
00007
00008 public class ARETURN extends AbstractInstruction {
00009 private de.fub.bytecode.generic.ARETURN peer;
00010
00011 public InstructionHandle execute(SystemState ss, KernelState ks, ThreadInfo th) {
00012 MethodInfo mi = th.getCurrentMethod();
00013
00014 if (mi.getMethodGen().isSynchronized()) {
00015 if (mi.getMethodGen().isStatic()) {
00016 String className = mi.getClassInfo().getClassData().getClassName();
00017 ks.static_area.monitorUnlock(className, th);
00018 } else {
00019 ks.dynamic_area.monitorUnlock(th.getThis(), th);
00020 }
00021 }
00022
00023
00024
00025
00026
00027 int value = th.xpop();
00028
00029 th.popFrame();
00030 th.removeArguments(mi);
00031 th.push(value);
00032
00033
00034
00035 // th.setOperandRef(); // caller's stack frame
00036
00037
00038 return th.getPC().getNext();
00039 }
00040 public void setPeer(de.fub.bytecode.generic.Instruction i) {
00041 peer = (de.fub.bytecode.generic.ARETURN)i;
00042 }
00043 }