001: //
002: // Copyright (C) 2005 United States Government as represented by the
003: // Administrator of the National Aeronautics and Space Administration
004: // (NASA). All Rights Reserved.
005: //
006: // This software is distributed under the NASA Open Source Agreement
007: // (NOSA), version 1.3. The NOSA has been approved by the Open Source
008: // Initiative. See the file NOSA-1.3-JPF at the top of the distribution
009: // directory tree for the complete NOSA document.
010: //
011: // THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY
012: // KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
013: // LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
014: // SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
015: // A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT
016: // THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT
017: // DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE.
018: //
019: package gov.nasa.jpf.jvm;
020:
021: import gov.nasa.jpf.JPFException;
022:
023: /**
024: * A specialized version of ElementInfo for use in the StaticArea. The
025: * StaticElementInfo is only used to store "static class fields" in the
026: * StaticArea. It specifically knows about the relationship amongst
027: * classes, and will recursively lookup a data member if needed.
028: *
029: * @see gov.nasa.jpf.jvm.ElementInfo
030: */
031: public class StaticElementInfo extends ElementInfo {
032: static final int storingDataLength = ElementInfo.storingDataLength + 1;
033: int classObjectRef = -1;
034:
035: public StaticElementInfo() {
036: }
037:
038: public StaticElementInfo(Fields f, Monitor m, int classObjRef) {
039: super (f, m);
040: classObjectRef = classObjRef;
041: }
042:
043: protected FieldInfo getFieldInfo(String clsBase, String fname) {
044: ClassInfo ci = getClassInfo();
045: FieldInfo fi = ci.getStaticField(clsBase, fname);
046:
047: if (fi == null) {
048: throw new JPFException("class " + ci.getName()
049: + " has no static field " + fname);
050: }
051: return fi;
052: }
053:
054: public int getNumberOfFields() {
055: return getClassInfo().getNumberOfStaticFields();
056: }
057:
058: public FieldInfo getFieldInfo(int fieldIndex) {
059: return getClassInfo().getStaticField(fieldIndex);
060: }
061:
062: protected ElementInfo getElementInfo(ClassInfo ci) {
063: if (ci == getClassInfo()) {
064: return this ;
065: } else {
066: return ((StaticArea) area).get(ci.getName());
067: }
068: }
069:
070: /**
071: * override the ElementInfo methods - we have an additional field
072: * (for the sake of efficiency, we duplicate some code to save
073: * a call, this is a high-frequency op)
074: */
075: public int getStoringDataLength() {
076: return storingDataLength;
077: }
078:
079: public void backtrackTo(ArrayOffset storing, Object backtrack) {
080: super .backtrackTo(storing, backtrack);
081:
082: classObjectRef = storing.get();
083: }
084:
085: /**
086: * mark all our fields as static (shared) reachable. No need to set our own
087: * attributes, since we reside in the StaticArea
088: * @aspects: gc
089: */
090: void markStaticRoot() {
091: // WATCH IT! this overrides the heap object behavior in our super class.
092: // See ElementInfo.markStaticRoot() for details
093:
094: DynamicArea heap = DynamicArea.getHeap();
095: ClassInfo ci = getClassInfo();
096: int n = ci.getNumberOfStaticFields();
097:
098: for (int i = 0; i < n; i++) {
099: FieldInfo fi = ci.getStaticField(i);
100: if (fi.isReference()) {
101: heap.markStaticRoot(fields.getIntValue(fi
102: .getStorageOffset()));
103: }
104: }
105:
106: // don't forget the class object itself (which is not a field)
107: heap.markStaticRoot(classObjectRef);
108: }
109:
110: public int storeDataTo(int[] buffer, int idx) {
111: idx += super .storeDataTo(buffer, idx);
112:
113: buffer[idx] = classObjectRef;
114:
115: return 3;
116: }
117:
118: protected Ref getRef() {
119: return new ClassRef(getIndex());
120: }
121:
122: int getClassObjectRef() {
123: return classObjectRef;
124: }
125:
126: public String toString() {
127: return getClassInfo().getName(); // don't append index (useless and misleading for statics)
128: }
129:
130: private void blowup() {
131: throw new JPFException(
132: "cannot access StaticElementInfo by index");
133: }
134: }
|