arkanalyzer 1.0.20 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Config.d.ts +70 -70
- package/lib/Config.js +198 -198
- package/lib/Scene.d.ts +316 -316
- package/lib/Scene.js +1316 -1316
- package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +28 -28
- package/lib/callgraph/algorithm/AbstractAnalysis.js +144 -144
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts +10 -10
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +69 -69
- package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts +15 -15
- package/lib/callgraph/algorithm/RapidTypeAnalysis.js +146 -146
- package/lib/callgraph/common/Statistics.d.ts +57 -57
- package/lib/callgraph/common/Statistics.js +228 -228
- package/lib/callgraph/model/CallGraph.d.ts +96 -96
- package/lib/callgraph/model/CallGraph.js +354 -354
- package/lib/callgraph/model/builder/CallGraphBuilder.d.ts +15 -15
- package/lib/callgraph/model/builder/CallGraphBuilder.js +106 -106
- package/lib/callgraph/pointerAnalysis/Context.d.ts +37 -37
- package/lib/callgraph/pointerAnalysis/Context.js +155 -155
- package/lib/callgraph/pointerAnalysis/DummyCallCreator.d.ts +22 -22
- package/lib/callgraph/pointerAnalysis/DummyCallCreator.js +104 -104
- package/lib/callgraph/pointerAnalysis/PTAUtils.d.ts +5 -5
- package/lib/callgraph/pointerAnalysis/PTAUtils.js +46 -46
- package/lib/callgraph/pointerAnalysis/Pag.d.ts +261 -261
- package/lib/callgraph/pointerAnalysis/Pag.js +930 -930
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +157 -157
- package/lib/callgraph/pointerAnalysis/PagBuilder.js +1399 -1399
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +72 -72
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +573 -573
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts +15 -15
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.js +81 -81
- package/lib/callgraph/pointerAnalysis/PtsDS.d.ts +80 -80
- package/lib/callgraph/pointerAnalysis/PtsDS.js +308 -308
- package/lib/core/base/Constant.d.ts +48 -48
- package/lib/core/base/Constant.js +103 -103
- package/lib/core/base/Decorator.d.ts +15 -15
- package/lib/core/base/Decorator.js +46 -46
- package/lib/core/base/DefUseChain.d.ts +8 -8
- package/lib/core/base/DefUseChain.js +25 -25
- package/lib/core/base/Expr.d.ts +340 -340
- package/lib/core/base/Expr.js +917 -917
- package/lib/core/base/Local.d.ts +104 -104
- package/lib/core/base/Local.js +176 -176
- package/lib/core/base/Position.d.ts +30 -30
- package/lib/core/base/Position.js +147 -147
- package/lib/core/base/Ref.d.ts +173 -173
- package/lib/core/base/Ref.js +374 -374
- package/lib/core/base/Stmt.d.ts +237 -237
- package/lib/core/base/Stmt.js +525 -525
- package/lib/core/base/Trap.d.ts +8 -8
- package/lib/core/base/Trap.js +30 -30
- package/lib/core/base/Type.d.ts +308 -308
- package/lib/core/base/Type.js +639 -639
- package/lib/core/base/TypeExpr.d.ts +71 -71
- package/lib/core/base/TypeExpr.js +155 -155
- package/lib/core/base/Value.d.ts +32 -32
- package/lib/core/base/Value.js +16 -16
- package/lib/core/common/ArkError.d.ts +14 -14
- package/lib/core/common/ArkError.js +28 -28
- package/lib/core/common/ArkIRTransformer.d.ts +67 -67
- package/lib/core/common/ArkIRTransformer.js +690 -690
- package/lib/core/common/ArkValueTransformer.d.ts +89 -89
- package/lib/core/common/ArkValueTransformer.js +1478 -1478
- package/lib/core/common/Builtin.d.ts +36 -36
- package/lib/core/common/Builtin.js +81 -81
- package/lib/core/common/Const.d.ts +21 -21
- package/lib/core/common/Const.js +43 -43
- package/lib/core/common/DummyMainCreater.d.ts +46 -46
- package/lib/core/common/DummyMainCreater.js +319 -319
- package/lib/core/common/EtsConst.d.ts +73 -73
- package/lib/core/common/EtsConst.js +1021 -1021
- package/lib/core/common/ExprUseReplacer.d.ts +21 -21
- package/lib/core/common/ExprUseReplacer.js +124 -124
- package/lib/core/common/IRInference.d.ts +36 -36
- package/lib/core/common/IRInference.d.ts.map +1 -1
- package/lib/core/common/IRInference.js +651 -648
- package/lib/core/common/IRUtils.d.ts +18 -18
- package/lib/core/common/IRUtils.js +141 -141
- package/lib/core/common/ModelUtils.d.ts +70 -70
- package/lib/core/common/ModelUtils.js +712 -712
- package/lib/core/common/RefUseReplacer.d.ts +13 -13
- package/lib/core/common/RefUseReplacer.js +52 -52
- package/lib/core/common/SdkUtils.d.ts +8 -8
- package/lib/core/common/SdkUtils.js +105 -105
- package/lib/core/common/StmtDefReplacer.d.ts +12 -12
- package/lib/core/common/StmtDefReplacer.js +41 -41
- package/lib/core/common/StmtUseReplacer.d.ts +16 -16
- package/lib/core/common/StmtUseReplacer.js +108 -108
- package/lib/core/common/TSConst.d.ts +18 -18
- package/lib/core/common/TSConst.js +36 -36
- package/lib/core/common/TypeInference.d.ts +102 -102
- package/lib/core/common/TypeInference.js +748 -748
- package/lib/core/common/ValueUtil.d.ts +12 -12
- package/lib/core/common/ValueUtil.js +54 -54
- package/lib/core/common/VisibleValue.d.ts +36 -36
- package/lib/core/common/VisibleValue.js +212 -212
- package/lib/core/dataflow/DataflowProblem.d.ts +20 -20
- package/lib/core/dataflow/DataflowProblem.js +20 -20
- package/lib/core/dataflow/DataflowResult.d.ts +7 -7
- package/lib/core/dataflow/DataflowResult.js +26 -26
- package/lib/core/dataflow/DataflowSolver.d.ts +43 -43
- package/lib/core/dataflow/DataflowSolver.js +307 -307
- package/lib/core/dataflow/Edge.d.ts +11 -11
- package/lib/core/dataflow/Edge.js +31 -31
- package/lib/core/dataflow/Fact.d.ts +6 -6
- package/lib/core/dataflow/Fact.js +24 -24
- package/lib/core/dataflow/GenericDataFlow.d.ts +142 -142
- package/lib/core/dataflow/GenericDataFlow.js +109 -109
- package/lib/core/dataflow/ReachingDef.d.ts +62 -62
- package/lib/core/dataflow/ReachingDef.js +168 -168
- package/lib/core/dataflow/UndefinedVariable.d.ts +45 -45
- package/lib/core/dataflow/UndefinedVariable.js +288 -288
- package/lib/core/dataflow/Util.d.ts +9 -9
- package/lib/core/dataflow/Util.js +64 -64
- package/lib/core/graph/BaseExplicitGraph.d.ts +58 -58
- package/lib/core/graph/BaseExplicitGraph.js +157 -157
- package/lib/core/graph/BaseImplicitGraph.d.ts +77 -77
- package/lib/core/graph/BaseImplicitGraph.js +78 -78
- package/lib/core/graph/BasicBlock.d.ts +104 -104
- package/lib/core/graph/BasicBlock.js +280 -280
- package/lib/core/graph/Cfg.d.ts +59 -59
- package/lib/core/graph/Cfg.js +282 -282
- package/lib/core/graph/DependsGraph.d.ts +35 -35
- package/lib/core/graph/DependsGraph.js +87 -87
- package/lib/core/graph/DominanceFinder.d.ts +15 -15
- package/lib/core/graph/DominanceFinder.js +121 -121
- package/lib/core/graph/DominanceTree.d.ts +12 -12
- package/lib/core/graph/DominanceTree.js +70 -70
- package/lib/core/graph/GraphTraits.d.ts +7 -7
- package/lib/core/graph/GraphTraits.js +16 -16
- package/lib/core/graph/Scc.d.ts +61 -61
- package/lib/core/graph/Scc.js +222 -222
- package/lib/core/graph/ViewTree.d.ts +114 -114
- package/lib/core/graph/ViewTree.js +16 -16
- package/lib/core/graph/builder/CfgBuilder.d.ts +176 -176
- package/lib/core/graph/builder/CfgBuilder.js +1139 -1139
- package/lib/core/graph/builder/ConditionBuilder.d.ts +15 -15
- package/lib/core/graph/builder/ConditionBuilder.js +252 -252
- package/lib/core/graph/builder/LoopBuilder.d.ts +20 -20
- package/lib/core/graph/builder/LoopBuilder.js +251 -251
- package/lib/core/graph/builder/SwitchBuilder.d.ts +11 -11
- package/lib/core/graph/builder/SwitchBuilder.js +152 -152
- package/lib/core/graph/builder/TrapBuilder.d.ts +16 -16
- package/lib/core/graph/builder/TrapBuilder.js +272 -272
- package/lib/core/graph/builder/ViewTreeBuilder.d.ts +203 -203
- package/lib/core/graph/builder/ViewTreeBuilder.js +1055 -1055
- package/lib/core/model/ArkBaseModel.d.ts +59 -59
- package/lib/core/model/ArkBaseModel.js +274 -274
- package/lib/core/model/ArkBody.d.ts +24 -24
- package/lib/core/model/ArkBody.js +65 -65
- package/lib/core/model/ArkClass.d.ts +206 -206
- package/lib/core/model/ArkClass.js +439 -439
- package/lib/core/model/ArkExport.d.ts +72 -72
- package/lib/core/model/ArkExport.js +147 -147
- package/lib/core/model/ArkField.d.ts +62 -62
- package/lib/core/model/ArkField.js +113 -113
- package/lib/core/model/ArkFile.d.ts +131 -131
- package/lib/core/model/ArkFile.js +267 -267
- package/lib/core/model/ArkImport.d.ts +44 -44
- package/lib/core/model/ArkImport.js +108 -108
- package/lib/core/model/ArkMetadata.d.ts +31 -31
- package/lib/core/model/ArkMetadata.js +55 -55
- package/lib/core/model/ArkMethod.d.ts +261 -261
- package/lib/core/model/ArkMethod.js +592 -592
- package/lib/core/model/ArkNamespace.d.ts +66 -66
- package/lib/core/model/ArkNamespace.js +209 -209
- package/lib/core/model/ArkSignature.d.ts +162 -162
- package/lib/core/model/ArkSignature.js +379 -379
- package/lib/core/model/builder/ArkClassBuilder.d.ts +12 -12
- package/lib/core/model/builder/ArkClassBuilder.js +454 -454
- package/lib/core/model/builder/ArkExportBuilder.d.ts +24 -24
- package/lib/core/model/builder/ArkExportBuilder.js +210 -210
- package/lib/core/model/builder/ArkFieldBuilder.d.ts +8 -8
- package/lib/core/model/builder/ArkFieldBuilder.js +193 -193
- package/lib/core/model/builder/ArkFileBuilder.d.ts +9 -9
- package/lib/core/model/builder/ArkFileBuilder.js +165 -165
- package/lib/core/model/builder/ArkImportBuilder.d.ts +4 -4
- package/lib/core/model/builder/ArkImportBuilder.js +128 -128
- package/lib/core/model/builder/ArkMethodBuilder.d.ts +63 -63
- package/lib/core/model/builder/ArkMethodBuilder.js +486 -486
- package/lib/core/model/builder/ArkNamespaceBuilder.d.ts +5 -5
- package/lib/core/model/builder/ArkNamespaceBuilder.js +205 -205
- package/lib/core/model/builder/ArkSignatureBuilder.d.ts +8 -8
- package/lib/core/model/builder/ArkSignatureBuilder.js +40 -40
- package/lib/core/model/builder/BodyBuilder.d.ts +55 -30
- package/lib/core/model/builder/BodyBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/BodyBuilder.js +542 -371
- package/lib/core/model/builder/builderUtils.d.ts +18 -18
- package/lib/core/model/builder/builderUtils.js +558 -558
- package/lib/index.d.ts +82 -80
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +201 -196
- package/lib/save/ArkStream.d.ts +23 -23
- package/lib/save/ArkStream.js +83 -83
- package/lib/save/DotPrinter.d.ts +43 -43
- package/lib/save/DotPrinter.js +170 -170
- package/lib/save/GraphPrinter.d.ts +16 -16
- package/lib/save/GraphPrinter.js +134 -134
- package/lib/save/JsonPrinter.d.ts +30 -30
- package/lib/save/JsonPrinter.js +580 -580
- package/lib/save/Printer.d.ts +12 -12
- package/lib/save/Printer.js +27 -27
- package/lib/save/PrinterBuilder.d.ts +53 -53
- package/lib/save/PrinterBuilder.js +145 -145
- package/lib/save/ViewTreePrinter.d.ts +14 -14
- package/lib/save/ViewTreePrinter.js +123 -123
- package/lib/save/arkir/ArkIRClassPrinter.d.ts +13 -13
- package/lib/save/arkir/ArkIRClassPrinter.js +92 -92
- package/lib/save/arkir/ArkIRFieldPrinter.d.ts +11 -11
- package/lib/save/arkir/ArkIRFieldPrinter.js +64 -64
- package/lib/save/arkir/ArkIRFilePrinter.d.ts +12 -12
- package/lib/save/arkir/ArkIRFilePrinter.js +54 -54
- package/lib/save/arkir/ArkIRMethodPrinter.d.ts +16 -16
- package/lib/save/arkir/ArkIRMethodPrinter.js +159 -159
- package/lib/save/arkir/ArkIRNamespacePrinter.d.ts +11 -11
- package/lib/save/arkir/ArkIRNamespacePrinter.js +66 -66
- package/lib/save/base/BasePrinter.d.ts +23 -23
- package/lib/save/base/BasePrinter.js +70 -70
- package/lib/save/base/ExportPrinter.d.ts +8 -8
- package/lib/save/base/ExportPrinter.js +67 -67
- package/lib/save/base/ImportPrinter.d.ts +9 -9
- package/lib/save/base/ImportPrinter.js +92 -92
- package/lib/save/base/PrinterUtils.d.ts +24 -24
- package/lib/save/base/PrinterUtils.js +208 -208
- package/lib/save/serializeArkIR.d.ts +8 -8
- package/lib/save/serializeArkIR.js +294 -294
- package/lib/save/source/SourceBase.d.ts +22 -22
- package/lib/save/source/SourceBase.js +64 -64
- package/lib/save/source/SourceBody.d.ts +58 -58
- package/lib/save/source/SourceBody.js +296 -296
- package/lib/save/source/SourceClass.d.ts +25 -25
- package/lib/save/source/SourceClass.js +187 -187
- package/lib/save/source/SourceField.d.ts +13 -13
- package/lib/save/source/SourceField.js +73 -73
- package/lib/save/source/SourceFilePrinter.d.ts +12 -12
- package/lib/save/source/SourceFilePrinter.js +69 -69
- package/lib/save/source/SourceMethod.d.ts +22 -22
- package/lib/save/source/SourceMethod.d.ts.map +1 -1
- package/lib/save/source/SourceMethod.js +196 -193
- package/lib/save/source/SourceNamespace.d.ts +11 -11
- package/lib/save/source/SourceNamespace.js +83 -83
- package/lib/save/source/SourceStmt.d.ts +178 -178
- package/lib/save/source/SourceStmt.js +838 -838
- package/lib/save/source/SourceTransformer.d.ts +46 -46
- package/lib/save/source/SourceTransformer.js +446 -446
- package/lib/transformer/FunctionTransformer.d.ts +2 -2
- package/lib/transformer/FunctionTransformer.js +17 -17
- package/lib/transformer/SceneTransformer.d.ts +2 -2
- package/lib/transformer/SceneTransformer.js +17 -17
- package/lib/transformer/StaticSingleAssignmentFormer.d.ts +12 -12
- package/lib/transformer/StaticSingleAssignmentFormer.js +259 -259
- package/lib/transformer/Transformer.d.ts +6 -6
- package/lib/transformer/Transformer.js +22 -22
- package/lib/utils/AstTreeUtils.d.ts +4 -4
- package/lib/utils/AstTreeUtils.js +26 -26
- package/lib/utils/CfgStructualAnalysis.d.ts +110 -110
- package/lib/utils/CfgStructualAnalysis.js +1277 -1277
- package/lib/utils/FileUtils.d.ts +18 -18
- package/lib/utils/FileUtils.js +135 -135
- package/lib/utils/SparseBitVector.d.ts +100 -100
- package/lib/utils/SparseBitVector.js +445 -445
- package/lib/utils/callGraphUtils.d.ts +30 -30
- package/lib/utils/callGraphUtils.js +205 -205
- package/lib/utils/crypto_utils.d.ts +5 -5
- package/lib/utils/crypto_utils.js +57 -57
- package/lib/utils/entryMethodUtils.d.ts +13 -13
- package/lib/utils/entryMethodUtils.js +110 -110
- package/lib/utils/getAllFiles.d.ts +9 -9
- package/lib/utils/getAllFiles.js +90 -90
- package/lib/utils/json5parser.d.ts +6 -6
- package/lib/utils/json5parser.js +146 -146
- package/lib/utils/logger.d.ts +18 -18
- package/lib/utils/logger.d.ts.map +1 -1
- package/lib/utils/logger.js +97 -90
- package/lib/utils/pathTransfer.d.ts +1 -1
- package/lib/utils/pathTransfer.js +25 -25
- package/node_modules/json5/lib/cli.js +0 -0
- package/node_modules/ohos-typescript/bin/tsc +0 -0
- package/node_modules/ohos-typescript/bin/tsserver +0 -0
- package/package.json +3 -3
package/lib/core/graph/Scc.d.ts
CHANGED
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
import { BaseNode } from './BaseExplicitGraph';
|
|
2
|
-
import { NodeID, GraphTraits } from './GraphTraits';
|
|
3
|
-
type NodeSet = Set<NodeID>;
|
|
4
|
-
type NodeStack = NodeID[];
|
|
5
|
-
type Node2RepSCCInfoMap = Map<NodeID, NodeSCCInfo>;
|
|
6
|
-
/**
|
|
7
|
-
* Basic SCC info for a single node
|
|
8
|
-
*/
|
|
9
|
-
declare class NodeSCCInfo {
|
|
10
|
-
private _rep;
|
|
11
|
-
private _subNodes;
|
|
12
|
-
constructor();
|
|
13
|
-
get rep(): NodeID;
|
|
14
|
-
set rep(n: NodeID);
|
|
15
|
-
addSubNodes(n: NodeID): void;
|
|
16
|
-
get subNodes(): NodeSet;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Detect strongly connected components in a directed graph
|
|
20
|
-
* A topological graph is an extra product from this algorithm
|
|
21
|
-
* Advanced Nuutila’s algorithm which come from the following paper:
|
|
22
|
-
* Wave Propagation and Deep Propagation for pointer Analysis
|
|
23
|
-
* CGO 2009
|
|
24
|
-
*/
|
|
25
|
-
export declare class SCCDetection<Graph extends GraphTraits<BaseNode>> {
|
|
26
|
-
private _G;
|
|
27
|
-
private _I;
|
|
28
|
-
private _D;
|
|
29
|
-
private _R;
|
|
30
|
-
private _S;
|
|
31
|
-
private _T;
|
|
32
|
-
private repNodes;
|
|
33
|
-
private visitedNodes;
|
|
34
|
-
private inSCCNodes;
|
|
35
|
-
constructor(GT: Graph);
|
|
36
|
-
private isVisited;
|
|
37
|
-
private inSCC;
|
|
38
|
-
private setVisited;
|
|
39
|
-
private setInSCC;
|
|
40
|
-
private setRep;
|
|
41
|
-
private getRep;
|
|
42
|
-
private getNode;
|
|
43
|
-
private visit;
|
|
44
|
-
private clear;
|
|
45
|
-
/**
|
|
46
|
-
* Get the rep node
|
|
47
|
-
* If not found return itself
|
|
48
|
-
*/
|
|
49
|
-
getRepNode(n: NodeID): NodeID;
|
|
50
|
-
/**
|
|
51
|
-
* Start to detect and collapse SCC
|
|
52
|
-
*/
|
|
53
|
-
find(): void;
|
|
54
|
-
getTopoAndCollapsedNodeStack(): NodeStack;
|
|
55
|
-
getNode2SCCInfoMap(): Node2RepSCCInfoMap;
|
|
56
|
-
nodeIsInCycle(n: NodeID): boolean;
|
|
57
|
-
getMySCCNodes(n: NodeID): NodeSet;
|
|
58
|
-
getSubNodes(n: NodeID): NodeSet;
|
|
59
|
-
getRepNodes(): NodeSet;
|
|
60
|
-
}
|
|
61
|
-
export {};
|
|
1
|
+
import { BaseNode } from './BaseExplicitGraph';
|
|
2
|
+
import { NodeID, GraphTraits } from './GraphTraits';
|
|
3
|
+
type NodeSet = Set<NodeID>;
|
|
4
|
+
type NodeStack = NodeID[];
|
|
5
|
+
type Node2RepSCCInfoMap = Map<NodeID, NodeSCCInfo>;
|
|
6
|
+
/**
|
|
7
|
+
* Basic SCC info for a single node
|
|
8
|
+
*/
|
|
9
|
+
declare class NodeSCCInfo {
|
|
10
|
+
private _rep;
|
|
11
|
+
private _subNodes;
|
|
12
|
+
constructor();
|
|
13
|
+
get rep(): NodeID;
|
|
14
|
+
set rep(n: NodeID);
|
|
15
|
+
addSubNodes(n: NodeID): void;
|
|
16
|
+
get subNodes(): NodeSet;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Detect strongly connected components in a directed graph
|
|
20
|
+
* A topological graph is an extra product from this algorithm
|
|
21
|
+
* Advanced Nuutila’s algorithm which come from the following paper:
|
|
22
|
+
* Wave Propagation and Deep Propagation for pointer Analysis
|
|
23
|
+
* CGO 2009
|
|
24
|
+
*/
|
|
25
|
+
export declare class SCCDetection<Graph extends GraphTraits<BaseNode>> {
|
|
26
|
+
private _G;
|
|
27
|
+
private _I;
|
|
28
|
+
private _D;
|
|
29
|
+
private _R;
|
|
30
|
+
private _S;
|
|
31
|
+
private _T;
|
|
32
|
+
private repNodes;
|
|
33
|
+
private visitedNodes;
|
|
34
|
+
private inSCCNodes;
|
|
35
|
+
constructor(GT: Graph);
|
|
36
|
+
private isVisited;
|
|
37
|
+
private inSCC;
|
|
38
|
+
private setVisited;
|
|
39
|
+
private setInSCC;
|
|
40
|
+
private setRep;
|
|
41
|
+
private getRep;
|
|
42
|
+
private getNode;
|
|
43
|
+
private visit;
|
|
44
|
+
private clear;
|
|
45
|
+
/**
|
|
46
|
+
* Get the rep node
|
|
47
|
+
* If not found return itself
|
|
48
|
+
*/
|
|
49
|
+
getRepNode(n: NodeID): NodeID;
|
|
50
|
+
/**
|
|
51
|
+
* Start to detect and collapse SCC
|
|
52
|
+
*/
|
|
53
|
+
find(): void;
|
|
54
|
+
getTopoAndCollapsedNodeStack(): NodeStack;
|
|
55
|
+
getNode2SCCInfoMap(): Node2RepSCCInfoMap;
|
|
56
|
+
nodeIsInCycle(n: NodeID): boolean;
|
|
57
|
+
getMySCCNodes(n: NodeID): NodeSet;
|
|
58
|
+
getSubNodes(n: NodeID): NodeSet;
|
|
59
|
+
getRepNodes(): NodeSet;
|
|
60
|
+
}
|
|
61
|
+
export {};
|
|
62
62
|
//# sourceMappingURL=Scc.d.ts.map
|
package/lib/core/graph/Scc.js
CHANGED
|
@@ -1,222 +1,222 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright (c) 2024 Huawei Device Co., Ltd.
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.SCCDetection = void 0;
|
|
18
|
-
/**
|
|
19
|
-
* Basic SCC info for a single node
|
|
20
|
-
*/
|
|
21
|
-
class NodeSCCInfo {
|
|
22
|
-
constructor() {
|
|
23
|
-
this._rep = Number.MAX_SAFE_INTEGER;
|
|
24
|
-
this._subNodes = new Set();
|
|
25
|
-
}
|
|
26
|
-
get rep() {
|
|
27
|
-
return this._rep;
|
|
28
|
-
}
|
|
29
|
-
set rep(n) {
|
|
30
|
-
this._rep = n;
|
|
31
|
-
}
|
|
32
|
-
addSubNodes(n) {
|
|
33
|
-
this._subNodes.add(n);
|
|
34
|
-
}
|
|
35
|
-
get subNodes() {
|
|
36
|
-
return this._subNodes;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Detect strongly connected components in a directed graph
|
|
41
|
-
* A topological graph is an extra product from this algorithm
|
|
42
|
-
* Advanced Nuutila’s algorithm which come from the following paper:
|
|
43
|
-
* Wave Propagation and Deep Propagation for pointer Analysis
|
|
44
|
-
* CGO 2009
|
|
45
|
-
*/
|
|
46
|
-
class SCCDetection {
|
|
47
|
-
constructor(GT) {
|
|
48
|
-
this._G = GT;
|
|
49
|
-
this._I = 0;
|
|
50
|
-
this._D = new Map();
|
|
51
|
-
this._S = new Array();
|
|
52
|
-
this._T = new Array();
|
|
53
|
-
this.repNodes = new Set();
|
|
54
|
-
this._R = new Map();
|
|
55
|
-
this.visitedNodes = new Set();
|
|
56
|
-
this.inSCCNodes = new Set();
|
|
57
|
-
}
|
|
58
|
-
isVisited(n) {
|
|
59
|
-
return this.visitedNodes.has(n);
|
|
60
|
-
}
|
|
61
|
-
inSCC(n) {
|
|
62
|
-
return this.inSCCNodes.has(n);
|
|
63
|
-
}
|
|
64
|
-
setVisited(n) {
|
|
65
|
-
this.visitedNodes.add(n);
|
|
66
|
-
}
|
|
67
|
-
setInSCC(n) {
|
|
68
|
-
this.inSCCNodes.add(n);
|
|
69
|
-
}
|
|
70
|
-
setRep(n, r) {
|
|
71
|
-
let sccIn = this._R.get(n);
|
|
72
|
-
if (!sccIn) {
|
|
73
|
-
sccIn = new NodeSCCInfo();
|
|
74
|
-
this._R.set(n, sccIn);
|
|
75
|
-
}
|
|
76
|
-
sccIn.rep = r;
|
|
77
|
-
let rInfo = this._R.get(r);
|
|
78
|
-
if (!rInfo) {
|
|
79
|
-
rInfo = new NodeSCCInfo();
|
|
80
|
-
this._R.set(r, rInfo);
|
|
81
|
-
}
|
|
82
|
-
rInfo.addSubNodes(n);
|
|
83
|
-
if (n !== r) {
|
|
84
|
-
sccIn.subNodes.clear();
|
|
85
|
-
this.repNodes.add(r);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
getRep(n) {
|
|
89
|
-
let info = this._R.get(n);
|
|
90
|
-
if (!info) {
|
|
91
|
-
info = new NodeSCCInfo();
|
|
92
|
-
this._R.set(n, info);
|
|
93
|
-
}
|
|
94
|
-
return info.rep;
|
|
95
|
-
}
|
|
96
|
-
getNode(id) {
|
|
97
|
-
let n = this._G.getNode(id);
|
|
98
|
-
if (!n) {
|
|
99
|
-
throw new Error('Node is not found');
|
|
100
|
-
}
|
|
101
|
-
return n;
|
|
102
|
-
}
|
|
103
|
-
visit(v) {
|
|
104
|
-
this._I += 1;
|
|
105
|
-
this._D.set(v, this._I);
|
|
106
|
-
this.setRep(v, v);
|
|
107
|
-
this.setVisited(v);
|
|
108
|
-
let node = this.getNode(v);
|
|
109
|
-
node.getOutgoingEdges().forEach((e) => {
|
|
110
|
-
let w = e.getDstID();
|
|
111
|
-
if (!this.isVisited(w)) {
|
|
112
|
-
this.visit(w);
|
|
113
|
-
}
|
|
114
|
-
if (!this.inSCC(w)) {
|
|
115
|
-
let repV = this.getRep(v);
|
|
116
|
-
let repW = this.getRep(w);
|
|
117
|
-
if (!this._D.has(repV) || !this._D.has(repW)) {
|
|
118
|
-
throw new Error('Error happening in SCC detection');
|
|
119
|
-
}
|
|
120
|
-
let rep = this._D.get(repV) < this._D.get(repW) ? repV : repW;
|
|
121
|
-
this.setRep(v, rep);
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
if (this.getRep(v) === v) {
|
|
125
|
-
this.setInSCC(v);
|
|
126
|
-
while (this._S.length > 0) {
|
|
127
|
-
let w = this._S.at(this._S.length - 1);
|
|
128
|
-
if (this._D.get(w) <= this._D.get(v)) {
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
this._S.pop();
|
|
133
|
-
this.setInSCC(w);
|
|
134
|
-
this.setRep(w, v);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
this._T.push(v);
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
this._S.push(v);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
clear() {
|
|
144
|
-
this._R.clear();
|
|
145
|
-
this._I = 0;
|
|
146
|
-
this._D.clear();
|
|
147
|
-
this.repNodes.clear();
|
|
148
|
-
this._S.length = 0;
|
|
149
|
-
this._T.length = 0;
|
|
150
|
-
this.inSCCNodes.clear();
|
|
151
|
-
this.visitedNodes.clear();
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Get the rep node
|
|
155
|
-
* If not found return itself
|
|
156
|
-
*/
|
|
157
|
-
getRepNode(n) {
|
|
158
|
-
const it = this._R.get(n);
|
|
159
|
-
if (!it) {
|
|
160
|
-
throw new Error('scc rep not found');
|
|
161
|
-
}
|
|
162
|
-
const rep = it.rep;
|
|
163
|
-
return rep !== Number.MAX_SAFE_INTEGER ? rep : n;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Start to detect and collapse SCC
|
|
167
|
-
*/
|
|
168
|
-
find() {
|
|
169
|
-
this.clear();
|
|
170
|
-
let nodeIt = this._G.nodesItor();
|
|
171
|
-
for (let node of nodeIt) {
|
|
172
|
-
const nodeId = node.getID();
|
|
173
|
-
if (!this.isVisited(nodeId) && !this._D.has(nodeId)) {
|
|
174
|
-
this.visit(nodeId);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
getTopoAndCollapsedNodeStack() {
|
|
179
|
-
return this._T;
|
|
180
|
-
}
|
|
181
|
-
getNode2SCCInfoMap() {
|
|
182
|
-
return this._R;
|
|
183
|
-
}
|
|
184
|
-
// whether the node is in a cycle
|
|
185
|
-
nodeIsInCycle(n) {
|
|
186
|
-
const rep = this.getRepNode(n);
|
|
187
|
-
const subNodesCount = this.getSubNodes(rep).size;
|
|
188
|
-
// multi-node cycle
|
|
189
|
-
if (subNodesCount > 1) {
|
|
190
|
-
return true;
|
|
191
|
-
}
|
|
192
|
-
// self-cycle: a call a
|
|
193
|
-
let repNode = this._G.getNode(rep);
|
|
194
|
-
for (const e of repNode === null || repNode === void 0 ? void 0 : repNode.getOutgoingEdges()) {
|
|
195
|
-
if (e.getDstID() === rep) {
|
|
196
|
-
return true;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return false;
|
|
200
|
-
}
|
|
201
|
-
getMySCCNodes(n) {
|
|
202
|
-
const rep = this.getRepNode(n);
|
|
203
|
-
return this.getSubNodes(rep);
|
|
204
|
-
}
|
|
205
|
-
// get all subnodes in one scc
|
|
206
|
-
getSubNodes(n) {
|
|
207
|
-
const it = this._R.get(n);
|
|
208
|
-
if (!it) {
|
|
209
|
-
throw new Error('sccInfo not found for a node');
|
|
210
|
-
}
|
|
211
|
-
let sub = it.subNodes;
|
|
212
|
-
if (sub.size === 0) {
|
|
213
|
-
sub.add(n);
|
|
214
|
-
}
|
|
215
|
-
return sub;
|
|
216
|
-
}
|
|
217
|
-
// get all representative nodes
|
|
218
|
-
getRepNodes() {
|
|
219
|
-
return this.repNodes;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
exports.SCCDetection = SCCDetection;
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2024 Huawei Device Co., Ltd.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.SCCDetection = void 0;
|
|
18
|
+
/**
|
|
19
|
+
* Basic SCC info for a single node
|
|
20
|
+
*/
|
|
21
|
+
class NodeSCCInfo {
|
|
22
|
+
constructor() {
|
|
23
|
+
this._rep = Number.MAX_SAFE_INTEGER;
|
|
24
|
+
this._subNodes = new Set();
|
|
25
|
+
}
|
|
26
|
+
get rep() {
|
|
27
|
+
return this._rep;
|
|
28
|
+
}
|
|
29
|
+
set rep(n) {
|
|
30
|
+
this._rep = n;
|
|
31
|
+
}
|
|
32
|
+
addSubNodes(n) {
|
|
33
|
+
this._subNodes.add(n);
|
|
34
|
+
}
|
|
35
|
+
get subNodes() {
|
|
36
|
+
return this._subNodes;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Detect strongly connected components in a directed graph
|
|
41
|
+
* A topological graph is an extra product from this algorithm
|
|
42
|
+
* Advanced Nuutila’s algorithm which come from the following paper:
|
|
43
|
+
* Wave Propagation and Deep Propagation for pointer Analysis
|
|
44
|
+
* CGO 2009
|
|
45
|
+
*/
|
|
46
|
+
class SCCDetection {
|
|
47
|
+
constructor(GT) {
|
|
48
|
+
this._G = GT;
|
|
49
|
+
this._I = 0;
|
|
50
|
+
this._D = new Map();
|
|
51
|
+
this._S = new Array();
|
|
52
|
+
this._T = new Array();
|
|
53
|
+
this.repNodes = new Set();
|
|
54
|
+
this._R = new Map();
|
|
55
|
+
this.visitedNodes = new Set();
|
|
56
|
+
this.inSCCNodes = new Set();
|
|
57
|
+
}
|
|
58
|
+
isVisited(n) {
|
|
59
|
+
return this.visitedNodes.has(n);
|
|
60
|
+
}
|
|
61
|
+
inSCC(n) {
|
|
62
|
+
return this.inSCCNodes.has(n);
|
|
63
|
+
}
|
|
64
|
+
setVisited(n) {
|
|
65
|
+
this.visitedNodes.add(n);
|
|
66
|
+
}
|
|
67
|
+
setInSCC(n) {
|
|
68
|
+
this.inSCCNodes.add(n);
|
|
69
|
+
}
|
|
70
|
+
setRep(n, r) {
|
|
71
|
+
let sccIn = this._R.get(n);
|
|
72
|
+
if (!sccIn) {
|
|
73
|
+
sccIn = new NodeSCCInfo();
|
|
74
|
+
this._R.set(n, sccIn);
|
|
75
|
+
}
|
|
76
|
+
sccIn.rep = r;
|
|
77
|
+
let rInfo = this._R.get(r);
|
|
78
|
+
if (!rInfo) {
|
|
79
|
+
rInfo = new NodeSCCInfo();
|
|
80
|
+
this._R.set(r, rInfo);
|
|
81
|
+
}
|
|
82
|
+
rInfo.addSubNodes(n);
|
|
83
|
+
if (n !== r) {
|
|
84
|
+
sccIn.subNodes.clear();
|
|
85
|
+
this.repNodes.add(r);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
getRep(n) {
|
|
89
|
+
let info = this._R.get(n);
|
|
90
|
+
if (!info) {
|
|
91
|
+
info = new NodeSCCInfo();
|
|
92
|
+
this._R.set(n, info);
|
|
93
|
+
}
|
|
94
|
+
return info.rep;
|
|
95
|
+
}
|
|
96
|
+
getNode(id) {
|
|
97
|
+
let n = this._G.getNode(id);
|
|
98
|
+
if (!n) {
|
|
99
|
+
throw new Error('Node is not found');
|
|
100
|
+
}
|
|
101
|
+
return n;
|
|
102
|
+
}
|
|
103
|
+
visit(v) {
|
|
104
|
+
this._I += 1;
|
|
105
|
+
this._D.set(v, this._I);
|
|
106
|
+
this.setRep(v, v);
|
|
107
|
+
this.setVisited(v);
|
|
108
|
+
let node = this.getNode(v);
|
|
109
|
+
node.getOutgoingEdges().forEach((e) => {
|
|
110
|
+
let w = e.getDstID();
|
|
111
|
+
if (!this.isVisited(w)) {
|
|
112
|
+
this.visit(w);
|
|
113
|
+
}
|
|
114
|
+
if (!this.inSCC(w)) {
|
|
115
|
+
let repV = this.getRep(v);
|
|
116
|
+
let repW = this.getRep(w);
|
|
117
|
+
if (!this._D.has(repV) || !this._D.has(repW)) {
|
|
118
|
+
throw new Error('Error happening in SCC detection');
|
|
119
|
+
}
|
|
120
|
+
let rep = this._D.get(repV) < this._D.get(repW) ? repV : repW;
|
|
121
|
+
this.setRep(v, rep);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
if (this.getRep(v) === v) {
|
|
125
|
+
this.setInSCC(v);
|
|
126
|
+
while (this._S.length > 0) {
|
|
127
|
+
let w = this._S.at(this._S.length - 1);
|
|
128
|
+
if (this._D.get(w) <= this._D.get(v)) {
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
this._S.pop();
|
|
133
|
+
this.setInSCC(w);
|
|
134
|
+
this.setRep(w, v);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
this._T.push(v);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
this._S.push(v);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
clear() {
|
|
144
|
+
this._R.clear();
|
|
145
|
+
this._I = 0;
|
|
146
|
+
this._D.clear();
|
|
147
|
+
this.repNodes.clear();
|
|
148
|
+
this._S.length = 0;
|
|
149
|
+
this._T.length = 0;
|
|
150
|
+
this.inSCCNodes.clear();
|
|
151
|
+
this.visitedNodes.clear();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get the rep node
|
|
155
|
+
* If not found return itself
|
|
156
|
+
*/
|
|
157
|
+
getRepNode(n) {
|
|
158
|
+
const it = this._R.get(n);
|
|
159
|
+
if (!it) {
|
|
160
|
+
throw new Error('scc rep not found');
|
|
161
|
+
}
|
|
162
|
+
const rep = it.rep;
|
|
163
|
+
return rep !== Number.MAX_SAFE_INTEGER ? rep : n;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Start to detect and collapse SCC
|
|
167
|
+
*/
|
|
168
|
+
find() {
|
|
169
|
+
this.clear();
|
|
170
|
+
let nodeIt = this._G.nodesItor();
|
|
171
|
+
for (let node of nodeIt) {
|
|
172
|
+
const nodeId = node.getID();
|
|
173
|
+
if (!this.isVisited(nodeId) && !this._D.has(nodeId)) {
|
|
174
|
+
this.visit(nodeId);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
getTopoAndCollapsedNodeStack() {
|
|
179
|
+
return this._T;
|
|
180
|
+
}
|
|
181
|
+
getNode2SCCInfoMap() {
|
|
182
|
+
return this._R;
|
|
183
|
+
}
|
|
184
|
+
// whether the node is in a cycle
|
|
185
|
+
nodeIsInCycle(n) {
|
|
186
|
+
const rep = this.getRepNode(n);
|
|
187
|
+
const subNodesCount = this.getSubNodes(rep).size;
|
|
188
|
+
// multi-node cycle
|
|
189
|
+
if (subNodesCount > 1) {
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
// self-cycle: a call a
|
|
193
|
+
let repNode = this._G.getNode(rep);
|
|
194
|
+
for (const e of repNode === null || repNode === void 0 ? void 0 : repNode.getOutgoingEdges()) {
|
|
195
|
+
if (e.getDstID() === rep) {
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
getMySCCNodes(n) {
|
|
202
|
+
const rep = this.getRepNode(n);
|
|
203
|
+
return this.getSubNodes(rep);
|
|
204
|
+
}
|
|
205
|
+
// get all subnodes in one scc
|
|
206
|
+
getSubNodes(n) {
|
|
207
|
+
const it = this._R.get(n);
|
|
208
|
+
if (!it) {
|
|
209
|
+
throw new Error('sccInfo not found for a node');
|
|
210
|
+
}
|
|
211
|
+
let sub = it.subNodes;
|
|
212
|
+
if (sub.size === 0) {
|
|
213
|
+
sub.add(n);
|
|
214
|
+
}
|
|
215
|
+
return sub;
|
|
216
|
+
}
|
|
217
|
+
// get all representative nodes
|
|
218
|
+
getRepNodes() {
|
|
219
|
+
return this.repNodes;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
exports.SCCDetection = SCCDetection;
|