HashSet<XMethod> result = new HashSet<XMethod>();
HashSet<JavaClassAndMethod> result = new HashSet<JavaClassAndMethod>();
	public static Set<XMethod> resolveMethodCallTargets(			InvokeInstruction invokeInstruction,			TypeFrame typeFrame,			ConstantPoolGen cpg) throws DataflowAnalysisException, ClassNotFoundException {				short opcode = invokeInstruction.getOpcode(); 				if (opcode == Constants.INVOKESTATIC) {			HashSet<XMethod> result = new HashSet<XMethod>();			JavaClassAndMethod targetMethod = findInvocationLeastUpperBound(invokeInstruction, cpg, CONCRETE_METHOD);			if (targetMethod != null) {				result.add(XMethodFactory.createXMethod(						targetMethod.getJavaClass(), targetMethod.getMethod()));			}			return result;		}				if (!typeFrame.isValid()) {			return new HashSet<XMethod>();		}		Type receiverType;		boolean receiverTypeIsExact;		if (opcode == Constants.INVOKESPECIAL) {			// invokespecial instructions are dispatched to EXACTLY			// the class specified by the instruction			receiverType = new ObjectType(invokeInstruction.getClassName(cpg));			receiverTypeIsExact = false; // Doesn't actually matter		} else {			// For invokevirtual and invokeinterface instructions, we have			// virtual dispatch.  By taking the receiver type (which may be a			// subtype of the class specified by the instruction),			// we may get a more precise set of call targets.			int instanceStackLocation = typeFrame.getInstanceStackLocation(invokeInstruction, cpg);			receiverType = typeFrame.getStackValue(instanceStackLocation);			if (!(receiverType instanceof ReferenceType)) {				return new HashSet<XMethod>();			}			receiverTypeIsExact = typeFrame.isExact(instanceStackLocation);		}		if (DEBUG_METHOD_LOOKUP) {			System.out.println("[receiver type is " + receiverType + ", " +					(receiverTypeIsExact ? "exact]" : " not exact]"));		}		return resolveMethodCallTargets((ReferenceType) receiverType, invokeInstruction, cpg, receiverTypeIsExact);	}