01: //
02: // Copyright (C) 2005 United States Government as represented by the
03: // Administrator of the National Aeronautics and Space Administration
04: // (NASA). All Rights Reserved.
05: //
06: // This software is distributed under the NASA Open Source Agreement
07: // (NOSA), version 1.3. The NOSA has been approved by the Open Source
08: // Initiative. See the file NOSA-1.3-JPF at the top of the distribution
09: // directory tree for the complete NOSA document.
10: //
11: // THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY
12: // KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
13: // LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
14: // SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
15: // A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT
16: // THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT
17: // DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE.
18: //
19: package gov.nasa.jpf.jvm.bytecode;
20:
21: import gov.nasa.jpf.JPFException;
22: import gov.nasa.jpf.jvm.KernelState;
23: import gov.nasa.jpf.jvm.SystemState;
24: import gov.nasa.jpf.jvm.ThreadInfo;
25: import gov.nasa.jpf.jvm.ClassInfo;
26: import gov.nasa.jpf.jvm.Types;
27:
28: import org.apache.bcel.classfile.ConstantFloat;
29: import org.apache.bcel.classfile.ConstantInteger;
30: import org.apache.bcel.classfile.ConstantPool;
31: import org.apache.bcel.classfile.ConstantString;
32: import org.apache.bcel.generic.ConstantPoolGen;
33: import org.apache.bcel.generic.Type;
34:
35: /**
36: * Push item from runtime constant pool
37: * ... => ..., value
38: */
39: public class LDC extends Instruction {
40: private String string;
41: private int value;
42: private boolean isString;
43:
44: public void setPeer(org.apache.bcel.generic.Instruction i,
45: ConstantPool cp) {
46: ConstantPoolGen cpg = ClassInfo.getConstantPoolGen(cp);
47: Type type = ((org.apache.bcel.generic.LDC) i).getType(cpg);
48:
49: if (type == Type.STRING) {
50: isString = true;
51: string = cp
52: .constantToString(cp
53: .getConstant(((ConstantString) cp
54: .getConstant(((org.apache.bcel.generic.LDC) i)
55: .getIndex()))
56: .getStringIndex()));
57: } else if (type == Type.INT) {
58: isString = false;
59: string = null;
60: value = ((ConstantInteger) cp
61: .getConstant(((org.apache.bcel.generic.LDC) i)
62: .getIndex())).getBytes();
63: } else if (type == Type.FLOAT) {
64: isString = false;
65: string = null;
66: value = Types.floatToInt(((ConstantFloat) cp
67: .getConstant(((org.apache.bcel.generic.LDC) i)
68: .getIndex())).getBytes());
69: } else {
70: throw new JPFException("invalid type of constant");
71: }
72: }
73:
74: public Instruction execute(SystemState ss, KernelState ks,
75: ThreadInfo th) {
76: if (isString) {
77: th.push(ks.da.newConstantString(string), true);
78: } else {
79: th.push(value, false);
80: }
81:
82: return getNext(th);
83: }
84:
85: public int getByteCode() {
86: return 0x12;
87: }
88: }
|