if (debug) System.out.println("	" + f);
if (DEBUG) System.out.println("	" + f);
	public void sawOpcode(int seen) {		if (debug) System.out.println(getPC() + "	" + OPCODE_NAMES[seen] + "	" + stage + "	" + count + "	" + countSinceGetReference);		if (seen == MONITORENTER) sawMonitorEnter = true;		if (seen == GETFIELD || seen == GETSTATIC) {			pendingFieldLoad = FieldAnnotation.fromReferencedField(this);			if (debug) System.out.println("	" + pendingFieldLoad);			String sig = getSigConstantOperand();			if (sig.equals("Z")) {				countSinceGetBoolean = 0;				countSinceGetReference++;			} else if (sig.startsWith("L") || sig.startsWith("[")) {				countSinceGetBoolean++;				countSinceGetReference = 0;			}		} else {			countSinceGetReference++;		}		switch (stage) {		case 0:			if (((seen == IFNULL || seen == IFNONNULL) && countSinceGetReference < 5)			        || ((seen == IFEQ || seen == IFNE) && countSinceGetBoolean < 5)) {				int b = getBranchOffset();				if (debug) {					System.out.println("branch offset is : " + b);				}				if (b > 0				        && !(seen == IFNULL && b > 9)				        && !(seen == IFEQ && (b > 9 && b < 34))				        && !(seen == IFNE && (b > 9 && b < 34))				        && (!sawMonitorEnter)) {					fields.add(pendingFieldLoad);					startPC = getPC();					stage = 1;				}			}			count = 0;			break;		case 1:			if (seen == MONITORENTER) {				stage = 2;				count = 0;			} else if (((seen == IFNULL || seen == IFNONNULL) && countSinceGetReference < 5)			        || ((seen == IFEQ || seen == IFNE) && countSinceGetBoolean < 5)) {				int b = getBranchOffset();				if (b > 0 && (seen == IFNONNULL || b < 10)) {					fields.add(pendingFieldLoad);					startPC = getPC();					count = 0;				}			} else {				count++;				if (count > 10) stage = 0;			}			break;		case 2:			if (((seen == IFNULL || seen == IFNONNULL) && countSinceGetReference < 5)			        || ((seen == IFEQ || seen == IFNE) && countSinceGetBoolean < 5)) {				if (getBranchOffset() >= 0 && fields.contains(pendingFieldLoad)) {					endPC = getPC();					stage++;					twice.add(pendingFieldLoad);					break;				}			}			count++;			if (count > 10) stage = 0;			break;		case 3:			if (seen == PUTFIELD || seen == PUTSTATIC) {				FieldAnnotation f = FieldAnnotation.fromReferencedField(this);				if (debug) System.out.println("	" + f);				if (twice.contains(f) && !getNameConstantOperand().startsWith("class$")				        && !getSigConstantOperand().equals("Ljava/lang/String;")) {					Field declaration = findField(getClassConstantOperand(), getNameConstantOperand());					/*					System.out.println(f);					System.out.println(declaration);					System.out.println(getSigConstantOperand());					*/					if (declaration == null || !declaration.isVolatile())						bugReporter.reportBug(new BugInstance(this, "DC_DOUBLECHECK", NORMAL_PRIORITY)						        .addClassAndMethod(this)						        .addField(f).describe("FIELD_ON")						        .addSourceLineRange(this, startPC, endPC));					stage++;				}			}			break;		default:		}	}