Пример #1
0
void DataWalker::traverseData(
    ObjectData* data,
    DataFeature& features,
    PointerSet& visited) const {
  objectFeature(data, features);
  if (markVisited(data, features, visited)) {
    return; // avoid infinite recursion
  }
  if (canStopWalk(features)) return;

  if (data->isCollection()) {
    auto const arr = collections::asArray(data);
    if (arr) {
      traverseData(arr, features, visited);
      return;
    }
    assertx(data->collectionType() == CollectionType::Pair);
    auto const pair = static_cast<c_Pair*>(data);
    visitTypedValue(*pair->get(0), features, visited);
    visitTypedValue(*pair->get(1), features, visited);
    return;
  }

  IteratePropMemOrderNoInc(
    data,
    [&](Slot slot, const Class::Prop& prop, tv_rval val) {
      visitTypedValue(val.tv(), features, visited);
    },
    [&](Cell key_tv, TypedValue val) {
      visitTypedValue(val, features, visited);
    }
  );
}
Пример #2
0
void DataWalker::traverseData(
    ObjectData* data,
    DataFeature& features,
    PointerSet& visited) const {
  objectFeature(data, features, visited);
  if (markVisited(data, features, visited)) {
    return; // avoid infinite recursion
  }
  if (!canStopWalk(features)) {
    traverseData(data->toArray().get(), features, visited);
  }
}