BitSet () { StructClass cl = DecompilerContext.getStructContext().getClass(className); if (cl == null) return EMPTY_BIT_SET; // check number of matches List<MethodDescriptor> matches = new ArrayList<>(); nextMethod: for (StructMethod mt : cl.getMethods()) { if (name.equals(mt.getName())) { MethodDescriptor md = MethodDescriptor.parseDescriptor(mt.getDescriptor()); if (md.params.length == descriptor.params.length) { for (int i = 0; i < md.params.length; i++) { if (md.params[i].getTypeFamily() != descriptor.params[i].getTypeFamily()) { continue nextMethod; } } matches.add(md); } } } if (matches.size() == 1) return EMPTY_BIT_SET; // check if a call is unambiguous StructMethod mt = cl.getMethod(InterpreterUtil.makeUniqueKey(name, stringDescriptor)); if (mt != null) { MethodDescriptor md = MethodDescriptor.parseDescriptor(mt.getDescriptor()); if (md.params.length == parameters.size()) { boolean exact = true; for (int i = 0; i < md.params.length; i++) { if (!md.params[i].equals(parameters.get(i).getExprType())) { exact = false; break; } } if (exact) return EMPTY_BIT_SET; } } // mark parameters BitSet ambiguous = new BitSet(descriptor.params.length); for (int i = 0; i < descriptor.params.length; i++) { VarType paramType = descriptor.params[i]; for (MethodDescriptor md : matches) { if (!paramType.equals(md.params[i])) { ambiguous.set(i); break; } } } return ambiguous; }