public void visitMethodInsn(
		final int opcode,
		final String owner,
		final String name,
		final String desc){
	boolean itf = opcode == Opcodes.INVOKEINTERFACE;
	Item i = cw.newMethodItem(owner, name, desc, itf);
	int argSize = i.intVal;
	// Label currentBlock = this.currentBlock;
	if(currentBlock != null)
		{
		if(compute == FRAMES)
			{
			currentBlock.frame.execute(opcode, 0, cw, i);
			}
		else
			{
			/*
							 * computes the stack size variation. In order not to recompute
							 * several times this variation for the same Item, we use the
							 * intVal field of this item to store this variation, once it
							 * has been computed. More precisely this intVal field stores
							 * the sizes of the arguments and of the return value
							 * corresponding to desc.
							 */
			if(argSize == 0)
				{
				// the above sizes have not been computed yet,
				// so we compute them...
				argSize = getArgumentsAndReturnSizes(desc);
				// ... and we save them in order
				// not to recompute them in the future
				i.intVal = argSize;
				}
			int size;
			if(opcode == Opcodes.INVOKESTATIC)
				{
				size = stackSize - (argSize >> 2) + (argSize & 0x03) + 1;
				}
			else
				{
				size = stackSize - (argSize >> 2) + (argSize & 0x03);
				}
			// updates current and max stack sizes
			if(size > maxStackSize)
				{
				maxStackSize = size;
				}
			stackSize = size;
			}
		}
	// adds the instruction to the bytecode of the method
	if(itf)
		{
		if(argSize == 0)
			{
			argSize = getArgumentsAndReturnSizes(desc);
			i.intVal = argSize;
			}
		code.put12(Opcodes.INVOKEINTERFACE, i.index).put11(argSize >> 2, 0);
		}
	else
		{
		code.put12(opcode, i.index);
		}
}