} } 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());  if (declaration == null || !declaration.isVolatile()) bugReporter.reportBug(new BugInstance("DC_DOUBLECHECK", NORMAL_PRIORITY) .addClassAndMethod(this) .addField(f).describe("FIELD_ON") .addSourceLineRange(this, startPC, endPC)); stage++;
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());  if (declaration == null || !declaration.isVolatile()) bugReporter.reportBug(new BugInstance("DC_DOUBLECHECK", NORMAL_PRIORITY) .addClassAndMethod(this) .addField(f).describe("FIELD_ON") .addSourceLineRange(this, startPC, endPC)); stage++;
    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("DC_DOUBLECHECK", NORMAL_PRIORITY)					.addClassAndMethod(this)					.addField(f).describe("FIELD_ON")					.addSourceLineRange(this, startPC, endPC));				stage++;				}			}		break;	default:	}	}