public static PySignature parseCallSignature(String payload) throws PyDebuggerException {
    final XppReader reader = openReader(payload, true);
    reader.moveDown();
    if (!"call_signature".equals(reader.getNodeName())) {
      throw new PyDebuggerException("Expected <call_signature>, found " + reader.getNodeName());
    }
    String file = reader.getAttribute("file");
    if (file == null) file = "";
    final String name = readString(reader, "name", "");
    PySignature signature = new PySignature(file, name);

    while (reader.hasMoreChildren()) {
      reader.moveDown();
      if ("arg".equals(reader.getNodeName())) {
        signature.addArgument(readString(reader, "name", ""), readString(reader, "type", ""));
      }
      else if ("return".equals(reader.getNodeName())) {
        signature.addReturnType(readString(reader, "type", ""));
      }
      else {
        throw new PyDebuggerException("Expected <arg> or <return>, found " + reader.getNodeName());
      }

      reader.moveUp();
    }

    return signature;
  }
public static PySignature parseCallSignature(String payload)