pop(); break;
 	public void sawOpcode(DismantleBytecode dbc, int seen) { 		int register, intConstant; 		JavaClass cls; 		String signature; 		Item it, it2, it3; 		Constant cons; 		 		try 		{	 		switch (seen) {	 			case ALOAD:	 				pushByLocalObjectLoad(dbc, dbc.getRegisterOperand());	 			break;	 				 			case ALOAD_0:	 			case ALOAD_1:	 			case ALOAD_2:	 			case ALOAD_3:	 				pushByLocalObjectLoad(dbc, seen - ALOAD_0);	 			break;	 				 			case DLOAD:	 				pushByLocalLoad("D", dbc.getRegisterOperand());	 			break;	 				 			case DLOAD_0:	 			case DLOAD_1:	 			case DLOAD_2:	 			case DLOAD_3:	 				pushByLocalLoad("D", seen - DLOAD_0);	 			break;	 			case FLOAD:	 				pushByLocalLoad("F", dbc.getRegisterOperand());	 			break;	 				 			case FLOAD_0:	 			case FLOAD_1:	 			case FLOAD_2:	 			case FLOAD_3:	 				pushByLocalLoad("F", seen - FLOAD_0);	 			break;	 			case ILOAD:	 				pushByLocalLoad("I", dbc.getRegisterOperand());	 			break;	 				 			case ILOAD_0:	 			case ILOAD_1:	 			case ILOAD_2:	 			case ILOAD_3:	 				pushByLocalLoad("I", seen - ILOAD_0);	 			break;	 			case LLOAD:	 				pushByLocalLoad("J", dbc.getRegisterOperand());	 			break;	 				 			case LLOAD_0:	 			case LLOAD_1:	 			case LLOAD_2:	 			case LLOAD_3:	 				pushByLocalLoad("J", seen - LLOAD_0);	 			break;	 				 				 			case GETSTATIC:					{	 				Item i = new Item(dbc.getSigConstantOperand(), 						FieldAnnotation.fromReferencedField(dbc));	 				push(i);					break;					}	 				 			case LDC:	 			case LDC_W:				case LDC2_W:	 				cons = dbc.getConstantRefOperand();	 				pushByConstant(dbc, cons);				break;								case INSTANCEOF:					pop();					push(new Item("I"));				break;	 				 			case ARETURN:	 			case DRETURN:	 			case FRETURN:	 			case IFEQ:	 			case IFNE:	 			case IFLT:	 			case IFLE:	 			case IFGT:	 			case IFGE:	 			case IFNONNULL:	 			case IFNULL:	 			case IRETURN:	 			case LOOKUPSWITCH:	 			case LRETURN:	 			case MONITORENTER:	 			case MONITOREXIT:	 			case POP:	 			case PUTSTATIC:	 			case TABLESWITCH:	 				pop();	 			break;	 				 			case IF_ACMPEQ:	 			case IF_ACMPNE:	 			case IF_ICMPEQ:	 			case IF_ICMPNE:	 			case IF_ICMPLT:	 			case IF_ICMPLE:	 			case IF_ICMPGT:	 			case IF_ICMPGE:	 			case POP2:	 			case PUTFIELD:	 				pop(2);	 			break;	 				 			case IALOAD:	 			case SALOAD:	 				pop(2);	 				push(new Item("I"));	 			break;	 				 			case DUP:	 				it = pop();	 				push(it);	 				push(it);	 			break;	 				 			case DUP2:	 				it = pop();	 				it2 = pop();	 				push(it2);	 				push(it);	 				push(it2);	 				push(it);	 			break;	 				 			case DUP_X1:	 				it = pop();	 				it2 = pop();	 				push(it);	 				push(it2);	 				push(it);	 			break;	 				 			case DUP_X2:	 				it = pop();	 				it2 = pop();	 				signature = it2.getSignature();	 				if (signature.equals("J") || signature.equals("D")) {	 					push(it);	 					push(it2);	 					push(it);	 					 				} else {	 					it3 = pop();	 					push(it);	 					push(it3);	 					push(it2);	 					push(it);	 				}	 			break;	 				 			case DUP2_X1:	 				it = pop();	 				it2 = pop();	 				signature = it.getSignature();	 				if (signature.equals("J") || signature.equals("D")) {	 					push(it);	 					push(it2);	 					push(it);	 					 				} else {	 					it3 = pop();	 					push(it2);	 					push(it);	 					push(it3);	 					push(it2);	 					push(it);	 				}	 			break;	 				 				 			case IINC:	 				register = dbc.getRegisterOperand();	 				it = getLVValue( register );	 				it2 = new Item("I", new Integer(dbc.getIntConstant()));	 				pushByIntMath( IADD, it, it2);	 				pushByLocalStore(register);	 			break;	 			case ATHROW:	 			case CHECKCAST:	 			case NOP:	 			case RET:	 			case RETURN:	 			break;	 				 			case GOTO:	 			case GOTO_W:					//It is assumed that no stack items are present when	 				if (getStackDepth() > 0)    //when goto is executed. This is not true for trinaries	 					pop();					//so hack it so that if there are pop 1	 			break;	 					 				 			case SWAP:	 				Item i1 = pop();	 				Item i2 = pop();	 				push(i1);	 				push(i2);	 			break;	 				 			case ICONST_M1:	 			case ICONST_0:	 			case ICONST_1:	 			case ICONST_2:	 			case ICONST_3:	 			case ICONST_4:	 			case ICONST_5:	 				push(new Item("I", new Integer(seen-ICONST_0)));	 			break;	 				 			case LCONST_0:	 			case LCONST_1:	 				push(new Item("J", new Long(seen-LCONST_0)));	 			break;	 				 			case DCONST_0:	 			case DCONST_1:	 				push(new Item("D", new Double(seen-DCONST_0)));	 			break;	 			case FCONST_0:	 			case FCONST_1:	 			case FCONST_2:	 				push(new Item("F", new Float(seen-FCONST_0)));	 			break;	 			case ACONST_NULL:	 				push(new Item());	 			break;	 				 				 				 			case ASTORE:	 			case DSTORE:	 			case FSTORE:	 			case ISTORE:	 			case LSTORE:	 				pushByLocalStore(dbc.getRegisterOperand());	 			break;	 				 			case ASTORE_0:	 			case ASTORE_1:	 			case ASTORE_2:	 			case ASTORE_3:	 				pushByLocalStore(seen - ASTORE_0);	 			break;	 			case DSTORE_0:	 			case DSTORE_1:	 			case DSTORE_2:	 			case DSTORE_3:	 				pushByLocalStore(seen - DSTORE_0);	 			break;	 			case FSTORE_0:	 			case FSTORE_1:	 			case FSTORE_2:	 			case FSTORE_3:	 				pushByLocalStore(seen - FSTORE_0);	 			break;	 			case ISTORE_0:	 			case ISTORE_1:	 			case ISTORE_2:	 			case ISTORE_3:	 				pushByLocalStore(seen - ISTORE_0);	 			break;	 				 			case LSTORE_0:	 			case LSTORE_1:	 			case LSTORE_2:	 			case LSTORE_3:	 				pushByLocalStore(seen - LSTORE_0);	 			break;	 			case GETFIELD:	 				pop();	 				push(new Item(dbc.getSigConstantOperand(), 						FieldAnnotation.fromReferencedField(dbc)));	 			break;	 				 			case ARRAYLENGTH:	 				pop();	 				push(new Item("I"));	 			break;	 				 			case BALOAD:	 			case CALOAD:	 				pop(2);	 				push(new Item("I"));	 			break;	 				 			case DALOAD:	 				pop(2);	 				push(new Item("D"));	 			break;	 				 			case FALOAD:	 				pop(2);	 				push(new Item("F"));	 			break;	 				 			case LALOAD:	 				pop(2);	 				push(new Item("J"));	 			break;	 				 			case AASTORE:	 			case BASTORE:	 			case CASTORE:	 			case DASTORE:	 			case FASTORE:	 			case IASTORE:	 			case LASTORE:	 			case SASTORE:	 				pop(3);	 			break;	 				 			case BIPUSH:	 			case SIPUSH:	 				push(new Item("I", new Integer((int)dbc.getIntConstant())));	 			break;	 				 			case IADD:	 			case ISUB:	 			case IMUL:	 			case IDIV:	 			case IAND:	 			case IOR:	 			case IXOR:	 			case ISHL:	 			case ISHR:	 			case IREM:	 			case IUSHR:	 				it = pop();	 				it2 = pop();	 				pushByIntMath(seen, it, it2);	 			break;	 				 			case INEG:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("I", new Integer(-((Integer)it.getConstant()).intValue())));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 				 			case LNEG:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("J", new Long(-((Long)it.getConstant()).longValue())));	 				} else {	 					push(new Item("J"));	 				}	 			break;	 			case DNEG:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("D", new Double(-((Double)it.getConstant()).doubleValue())));	 				} else {	 					push(new Item("D"));	 				}	 			break;	 			case LADD:	 			case LSUB:	 			case LMUL:	 			case LDIV:	 			case LAND:	 			case LOR:	 			case LXOR:	 			case LSHL:	 			case LSHR:	 			case LREM:	 			case LUSHR:	 				it = pop();	 				it2 = pop();	 				pushByLongMath(seen, it, it2);	 			break; 				 			case LCMP:	 				it = pop();	 				it2 = pop();	 				if ((it.getConstant() != null) && it2.getConstant() != null) {	 					long l = ((Long)it.getConstant()).longValue();	 					long l2 = ((Long)it.getConstant()).longValue();	 					if (l2 < l)	 						push(new Item("I", new Integer(-1)));	 					else if (l2 > l)	 						push(new Item("I", new Integer(1)));	 					else	 						push(new Item("I", new Integer(0)));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 					 			case FCMPG:	 			case FCMPL:	 				it = pop();	 				it2 = pop();	 				if ((it.getConstant() != null) && it2.getConstant() != null) {	 					float f = ((Float)it.getConstant()).floatValue();	 					float f2 = ((Float)it.getConstant()).floatValue();	 					if (f2 < f)	 						push(new Item("I", new Integer(-1)));	 					else if (f2 > f)	 						push(new Item("I", new Integer(1)));	 					else	 						push(new Item("I", new Integer(0)));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 			case DCMPG:	 			case DCMPL:	 				it = pop();	 				it2 = pop();	 				if ((it.getConstant() != null) && it2.getConstant() != null) {	 					double d = ((Double)it.getConstant()).doubleValue();	 					double d2 = ((Double)it.getConstant()).doubleValue();	 					if (d2 < d)	 						push(new Item("I", new Integer(-1)));	 					else if (d2 > d)	 						push(new Item("I", new Integer(1)));	 					else	 						push(new Item("I", new Integer(0)));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 				 			case FADD:	 			case FSUB:	 			case FMUL:	 			case FDIV:	 				it = pop();	 				it2 = pop();	 				pushByFloatMath(seen, it, it2);	 			break;	 			case DADD:	 			case DSUB:	 			case DMUL:	 			case DDIV:	 			case DREM:	 				it = pop();	 				it2 = pop();	 				pushByDoubleMath(seen, it, it2);	 			break;	 				 			case I2B:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("I", new Integer((int)((byte)((Integer)it.getConstant()).intValue()))));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 			case I2C:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("I", new Integer((int)((char)((Integer)it.getConstant()).intValue()))));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 			case I2D:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("D", new Double((double)((Integer)it.getConstant()).intValue())));	 				} else {	 					push(new Item("D"));	 				}	 			break;	 				 			case I2F:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("F", new Float((float)((Integer)it.getConstant()).intValue())));	 				} else {	 					push(new Item("F"));	 				}	 			break;	 				 			case I2L:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("J", new Long((long)((Integer)it.getConstant()).intValue())));	 				} else {	 					push(new Item("J"));	 				}	 			break;	 			case I2S:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("I", new Integer((int)((short)((Integer)it.getConstant()).intValue()))));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 				 			case D2I:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("I", new Integer((int)((Integer)it.getConstant()).intValue())));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 				 			case D2F:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("F", new Float((float)((Double)it.getConstant()).doubleValue())));	 				} else {	 					push(new Item("F"));	 				}	 			break;	 			case D2L:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("J", new Long((long)((Double)it.getConstant()).doubleValue())));	 				} else {	 					push(new Item("J"));	 				}	 			break;	 			case L2I:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("I", new Integer((int)((Long)it.getConstant()).longValue())));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 				 			case L2D:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("D", new Double((double)((Long)it.getConstant()).longValue())));	 				} else {	 					push(new Item("D"));	 				}	 			break;	 				 			case L2F:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("F", new Float((float)((Long)it.getConstant()).longValue())));	 				} else {	 					push(new Item("F"));	 				}	 			break;	 			case F2I:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("I", new Integer((int)((Float)it.getConstant()).floatValue())));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 			case F2D:	 				it = pop();	 				if (it.getConstant() != null) {	 					push(new Item("D", new Double((double)((Float)it.getConstant()).floatValue())));	 				} else {	 					push(new Item("D"));	 				}	 			break;	 				 			case NEW:	 				pushBySignature(dbc.getClassConstantOperand());	 			break;	 				 			case NEWARRAY:	 				pop();	 				signature = BasicType.getType((byte)dbc.getIntConstant()).getSignature();	 				pushBySignature(signature);	 			break;				// According to the VM Spec 4.4.1, anewarray and multianewarray				// can refer to normal class/interface types (encoded in				// "internal form"), or array classes (encoded as signatures				// beginning with "[").	 				 			case ANEWARRAY:	 				pop();					signature = dbc.getClassConstantOperand();					if (!signature.startsWith("[")) {						signature = "L" + signature + ";";					}	 				pushBySignature(signature);	 			break;	 				 			case MULTIANEWARRAY:	 				int dims = dbc.getIntConstant();	 				while ((dims--) > 0) {	 					pop();	 				}					signature = dbc.getClassConstantOperand();					if (!signature.startsWith("[")) {						signature = "L" + signature + ";";					}					pushBySignature(signature);	 			break;	 					 			case AALOAD:	 				pop();	 				it = pop();	 				pushBySignature(it.getElementSignature());	 			break;	 				 				 			case JSR:	 				push(new Item("")); //?	 			break;	 							case INVOKEINTERFACE:	 			case INVOKESPECIAL:	 			case INVOKESTATIC:	 			case INVOKEVIRTUAL:	 				pushByInvoke(dbc, seen != INVOKESTATIC);	 			break;	 					 			default:	 				throw new UnsupportedOperationException("OpCode not supported yet" );	 		}	 	}/*		// FIXME: This class currently relies on catching runtime exceptions.		// This should be fixed so they don't occur.		catch (RuntimeException e) {			throw e;		}*/	 	catch (Exception e) {	 		//If an error occurs, we clear the stack and locals. one of two things will occur. 	 		//Either the client will expect more stack items than really exist, and so they're condition check will fail, 	 		//or the stack will resync with the code. But hopefully not false positives	 		clear();	 	}	 	finally {	 		if (DEBUG)	 			System.out.println(OPCODE_NAMES[seen] + "  stack depth: " + getStackDepth());	 	} 	}