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