UNPKG

@oaklean/profiler-core

Version:

Part of the @oaklean suite. It provides all basic functions to work with the `.oak` file format. It allows parsing the `.oak` file format as well as tools for analyzing the measurement values. It also provides all necessary capabilities required for prec

157 lines 14.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SourceNodeGraph = void 0; const SourceNodeMetaData_1 = require("./SourceNodeMetaData"); const ModelMap_1 = require("./ModelMap"); const ModelSet_1 = require("./ModelSet"); class SourceNodeGraph { constructor() { this._sourceNodes = new ModelMap_1.ModelMap('string'); this._outgoingSum = new ModelMap_1.ModelMap('string'); this._incomingSum = new ModelMap_1.ModelMap('string'); this._outgoingEdges = new ModelMap_1.ModelMap('string'); this._incomingEdges = new ModelMap_1.ModelMap('string'); this._reachabilityCache = new ModelMap_1.ModelMap('string'); } get sourceNodes() { return this._sourceNodes; } get outgoingEdges() { return this._outgoingEdges; } get incomingEdges() { return this._incomingEdges; } outgoingSumOfNode(nodeID) { let result = this._outgoingSum.get(nodeID); if (result === undefined) { const incomingEdges = this._outgoingEdges.get(nodeID); if (incomingEdges === undefined) { return undefined; } result = SourceNodeMetaData_1.SourceNodeMetaData.sum(...incomingEdges.values()); this._outgoingSum.set(nodeID, result); } return result; } incomingSumOfNode(nodeID) { let result = this._incomingSum.get(nodeID); if (result === undefined) { const incomingEdges = this._incomingEdges.get(nodeID); if (incomingEdges === undefined) { return undefined; } result = SourceNodeMetaData_1.SourceNodeMetaData.sum(...incomingEdges.values()); this._incomingSum.set(nodeID, result); } return result; } addReferenceEdge(fromReport, fromSourceNode, toReport, toSourceNode, reference) { // Create unique IDs for the source nodes const fromSourceNodeID = `${fromReport.internID}:${fromSourceNode.id}`; const toSourceNodeID = `${toReport.internID}:${toSourceNode.id}`; // Ensure both source nodes are in the graph this.sourceNodes.set(fromSourceNodeID, fromSourceNode); this.sourceNodes.set(toSourceNodeID, toSourceNode); // Get or create the outgoing and incoming edges maps let outgoingReferences = this._outgoingEdges.get(fromSourceNodeID); if (outgoingReferences === undefined) { outgoingReferences = new ModelMap_1.ModelMap('string'); this._outgoingEdges.set(fromSourceNodeID, outgoingReferences); } let incomingReferences = this._incomingEdges.get(toSourceNodeID); if (incomingReferences === undefined) { incomingReferences = new ModelMap_1.ModelMap('string'); this._incomingEdges.set(toSourceNodeID, incomingReferences); } // Add the reference in both directions outgoingReferences.set(toSourceNodeID, reference); incomingReferences.set(fromSourceNodeID, reference); } insertSourceNode(report, globalIndex, sourceNodeMetaData) { this.sourceNodes.set(`${report.internID}:${sourceNodeMetaData.id}`, sourceNodeMetaData); for (const iterator of [ sourceNodeMetaData.lang_internal, sourceNodeMetaData.intern, sourceNodeMetaData.extern ]) { for (const sourceNodeReference of iterator.values()) { const source = report.resolveSourceNodeID(globalIndex, sourceNodeReference.id); if (source.error === true) { throw new Error('SourceNodeGraph.insertSourceNode: cannot resolve source source node for reference id: ' + sourceNodeReference.id.toString()); } this.addReferenceEdge(source.report, source.sourceNode, report, sourceNodeMetaData, sourceNodeReference); } } } static fromProjectReport(projectReport) { return SourceNodeGraph.fromReport(projectReport, projectReport.globalIndex); } static fromReport(report, globalIndex, graph) { const graphToInsert = graph || new SourceNodeGraph(); for (const sourceFileMetaData of report.lang_internal.values()) { for (const sourceNodeMetaData of sourceFileMetaData.functions.values()) { graphToInsert.insertSourceNode(report, globalIndex, sourceNodeMetaData); } } for (const sourceFileMetaData of report.intern.values()) { for (const sourceNodeMetaData of sourceFileMetaData.functions.values()) { graphToInsert.insertSourceNode(report, globalIndex, sourceNodeMetaData); } } for (const externModuleReport of report.extern.values()) { SourceNodeGraph.fromReport(externModuleReport, globalIndex, graphToInsert); } return graphToInsert; } toJSON() { return { sourceNodes: this._sourceNodes.toJSON(), outgoingEdges: this._outgoingEdges.toJSON(), incomingEdges: this._incomingEdges.toJSON() }; } reachabilityForNode(nodeID) { const cached = this._reachabilityCache.get(nodeID); if (cached === undefined) { const visited = new ModelSet_1.ModelSet(); this.dfs(nodeID, visited, this._reachabilityCache); this._reachabilityCache.set(nodeID, visited); return visited; } return cached; } dfs(sourceNodeID, visited, reach) { if (reach !== undefined) { const existing = reach.get(sourceNodeID); if (existing !== undefined) { existing.forEach((nodeID) => { visited.add(nodeID); }); return; } } const neighbors = this._outgoingEdges.get(sourceNodeID); if (neighbors === undefined) { return; } for (const v of neighbors.keys()) { if (!visited.has(v)) { visited.add(v); this.dfs(v, visited, reach); } } } reachability() { if (this._reachabilityCache.size === this._sourceNodes.size) { return this._reachabilityCache; } for (const nodeID of this._sourceNodes.keys()) { this.reachabilityForNode(nodeID); } return this._reachabilityCache; } } exports.SourceNodeGraph = SourceNodeGraph; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlTm9kZUdyYXBoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGVsL1NvdXJjZU5vZGVHcmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSw2REFBeUQ7QUFDekQseUNBQXFDO0FBQ3JDLHlDQUFxQztBQW9CckMsTUFBYSxlQUFlO0lBcUIzQjtRQUNDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLG1CQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVELElBQUksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUN6QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQTtJQUMzQixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQTtJQUMzQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBMkI7UUFDNUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDMUMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFB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