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
|
@@ -1,280 +1,280 @@
|
|
|
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
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
-
if (k2 === undefined) k2 = k;
|
|
18
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
-
}
|
|
22
|
-
Object.defineProperty(o, k2, desc);
|
|
23
|
-
}) : (function(o, m, k, k2) {
|
|
24
|
-
if (k2 === undefined) k2 = k;
|
|
25
|
-
o[k2] = m[k];
|
|
26
|
-
}));
|
|
27
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
-
}) : function(o, v) {
|
|
30
|
-
o["default"] = v;
|
|
31
|
-
});
|
|
32
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.BasicBlock = void 0;
|
|
41
|
-
const Stmt_1 = require("../base/Stmt");
|
|
42
|
-
const ArkError_1 = require("../common/ArkError");
|
|
43
|
-
const logger_1 = __importStar(require("../../utils/logger"));
|
|
44
|
-
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'BasicBlock');
|
|
45
|
-
/**
|
|
46
|
-
* @category core/graph
|
|
47
|
-
* A `BasicBlock` is composed of:
|
|
48
|
-
* - ID: a **number** that uniquely identify the basic block, initialized as -1.
|
|
49
|
-
* - Statements: an **array** of statements in the basic block.
|
|
50
|
-
* - Predecessors: an **array** of basic blocks in front of the current basic block. More accurately, these basic
|
|
51
|
-
* blocks can reach the current block through edges.
|
|
52
|
-
* - Successors: an **array** of basic blocks after the current basic block. More accurately, the current block can
|
|
53
|
-
* reach these basic blocks through edges.
|
|
54
|
-
*/
|
|
55
|
-
class BasicBlock {
|
|
56
|
-
constructor() {
|
|
57
|
-
this.id = -1;
|
|
58
|
-
this.stmts = [];
|
|
59
|
-
this.predecessorBlocks = [];
|
|
60
|
-
this.successorBlocks = [];
|
|
61
|
-
}
|
|
62
|
-
getId() {
|
|
63
|
-
return this.id;
|
|
64
|
-
}
|
|
65
|
-
setId(id) {
|
|
66
|
-
this.id = id;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Returns an array of the statements in a basic block.
|
|
70
|
-
* @returns An array of statements in a basic block.
|
|
71
|
-
*/
|
|
72
|
-
getStmts() {
|
|
73
|
-
return this.stmts;
|
|
74
|
-
}
|
|
75
|
-
addStmt(stmt) {
|
|
76
|
-
this.stmts.push(stmt);
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Adds the given stmt at the beginning of the basic block.
|
|
80
|
-
* @param stmt
|
|
81
|
-
*/
|
|
82
|
-
addHead(stmt) {
|
|
83
|
-
if (stmt instanceof Stmt_1.Stmt) {
|
|
84
|
-
this.stmts.unshift(stmt);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
this.stmts.unshift(...stmt);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Adds the given stmt at the end of the basic block.
|
|
92
|
-
* @param stmt
|
|
93
|
-
*/
|
|
94
|
-
addTail(stmt) {
|
|
95
|
-
if (stmt instanceof Stmt_1.Stmt) {
|
|
96
|
-
this.stmts.push(stmt);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
stmt.forEach(stmt => this.stmts.push(stmt));
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Inserts toInsert in the basic block after point.
|
|
104
|
-
* @param toInsert
|
|
105
|
-
* @param point
|
|
106
|
-
* @returns The number of successfully inserted statements
|
|
107
|
-
*/
|
|
108
|
-
insertAfter(toInsert, point) {
|
|
109
|
-
let index = this.stmts.indexOf(point);
|
|
110
|
-
if (index < 0) {
|
|
111
|
-
return 0;
|
|
112
|
-
}
|
|
113
|
-
return this.insertPos(index + 1, toInsert);
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Inserts toInsert in the basic block befor point.
|
|
117
|
-
* @param toInsert
|
|
118
|
-
* @param point
|
|
119
|
-
* @returns The number of successfully inserted statements
|
|
120
|
-
*/
|
|
121
|
-
insertBefore(toInsert, point) {
|
|
122
|
-
let index = this.stmts.indexOf(point);
|
|
123
|
-
if (index < 0) {
|
|
124
|
-
return 0;
|
|
125
|
-
}
|
|
126
|
-
return this.insertPos(index, toInsert);
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Removes the given stmt from this basic block.
|
|
130
|
-
* @param stmt
|
|
131
|
-
* @returns
|
|
132
|
-
*/
|
|
133
|
-
remove(stmt) {
|
|
134
|
-
let index = this.stmts.indexOf(stmt);
|
|
135
|
-
if (index < 0) {
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
this.stmts.splice(index, 1);
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Removes the first stmt from this basic block.
|
|
142
|
-
*/
|
|
143
|
-
removeHead() {
|
|
144
|
-
this.stmts.splice(0, 1);
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Removes the last stmt from this basic block.
|
|
148
|
-
*/
|
|
149
|
-
removeTail() {
|
|
150
|
-
this.stmts.splice(this.stmts.length - 1, 1);
|
|
151
|
-
}
|
|
152
|
-
getHead() {
|
|
153
|
-
if (this.stmts.length === 0) {
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
return this.stmts[0];
|
|
157
|
-
}
|
|
158
|
-
getTail() {
|
|
159
|
-
let size = this.stmts.length;
|
|
160
|
-
if (size === 0) {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
return this.stmts[size - 1];
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Returns successors of the current basic block, whose types are also basic blocks (i.e.{@link BasicBlock}).
|
|
167
|
-
* @returns Successors of the current basic block.
|
|
168
|
-
* @example
|
|
169
|
-
* 1. get block successors.
|
|
170
|
-
|
|
171
|
-
```typescript
|
|
172
|
-
const body = arkMethod.getBody();
|
|
173
|
-
const blocks = [...body.getCfg().getBlocks()]
|
|
174
|
-
for (let i = 0; i < blocks.length; i++) {
|
|
175
|
-
const block = blocks[i]
|
|
176
|
-
...
|
|
177
|
-
for (const next of block.getSuccessors()) {
|
|
178
|
-
...
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
*/
|
|
183
|
-
getSuccessors() {
|
|
184
|
-
return this.successorBlocks;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Returns predecessors of the current basic block, whose types are also basic blocks.
|
|
188
|
-
* @returns An array of basic blocks.
|
|
189
|
-
*/
|
|
190
|
-
getPredecessors() {
|
|
191
|
-
return this.predecessorBlocks;
|
|
192
|
-
}
|
|
193
|
-
addPredecessorBlock(block) {
|
|
194
|
-
this.predecessorBlocks.push(block);
|
|
195
|
-
}
|
|
196
|
-
setPredecessorBlock(idx, block) {
|
|
197
|
-
if (idx < this.predecessorBlocks.length) {
|
|
198
|
-
this.predecessorBlocks[idx] = block;
|
|
199
|
-
return true;
|
|
200
|
-
}
|
|
201
|
-
return false;
|
|
202
|
-
}
|
|
203
|
-
setSuccessorBlock(idx, block) {
|
|
204
|
-
if (idx < this.successorBlocks.length) {
|
|
205
|
-
this.successorBlocks[idx] = block;
|
|
206
|
-
return true;
|
|
207
|
-
}
|
|
208
|
-
return false;
|
|
209
|
-
}
|
|
210
|
-
// Temp just for SSA
|
|
211
|
-
addStmtToFirst(stmt) {
|
|
212
|
-
this.addHead(stmt);
|
|
213
|
-
}
|
|
214
|
-
// Temp just for SSA
|
|
215
|
-
addSuccessorBlock(block) {
|
|
216
|
-
this.successorBlocks.push(block);
|
|
217
|
-
}
|
|
218
|
-
removePredecessorBlock(block) {
|
|
219
|
-
let index = this.predecessorBlocks.indexOf(block);
|
|
220
|
-
if (index < 0) {
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
this.predecessorBlocks.splice(index, 1);
|
|
224
|
-
return true;
|
|
225
|
-
}
|
|
226
|
-
removeSuccessorBlock(block) {
|
|
227
|
-
let index = this.successorBlocks.indexOf(block);
|
|
228
|
-
if (index < 0) {
|
|
229
|
-
return false;
|
|
230
|
-
}
|
|
231
|
-
this.successorBlocks.splice(index, 1);
|
|
232
|
-
return true;
|
|
233
|
-
}
|
|
234
|
-
toString() {
|
|
235
|
-
let strs = [];
|
|
236
|
-
for (const stmt of this.stmts) {
|
|
237
|
-
strs.push(stmt.toString() + '\n');
|
|
238
|
-
}
|
|
239
|
-
return strs.join('');
|
|
240
|
-
}
|
|
241
|
-
validate() {
|
|
242
|
-
let branchStmts = [];
|
|
243
|
-
for (const stmt of this.stmts) {
|
|
244
|
-
if (stmt instanceof Stmt_1.ArkIfStmt ||
|
|
245
|
-
stmt instanceof Stmt_1.ArkReturnStmt ||
|
|
246
|
-
stmt instanceof Stmt_1.ArkReturnVoidStmt) {
|
|
247
|
-
branchStmts.push(stmt);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
if (branchStmts.length > 1) {
|
|
251
|
-
let errMsg = `More than one branch or return stmts in the block: ${branchStmts.map((value) => value.toString()).join('\n')}`;
|
|
252
|
-
logger.error(errMsg);
|
|
253
|
-
return { errCode: ArkError_1.ArkErrorCode.BB_MORE_THAN_ONE_BRANCH_RET_STMT, errMsg: errMsg };
|
|
254
|
-
}
|
|
255
|
-
if (branchStmts.length === 1 && branchStmts[0] !== this.stmts[this.stmts.length - 1]) {
|
|
256
|
-
let errMsg = `${branchStmts[0].toString()} not at the end of block.`;
|
|
257
|
-
logger.error(errMsg);
|
|
258
|
-
return { errCode: ArkError_1.ArkErrorCode.BB_BRANCH_RET_STMT_NOT_AT_END, errMsg: errMsg };
|
|
259
|
-
}
|
|
260
|
-
return { errCode: ArkError_1.ArkErrorCode.OK };
|
|
261
|
-
}
|
|
262
|
-
insertPos(index, toInsert) {
|
|
263
|
-
if (toInsert instanceof Stmt_1.Stmt) {
|
|
264
|
-
this.stmts.splice(index, 0, toInsert);
|
|
265
|
-
return 1;
|
|
266
|
-
}
|
|
267
|
-
this.stmts.splice(index, 0, ...toInsert);
|
|
268
|
-
return toInsert.length;
|
|
269
|
-
}
|
|
270
|
-
getExceptionalSuccessorBlocks() {
|
|
271
|
-
return this.exceptionalSuccessorBlocks;
|
|
272
|
-
}
|
|
273
|
-
addExceptionalSuccessorBlock(block) {
|
|
274
|
-
if (!this.exceptionalSuccessorBlocks) {
|
|
275
|
-
this.exceptionalSuccessorBlocks = [];
|
|
276
|
-
}
|
|
277
|
-
this.exceptionalSuccessorBlocks.push(block);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
exports.BasicBlock = BasicBlock;
|
|
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
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.BasicBlock = void 0;
|
|
41
|
+
const Stmt_1 = require("../base/Stmt");
|
|
42
|
+
const ArkError_1 = require("../common/ArkError");
|
|
43
|
+
const logger_1 = __importStar(require("../../utils/logger"));
|
|
44
|
+
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'BasicBlock');
|
|
45
|
+
/**
|
|
46
|
+
* @category core/graph
|
|
47
|
+
* A `BasicBlock` is composed of:
|
|
48
|
+
* - ID: a **number** that uniquely identify the basic block, initialized as -1.
|
|
49
|
+
* - Statements: an **array** of statements in the basic block.
|
|
50
|
+
* - Predecessors: an **array** of basic blocks in front of the current basic block. More accurately, these basic
|
|
51
|
+
* blocks can reach the current block through edges.
|
|
52
|
+
* - Successors: an **array** of basic blocks after the current basic block. More accurately, the current block can
|
|
53
|
+
* reach these basic blocks through edges.
|
|
54
|
+
*/
|
|
55
|
+
class BasicBlock {
|
|
56
|
+
constructor() {
|
|
57
|
+
this.id = -1;
|
|
58
|
+
this.stmts = [];
|
|
59
|
+
this.predecessorBlocks = [];
|
|
60
|
+
this.successorBlocks = [];
|
|
61
|
+
}
|
|
62
|
+
getId() {
|
|
63
|
+
return this.id;
|
|
64
|
+
}
|
|
65
|
+
setId(id) {
|
|
66
|
+
this.id = id;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Returns an array of the statements in a basic block.
|
|
70
|
+
* @returns An array of statements in a basic block.
|
|
71
|
+
*/
|
|
72
|
+
getStmts() {
|
|
73
|
+
return this.stmts;
|
|
74
|
+
}
|
|
75
|
+
addStmt(stmt) {
|
|
76
|
+
this.stmts.push(stmt);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Adds the given stmt at the beginning of the basic block.
|
|
80
|
+
* @param stmt
|
|
81
|
+
*/
|
|
82
|
+
addHead(stmt) {
|
|
83
|
+
if (stmt instanceof Stmt_1.Stmt) {
|
|
84
|
+
this.stmts.unshift(stmt);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.stmts.unshift(...stmt);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Adds the given stmt at the end of the basic block.
|
|
92
|
+
* @param stmt
|
|
93
|
+
*/
|
|
94
|
+
addTail(stmt) {
|
|
95
|
+
if (stmt instanceof Stmt_1.Stmt) {
|
|
96
|
+
this.stmts.push(stmt);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
stmt.forEach(stmt => this.stmts.push(stmt));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Inserts toInsert in the basic block after point.
|
|
104
|
+
* @param toInsert
|
|
105
|
+
* @param point
|
|
106
|
+
* @returns The number of successfully inserted statements
|
|
107
|
+
*/
|
|
108
|
+
insertAfter(toInsert, point) {
|
|
109
|
+
let index = this.stmts.indexOf(point);
|
|
110
|
+
if (index < 0) {
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
return this.insertPos(index + 1, toInsert);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Inserts toInsert in the basic block befor point.
|
|
117
|
+
* @param toInsert
|
|
118
|
+
* @param point
|
|
119
|
+
* @returns The number of successfully inserted statements
|
|
120
|
+
*/
|
|
121
|
+
insertBefore(toInsert, point) {
|
|
122
|
+
let index = this.stmts.indexOf(point);
|
|
123
|
+
if (index < 0) {
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
return this.insertPos(index, toInsert);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Removes the given stmt from this basic block.
|
|
130
|
+
* @param stmt
|
|
131
|
+
* @returns
|
|
132
|
+
*/
|
|
133
|
+
remove(stmt) {
|
|
134
|
+
let index = this.stmts.indexOf(stmt);
|
|
135
|
+
if (index < 0) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this.stmts.splice(index, 1);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Removes the first stmt from this basic block.
|
|
142
|
+
*/
|
|
143
|
+
removeHead() {
|
|
144
|
+
this.stmts.splice(0, 1);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Removes the last stmt from this basic block.
|
|
148
|
+
*/
|
|
149
|
+
removeTail() {
|
|
150
|
+
this.stmts.splice(this.stmts.length - 1, 1);
|
|
151
|
+
}
|
|
152
|
+
getHead() {
|
|
153
|
+
if (this.stmts.length === 0) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
return this.stmts[0];
|
|
157
|
+
}
|
|
158
|
+
getTail() {
|
|
159
|
+
let size = this.stmts.length;
|
|
160
|
+
if (size === 0) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
return this.stmts[size - 1];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Returns successors of the current basic block, whose types are also basic blocks (i.e.{@link BasicBlock}).
|
|
167
|
+
* @returns Successors of the current basic block.
|
|
168
|
+
* @example
|
|
169
|
+
* 1. get block successors.
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
const body = arkMethod.getBody();
|
|
173
|
+
const blocks = [...body.getCfg().getBlocks()]
|
|
174
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
175
|
+
const block = blocks[i]
|
|
176
|
+
...
|
|
177
|
+
for (const next of block.getSuccessors()) {
|
|
178
|
+
...
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
*/
|
|
183
|
+
getSuccessors() {
|
|
184
|
+
return this.successorBlocks;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Returns predecessors of the current basic block, whose types are also basic blocks.
|
|
188
|
+
* @returns An array of basic blocks.
|
|
189
|
+
*/
|
|
190
|
+
getPredecessors() {
|
|
191
|
+
return this.predecessorBlocks;
|
|
192
|
+
}
|
|
193
|
+
addPredecessorBlock(block) {
|
|
194
|
+
this.predecessorBlocks.push(block);
|
|
195
|
+
}
|
|
196
|
+
setPredecessorBlock(idx, block) {
|
|
197
|
+
if (idx < this.predecessorBlocks.length) {
|
|
198
|
+
this.predecessorBlocks[idx] = block;
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
setSuccessorBlock(idx, block) {
|
|
204
|
+
if (idx < this.successorBlocks.length) {
|
|
205
|
+
this.successorBlocks[idx] = block;
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
// Temp just for SSA
|
|
211
|
+
addStmtToFirst(stmt) {
|
|
212
|
+
this.addHead(stmt);
|
|
213
|
+
}
|
|
214
|
+
// Temp just for SSA
|
|
215
|
+
addSuccessorBlock(block) {
|
|
216
|
+
this.successorBlocks.push(block);
|
|
217
|
+
}
|
|
218
|
+
removePredecessorBlock(block) {
|
|
219
|
+
let index = this.predecessorBlocks.indexOf(block);
|
|
220
|
+
if (index < 0) {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
this.predecessorBlocks.splice(index, 1);
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
removeSuccessorBlock(block) {
|
|
227
|
+
let index = this.successorBlocks.indexOf(block);
|
|
228
|
+
if (index < 0) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
this.successorBlocks.splice(index, 1);
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
toString() {
|
|
235
|
+
let strs = [];
|
|
236
|
+
for (const stmt of this.stmts) {
|
|
237
|
+
strs.push(stmt.toString() + '\n');
|
|
238
|
+
}
|
|
239
|
+
return strs.join('');
|
|
240
|
+
}
|
|
241
|
+
validate() {
|
|
242
|
+
let branchStmts = [];
|
|
243
|
+
for (const stmt of this.stmts) {
|
|
244
|
+
if (stmt instanceof Stmt_1.ArkIfStmt ||
|
|
245
|
+
stmt instanceof Stmt_1.ArkReturnStmt ||
|
|
246
|
+
stmt instanceof Stmt_1.ArkReturnVoidStmt) {
|
|
247
|
+
branchStmts.push(stmt);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
if (branchStmts.length > 1) {
|
|
251
|
+
let errMsg = `More than one branch or return stmts in the block: ${branchStmts.map((value) => value.toString()).join('\n')}`;
|
|
252
|
+
logger.error(errMsg);
|
|
253
|
+
return { errCode: ArkError_1.ArkErrorCode.BB_MORE_THAN_ONE_BRANCH_RET_STMT, errMsg: errMsg };
|
|
254
|
+
}
|
|
255
|
+
if (branchStmts.length === 1 && branchStmts[0] !== this.stmts[this.stmts.length - 1]) {
|
|
256
|
+
let errMsg = `${branchStmts[0].toString()} not at the end of block.`;
|
|
257
|
+
logger.error(errMsg);
|
|
258
|
+
return { errCode: ArkError_1.ArkErrorCode.BB_BRANCH_RET_STMT_NOT_AT_END, errMsg: errMsg };
|
|
259
|
+
}
|
|
260
|
+
return { errCode: ArkError_1.ArkErrorCode.OK };
|
|
261
|
+
}
|
|
262
|
+
insertPos(index, toInsert) {
|
|
263
|
+
if (toInsert instanceof Stmt_1.Stmt) {
|
|
264
|
+
this.stmts.splice(index, 0, toInsert);
|
|
265
|
+
return 1;
|
|
266
|
+
}
|
|
267
|
+
this.stmts.splice(index, 0, ...toInsert);
|
|
268
|
+
return toInsert.length;
|
|
269
|
+
}
|
|
270
|
+
getExceptionalSuccessorBlocks() {
|
|
271
|
+
return this.exceptionalSuccessorBlocks;
|
|
272
|
+
}
|
|
273
|
+
addExceptionalSuccessorBlock(block) {
|
|
274
|
+
if (!this.exceptionalSuccessorBlocks) {
|
|
275
|
+
this.exceptionalSuccessorBlocks = [];
|
|
276
|
+
}
|
|
277
|
+
this.exceptionalSuccessorBlocks.push(block);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
exports.BasicBlock = BasicBlock;
|
package/lib/core/graph/Cfg.d.ts
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
import { DefUseChain } from '../base/DefUseChain';
|
|
2
|
-
import { Local } from '../base/Local';
|
|
3
|
-
import { Stmt } from '../base/Stmt';
|
|
4
|
-
import { ArkError } from '../common/ArkError';
|
|
5
|
-
import { ArkMethod } from '../model/ArkMethod';
|
|
6
|
-
import { BasicBlock } from './BasicBlock';
|
|
7
|
-
/**
|
|
8
|
-
* @category core/graph
|
|
9
|
-
*/
|
|
10
|
-
export declare class Cfg {
|
|
11
|
-
private blocks;
|
|
12
|
-
private stmtToBlock;
|
|
13
|
-
private startingStmt;
|
|
14
|
-
private defUseChains;
|
|
15
|
-
private declaringMethod;
|
|
16
|
-
constructor();
|
|
17
|
-
getStmts(): Stmt[];
|
|
18
|
-
/**
|
|
19
|
-
* Inserts toInsert in the basic block in CFG after point.
|
|
20
|
-
* @param toInsert
|
|
21
|
-
* @param point
|
|
22
|
-
* @returns The number of successfully inserted statements
|
|
23
|
-
*/
|
|
24
|
-
insertAfter(toInsert: Stmt | Stmt[], point: Stmt): number;
|
|
25
|
-
/**
|
|
26
|
-
* Inserts toInsert in the basic block in CFG befor point.
|
|
27
|
-
* @param toInsert
|
|
28
|
-
* @param point
|
|
29
|
-
* @returns The number of successfully inserted statements
|
|
30
|
-
*/
|
|
31
|
-
insertBefore(toInsert: Stmt | Stmt[], point: Stmt): number;
|
|
32
|
-
/**
|
|
33
|
-
* Removes the given stmt from the basic block in CFG.
|
|
34
|
-
* @param stmt
|
|
35
|
-
* @returns
|
|
36
|
-
*/
|
|
37
|
-
remove(stmt: Stmt): void;
|
|
38
|
-
/**
|
|
39
|
-
* Update stmtToBlock Map
|
|
40
|
-
* @param block
|
|
41
|
-
* @param changed
|
|
42
|
-
*/
|
|
43
|
-
updateStmt2BlockMap(block: BasicBlock, changed?: Stmt | Stmt[]): void;
|
|
44
|
-
addBlock(block: BasicBlock): void;
|
|
45
|
-
getBlocks(): Set<BasicBlock>;
|
|
46
|
-
getStartingBlock(): BasicBlock | undefined;
|
|
47
|
-
getStartingStmt(): Stmt;
|
|
48
|
-
setStartingStmt(newStartingStmt: Stmt): void;
|
|
49
|
-
getDeclaringMethod(): ArkMethod;
|
|
50
|
-
setDeclaringMethod(method: ArkMethod): void;
|
|
51
|
-
getDefUseChains(): DefUseChain[];
|
|
52
|
-
toString(): string;
|
|
53
|
-
buildDefUseStmt(locals: Set<Local>): void;
|
|
54
|
-
private buildUseStmt;
|
|
55
|
-
buildDefUseChain(): void;
|
|
56
|
-
getUnreachableBlocks(): Set<BasicBlock>;
|
|
57
|
-
validate(): ArkError;
|
|
58
|
-
private dfsPostOrder;
|
|
59
|
-
}
|
|
1
|
+
import { DefUseChain } from '../base/DefUseChain';
|
|
2
|
+
import { Local } from '../base/Local';
|
|
3
|
+
import { Stmt } from '../base/Stmt';
|
|
4
|
+
import { ArkError } from '../common/ArkError';
|
|
5
|
+
import { ArkMethod } from '../model/ArkMethod';
|
|
6
|
+
import { BasicBlock } from './BasicBlock';
|
|
7
|
+
/**
|
|
8
|
+
* @category core/graph
|
|
9
|
+
*/
|
|
10
|
+
export declare class Cfg {
|
|
11
|
+
private blocks;
|
|
12
|
+
private stmtToBlock;
|
|
13
|
+
private startingStmt;
|
|
14
|
+
private defUseChains;
|
|
15
|
+
private declaringMethod;
|
|
16
|
+
constructor();
|
|
17
|
+
getStmts(): Stmt[];
|
|
18
|
+
/**
|
|
19
|
+
* Inserts toInsert in the basic block in CFG after point.
|
|
20
|
+
* @param toInsert
|
|
21
|
+
* @param point
|
|
22
|
+
* @returns The number of successfully inserted statements
|
|
23
|
+
*/
|
|
24
|
+
insertAfter(toInsert: Stmt | Stmt[], point: Stmt): number;
|
|
25
|
+
/**
|
|
26
|
+
* Inserts toInsert in the basic block in CFG befor point.
|
|
27
|
+
* @param toInsert
|
|
28
|
+
* @param point
|
|
29
|
+
* @returns The number of successfully inserted statements
|
|
30
|
+
*/
|
|
31
|
+
insertBefore(toInsert: Stmt | Stmt[], point: Stmt): number;
|
|
32
|
+
/**
|
|
33
|
+
* Removes the given stmt from the basic block in CFG.
|
|
34
|
+
* @param stmt
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
37
|
+
remove(stmt: Stmt): void;
|
|
38
|
+
/**
|
|
39
|
+
* Update stmtToBlock Map
|
|
40
|
+
* @param block
|
|
41
|
+
* @param changed
|
|
42
|
+
*/
|
|
43
|
+
updateStmt2BlockMap(block: BasicBlock, changed?: Stmt | Stmt[]): void;
|
|
44
|
+
addBlock(block: BasicBlock): void;
|
|
45
|
+
getBlocks(): Set<BasicBlock>;
|
|
46
|
+
getStartingBlock(): BasicBlock | undefined;
|
|
47
|
+
getStartingStmt(): Stmt;
|
|
48
|
+
setStartingStmt(newStartingStmt: Stmt): void;
|
|
49
|
+
getDeclaringMethod(): ArkMethod;
|
|
50
|
+
setDeclaringMethod(method: ArkMethod): void;
|
|
51
|
+
getDefUseChains(): DefUseChain[];
|
|
52
|
+
toString(): string;
|
|
53
|
+
buildDefUseStmt(locals: Set<Local>): void;
|
|
54
|
+
private buildUseStmt;
|
|
55
|
+
buildDefUseChain(): void;
|
|
56
|
+
getUnreachableBlocks(): Set<BasicBlock>;
|
|
57
|
+
validate(): ArkError;
|
|
58
|
+
private dfsPostOrder;
|
|
59
|
+
}
|
|
60
60
|
//# sourceMappingURL=Cfg.d.ts.map
|