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); } ); }
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); } }