69 AdjacencyList &adjacencyList, NodeList &nodes,
70 const std::vector<InlineComponent> &allICs)
72 using CompiledObject =
typename ObjectContainer::CompiledObject;
76 for (
typename std::vector<InlineComponent>::size_type i = 0; i < allICs.size(); ++i) {
77 const auto& ic = allICs[i];
78 const CompiledObject *obj = objectContainer->objectAt(ic.objectIndex);
79 QV4::ResolvedTypeReference *currentICTypeRef = objectContainer->resolvedType(ic.nameIndex);
80 auto createEdgeFromTypeRef = [&](QV4::ResolvedTypeReference *targetTypeRef) {
82 const auto targetType = targetTypeRef->type();
83 if (targetType.isInlineComponentType()
84 && containedInSameType(targetType, currentICTypeRef->type())) {
85 auto icIt = std::find_if(allICs.cbegin(), allICs.cend(), [&](
const QV4::CompiledData::InlineComponent &icSearched){
86 return objectContainer->stringAt(icSearched.nameIndex)
87 == targetType.elementName();
89 Q_ASSERT(icIt != allICs.cend());
90 Node& target = nodes[i];
91 adjacencyList[std::distance(allICs.cbegin(), icIt)].push_back(&target);
95 if (obj->inheritedTypeNameIndex != 0) {
96 QV4::ResolvedTypeReference *parentTypeRef = objectContainer->resolvedType(obj->inheritedTypeNameIndex);
97 createEdgeFromTypeRef(parentTypeRef);
100 auto referencedInICObjectIndex = ic.objectIndex + 1;
101 while (
int(referencedInICObjectIndex) < objectContainer->objectCount()) {
102 auto potentiallyReferencedInICObject = objectContainer->objectAt(referencedInICObjectIndex);
104 = !potentiallyReferencedInICObject->hasFlag(
105 QV4::CompiledData::Object::IsInlineComponentRoot)
106 && potentiallyReferencedInICObject->hasFlag(
107 QV4::CompiledData::Object::IsPartOfInlineComponent);
110 createEdgeFromTypeRef(objectContainer->resolvedType(potentiallyReferencedInICObject->inheritedTypeNameIndex));
111 ++referencedInICObjectIndex;
116inline void topoVisit(
Node *node, AdjacencyList &adjacencyList,
bool &hasCycle,
117 NodeList &nodesSorted)
127 auto const &edges = adjacencyList[node->index()];
128 for (
auto edgeTarget =edges.begin(); edgeTarget != edges.end(); ++edgeTarget) {
129 topoVisit(*edgeTarget, adjacencyList, hasCycle, nodesSorted);
133 nodesSorted.push_back(*node);
139 NodeList nodesSorted;
140 nodesSorted.reserve(nodes.size());
143 auto currentNodeIt = std::find_if(nodes.begin(), nodes.end(), [](
const Node& node) {
144 return !node.hasPermanentMark();
148 while (currentNodeIt != nodes.end() && !hasCycle) {
149 Node& currentNode = *currentNodeIt;
150 topoVisit(¤tNode, adjacencyList, hasCycle, nodesSorted);
151 currentNodeIt = std::find_if(nodes.begin(), nodes.end(), [](
const Node& node) {
152 return !node.hasPermanentMark();