Instruction ins = handle.getInstruction();  if (ins instanceof INVOKEVIRTUAL) {  INVOKEVIRTUAL inv = (INVOKEVIRTUAL) ins;  if (!frame.isValid() || !getInstanceValue(frame, inv, cpg).isInstance()) return false;     try { String streamBase = resource.getStreamBase();  return inv.getName(cpg).equals("close") && inv.getSignature(cpg).equals("()V") && Hierarchy.isSubtype(inv.getClassName(cpg), streamBase); } catch (ClassNotFoundException e) { lookupFailureCallback.reportMissingClass(e); return false; } }  return false;
return resource.isStreamClose(basicBlock, handle, cpg, frame, lookupFailureCallback);
	public boolean isResourceClose(BasicBlock basicBlock, InstructionHandle handle,		ConstantPoolGen cpg, Stream resource, ResourceValueFrame frame) {		Instruction ins = handle.getInstruction();		if (ins instanceof INVOKEVIRTUAL) {			// Does this instruction close the stream?			INVOKEVIRTUAL inv = (INVOKEVIRTUAL) ins;			if (!frame.isValid() ||				!getInstanceValue(frame, inv, cpg).isInstance())				return false;			// It's a close if the invoked class is any subtype of the stream base class.			// (Basically, we may not see the exact original stream class,			// even though it's the same instance.)			try {				String streamBase = resource.getStreamBase();				return inv.getName(cpg).equals("close")					&& inv.getSignature(cpg).equals("()V")					&& Hierarchy.isSubtype(inv.getClassName(cpg), streamBase);			} catch (ClassNotFoundException e) {				lookupFailureCallback.reportMissingClass(e);				return false;			}		}		return false;	}