static bool predicatePrecheck()

in Chisel/Chisel/CHLObjcInstanceCommands.mm [49:72]


static bool predicatePrecheck(id obj, const std::unordered_set<Class> &classSet)
{
  IsValidArgs args{classSet};

  if ([obj isKindOfClass:objc_getClass("__NSCFDictionary")]) {
    CFDictionaryApplyFunction((CFDictionaryRef)obj, &isValidKeyValue, &args);
  } else if ([obj isKindOfClass:objc_getClass("__NSCFSet")]) {
    CFSetApplyFunction((CFSetRef)obj, &isValidObject, &args);
  } else {
    // Skip classes containing NSPlaceholder.
    // TODO: Figure out better way to ignore invalid instances.
    char *name = (char *)object_getClassName(obj);
    while (*name == '_') ++name;
    if (strncmp(name, "NSPlaceholder", sizeof("NSPlaceholder") - 1) == 0) {
      args.isValid = false;
    }
  }

  if (!args.isValid && getenv("FINDINSTANCES_DEBUG")) {
    printf("%p has class %s but contains non objc data\n", obj, object_getClassName(obj));
  }

  return args.isValid;
}