pushBySignature("I");
push(new Item("I"));
 	public void sawOpcode(DismantleBytecode dbc, int seen) { 		int register; 		LocalVariableTable lvt; 		LocalVariable lv; 		JavaClass cls; 		String signature; 		Method m; 		Item it, it2; 		 		try 		{ 			//Currently some of this ops should check the tos to look for literals, and do better logic 			//But that's not done now.	 		switch (seen) {	 			case ALOAD:	 				register = dbc.getRegisterOperand();	 				m = dbc.getMethod();	 				lvt = m.getLocalVariableTable();	 				if (lvt != null) {	 					lv = lvt.getLocalVariable(register); 						signature = lv.getSignature(); 						pushBySignature(signature);	  				} else {	  					pushBySignature("");	  				}	 			break;	 				 			case ALOAD_0:	 			case ALOAD_1:	 			case ALOAD_2:	 			case ALOAD_3:	 				register = seen - ALOAD_0;	 				m = dbc.getMethod();	 				lvt = m.getLocalVariableTable();	 				if (lvt != null) {	 					lv = lvt.getLocalVariable(register); 						signature = lv.getSignature(); 						pushBySignature(signature);	  				} else {	  					pushBySignature("");	  				}	 					 			break;	 				 			case GETSTATIC:	 				pushBySignature(dbc.getSigConstantOperand());	 			break;	 				 			case LDC:	 				Constant c = dbc.getConstantRefOperand();	 				pushByConstant(dbc, c);				break;								case INSTANCEOF:					pop();					pushBySignature("I");				break;	 				 			case ARETURN:	 			case ASTORE:	 			case ASTORE_0:	 			case ASTORE_1:	 			case ASTORE_2:	 			case ASTORE_3:	 			case DRETURN:	 			case DSTORE:	 			case DSTORE_0:	 			case DSTORE_1:	 			case DSTORE_2:	 			case DSTORE_3:	 			case FRETURN:	 			case FSTORE:	 			case FSTORE_0:	 			case FSTORE_1:	 			case FSTORE_2:	 			case FSTORE_3:	 			case IFEQ:	 			case IFNE:	 			case IFLT:	 			case IFLE:	 			case IFGT:	 			case IFGE:	 			case IFNONNULL:	 			case IFNULL:	 			case IRETURN:	 			case ISTORE:	 			case ISTORE_0:	 			case ISTORE_1:	 			case ISTORE_2:	 			case ISTORE_3:	 			case LRETURN:	 			case LSTORE:	 			case LSTORE_0:	 			case LSTORE_1:	 			case LSTORE_2:	 			case LSTORE_3:	 			case MONITORENTER:	 			case MONITOREXIT:	 			case POP:	 			case PUTSTATIC:	 				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 DUP:	 				it = pop();	 				push(it);	 				push(it);	 			break;	 				 			case ATHROW:	 			case CHECKCAST:	 			case GOTO:	 			case GOTO_W:	 			case IINC:	 			case NOP:	 			case RET:	 			case RETURN:	 			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 ACONST_NULL:	 				push(new Item());	 			break;	 				 			case ILOAD:	 			case ILOAD_0:	 			case ILOAD_1:	 			case ILOAD_2:	 			case ILOAD_3:	 				push(new Item("I"));	 			break;	 				 			case GETFIELD:	 				pop();	 				push(new Item(dbc.getSigConstantOperand()));	 			break;	 				 			case ARRAYLENGTH:	 				pop();	 				push(new Item("I"));	 			break;	 				 			case BALOAD:	 				it = pop();	 				pop();	 				signature = it.getSignature();	 				push(new Item(signature));	 			break;	 				 			case BASTORE:	 				pop(3);	 			break;	 				 			case BIPUSH:	 			case SIPUSH:	 				push(new Item("I", new Integer((int)dbc.getIntConstant())));	 			break;	 				 			case ISUB:	 			case IADD:	 			case IMUL:	 			case IDIV:	 				it = pop();	 				it2 = pop();	 				if ((it.getConstant() != null) && it2.getConstant() != null) {						if (seen == IADD)	 						push(new Item("I", ((Integer)it2.getConstant()).intValue() + ((Integer)it.getConstant()).intValue()));	 					else if (seen == ISUB)	 						push(new Item("I", ((Integer)it2.getConstant()).intValue() - ((Integer)it.getConstant()).intValue()));						else if (seen == IMUL)	 						push(new Item("I", ((Integer)it2.getConstant()).intValue() * ((Integer)it.getConstant()).intValue()));						else if (seen == IDIV)	 						push(new Item("I", ((Integer)it2.getConstant()).intValue() / ((Integer)it.getConstant()).intValue()));	 				} else {	 					push(new Item("I"));	 				}	 			break;	 				 			case NEW:	 				pushBySignature(dbc.getClassConstantOperand());	 			break;	 				 			case NEWARRAY:	 				pop();	 				signature = BasicType.getType((byte)dbc.getIntConstant()).getSignature();	 				pushBySignature(signature);	 			break;/*	 				 			case ANEWARRAY:	 				pop();	 				signature = ?	 				pushBySignature(signature);	 			break;*/	 					 			case AALOAD:	 				pop();	 				it = pop();	 				pushBySignature(it.getElementSignature());	 			break;	 							case INVOKEINTERFACE:	 			case INVOKESPECIAL:	 			case INVOKESTATIC:	 			case INVOKEVIRTUAL:	 				signature = dbc.getSigConstantOperand();	 				Type[] argTypes = Type.getArgumentTypes(signature);	 				pop(argTypes.length);	 				pushBySignature(Type.getReturnType(signature).getSignature());	 			break;	 					 			default:	 				throw new UnsupportedOperationException("OpCode not supported yet" );	 		}	 	}	 	catch (Exception e) {	 		//If an error occurs, we clear the stack. 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	 		stack.clear();	 	} 	}