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,272 +1,272 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright (c) 2025 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.TrapBuilder = void 0;
|
|
41
|
-
const BasicBlock_1 = require("../BasicBlock");
|
|
42
|
-
const Trap_1 = require("../../base/Trap");
|
|
43
|
-
const Ref_1 = require("../../base/Ref");
|
|
44
|
-
const Type_1 = require("../../base/Type");
|
|
45
|
-
const Position_1 = require("../../base/Position");
|
|
46
|
-
const Stmt_1 = require("../../base/Stmt");
|
|
47
|
-
const logger_1 = __importStar(require("../../../utils/logger"));
|
|
48
|
-
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'TrapBuilder');
|
|
49
|
-
/**
|
|
50
|
-
* Builder for traps from try...catch
|
|
51
|
-
*/
|
|
52
|
-
class TrapBuilder {
|
|
53
|
-
buildTraps(blockBuilderToCfgBlock, blockBuildersBeforeTry, arkIRTransformer, basicBlockSet) {
|
|
54
|
-
var _a, _b, _c;
|
|
55
|
-
const traps = [];
|
|
56
|
-
for (const blockBuilderBeforeTry of blockBuildersBeforeTry) {
|
|
57
|
-
if (blockBuilderBeforeTry.nexts.length === 0) {
|
|
58
|
-
logger.error(`can't find try block.`);
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
const blockBuilderContainTry = blockBuilderBeforeTry.nexts[0];
|
|
62
|
-
const stmtsCnt = blockBuilderBeforeTry.stmts.length;
|
|
63
|
-
const tryStmtBuilder = blockBuilderBeforeTry.stmts[stmtsCnt - 1];
|
|
64
|
-
const finallyBlockBuilder = (_a = tryStmtBuilder.finallyStatement) === null || _a === void 0 ? void 0 : _a.block;
|
|
65
|
-
if (!finallyBlockBuilder) {
|
|
66
|
-
logger.error(`can't find finally block or dummy finally block.`);
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
const { bfsBlocks: tryBfsBlocks, tailBlocks: tryTailBlocks } = this.getAllBlocksBFS(blockBuilderToCfgBlock, blockBuilderContainTry, finallyBlockBuilder);
|
|
70
|
-
let catchBfsBlocks = [];
|
|
71
|
-
let catchTailBlocks = [];
|
|
72
|
-
const catchBlockBuilder = (_b = tryStmtBuilder.catchStatement) === null || _b === void 0 ? void 0 : _b.block;
|
|
73
|
-
if (catchBlockBuilder) {
|
|
74
|
-
({ bfsBlocks: catchBfsBlocks, tailBlocks: catchTailBlocks } = this.getAllBlocksBFS(blockBuilderToCfgBlock, catchBlockBuilder));
|
|
75
|
-
}
|
|
76
|
-
const finallyStmts = finallyBlockBuilder.stmts;
|
|
77
|
-
const blockBuilderAfterFinally = (_c = tryStmtBuilder.afterFinal) === null || _c === void 0 ? void 0 : _c.block;
|
|
78
|
-
if (!blockBuilderAfterFinally) {
|
|
79
|
-
logger.error(`can't find block after try...catch.`);
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
if (finallyStmts.length === 1 && finallyStmts[0].code === 'dummyFinally') { // no finally block
|
|
83
|
-
const trapsIfNoFinally = this.buildTrapsIfNoFinally(tryBfsBlocks, tryTailBlocks, catchBfsBlocks, catchTailBlocks, finallyBlockBuilder, blockBuilderAfterFinally, basicBlockSet, blockBuilderToCfgBlock);
|
|
84
|
-
if (trapsIfNoFinally) {
|
|
85
|
-
traps.push(...trapsIfNoFinally);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
const trapsIfFinallyExist = this.buildTrapsIfFinallyExist(tryBfsBlocks, tryTailBlocks, catchBfsBlocks, catchTailBlocks, finallyBlockBuilder, blockBuilderAfterFinally, basicBlockSet, arkIRTransformer, blockBuilderToCfgBlock);
|
|
90
|
-
traps.push(...trapsIfFinallyExist);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return traps;
|
|
94
|
-
}
|
|
95
|
-
buildTrapsIfNoFinally(tryBfsBlocks, tryTailBlocks, catchBfsBlocks, catchTailBlocks, finallyBlockBuilder, blockBuilderAfterFinally, basicBlockSet, blockBuilderToCfgBlock) {
|
|
96
|
-
if (catchBfsBlocks.length === 0) {
|
|
97
|
-
logger.error(`catch block expected.`);
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
if (!blockBuilderToCfgBlock.has(blockBuilderAfterFinally)) {
|
|
101
|
-
logger.error(`can't find basicBlock corresponding to the blockBuilder.`);
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
let blockAfterFinally = blockBuilderToCfgBlock.get(blockBuilderAfterFinally);
|
|
105
|
-
if (!blockBuilderToCfgBlock.has(finallyBlockBuilder)) {
|
|
106
|
-
logger.error(`can't find basicBlock corresponding to the blockBuilder.`);
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
const finallyBlock = blockBuilderToCfgBlock.get(finallyBlockBuilder);
|
|
110
|
-
let dummyFinallyIdxInPredecessors = -1;
|
|
111
|
-
for (let i = 0; i < blockAfterFinally.getPredecessors().length; i++) {
|
|
112
|
-
if (blockAfterFinally.getPredecessors()[i] === finallyBlock) {
|
|
113
|
-
dummyFinallyIdxInPredecessors = i;
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (dummyFinallyIdxInPredecessors === -1) {
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
blockAfterFinally.getPredecessors().splice(dummyFinallyIdxInPredecessors, 1);
|
|
121
|
-
for (const tryTailBlock of tryTailBlocks) {
|
|
122
|
-
tryTailBlock.setSuccessorBlock(0, blockAfterFinally);
|
|
123
|
-
blockAfterFinally.addPredecessorBlock(tryTailBlock);
|
|
124
|
-
}
|
|
125
|
-
basicBlockSet.delete(finallyBlock);
|
|
126
|
-
for (const catchTailBlock of catchTailBlocks) {
|
|
127
|
-
catchTailBlock.addSuccessorBlock(blockAfterFinally);
|
|
128
|
-
blockAfterFinally.addPredecessorBlock(catchTailBlock);
|
|
129
|
-
}
|
|
130
|
-
for (const tryTailBlock of tryTailBlocks) {
|
|
131
|
-
tryTailBlock.addExceptionalSuccessorBlock(catchBfsBlocks[0]);
|
|
132
|
-
}
|
|
133
|
-
return [new Trap_1.Trap(tryBfsBlocks, catchBfsBlocks)];
|
|
134
|
-
}
|
|
135
|
-
buildTrapsIfFinallyExist(tryBfsBlocks, tryTailBlocks, catchBfsBlocks, catchTailBlocks, finallyBlockBuilder, blockBuilderAfterFinally, basicBlockSet, arkIRTransformer, blockBuilderToCfgBlock) {
|
|
136
|
-
const { bfsBlocks: finallyBfsBlocks, tailBlocks: finallyTailBlocks } = this.getAllBlocksBFS(blockBuilderToCfgBlock, finallyBlockBuilder, blockBuilderAfterFinally);
|
|
137
|
-
const copyFinallyBfsBlocks = this.copyFinallyBlocks(finallyBfsBlocks, finallyTailBlocks, basicBlockSet, arkIRTransformer, blockBuilderToCfgBlock);
|
|
138
|
-
const traps = [];
|
|
139
|
-
if (catchBfsBlocks.length !== 0) {
|
|
140
|
-
for (const catchTailBlock of catchTailBlocks) {
|
|
141
|
-
catchTailBlock.addSuccessorBlock(finallyBfsBlocks[0]);
|
|
142
|
-
finallyBfsBlocks[0].addPredecessorBlock(catchTailBlock);
|
|
143
|
-
}
|
|
144
|
-
// try -> catch trap
|
|
145
|
-
for (const tryTailBlock of tryTailBlocks) {
|
|
146
|
-
tryTailBlock.addExceptionalSuccessorBlock(catchBfsBlocks[0]);
|
|
147
|
-
}
|
|
148
|
-
traps.push(new Trap_1.Trap(tryBfsBlocks, catchBfsBlocks));
|
|
149
|
-
// catch -> finally trap
|
|
150
|
-
for (const catchTailBlock of catchTailBlocks) {
|
|
151
|
-
catchTailBlock.addExceptionalSuccessorBlock(copyFinallyBfsBlocks[0]);
|
|
152
|
-
}
|
|
153
|
-
traps.push(new Trap_1.Trap(catchBfsBlocks, copyFinallyBfsBlocks));
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
// try -> finally trap
|
|
157
|
-
for (const tryTailBlock of tryTailBlocks) {
|
|
158
|
-
tryTailBlock.addExceptionalSuccessorBlock(copyFinallyBfsBlocks[0]);
|
|
159
|
-
}
|
|
160
|
-
traps.push(new Trap_1.Trap(tryBfsBlocks, copyFinallyBfsBlocks));
|
|
161
|
-
}
|
|
162
|
-
return traps;
|
|
163
|
-
}
|
|
164
|
-
getAllBlocksBFS(blockBuilderToCfgBlock, startBlockBuilder, endBlockBuilder) {
|
|
165
|
-
const bfsBlocks = [];
|
|
166
|
-
const tailBlocks = [];
|
|
167
|
-
const queue = [];
|
|
168
|
-
const visitedBlockBuilders = new Set();
|
|
169
|
-
queue.push(startBlockBuilder);
|
|
170
|
-
while (queue.length !== 0) {
|
|
171
|
-
const currBlockBuilder = queue.splice(0, 1)[0];
|
|
172
|
-
if (visitedBlockBuilders.has(currBlockBuilder)) {
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
visitedBlockBuilders.add(currBlockBuilder);
|
|
176
|
-
if (!blockBuilderToCfgBlock.has(currBlockBuilder)) {
|
|
177
|
-
logger.error(`can't find basicBlock corresponding to the blockBuilder.`);
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
const currBlock = blockBuilderToCfgBlock.get(currBlockBuilder);
|
|
181
|
-
bfsBlocks.push(currBlock);
|
|
182
|
-
const childList = currBlockBuilder.nexts;
|
|
183
|
-
if (childList.length === 0 || (childList.length !== 0 && (childList[0] === endBlockBuilder))) {
|
|
184
|
-
if (childList[0] === endBlockBuilder) {
|
|
185
|
-
tailBlocks.push(currBlock);
|
|
186
|
-
continue;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
if (childList.length !== 0) {
|
|
190
|
-
for (const child of childList) {
|
|
191
|
-
queue.push(child);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return { bfsBlocks, tailBlocks };
|
|
196
|
-
}
|
|
197
|
-
copyFinallyBlocks(finallyBfsBlocks, finallyTailBlocks, basicBlockSet, arkIRTransformer, blockBuilderToCfgBlock) {
|
|
198
|
-
var _a;
|
|
199
|
-
const copyFinallyBfsBlocks = this.copyBlocks(finallyBfsBlocks);
|
|
200
|
-
const caughtExceptionRef = new Ref_1.ArkCaughtExceptionRef(Type_1.UnknownType.getInstance());
|
|
201
|
-
const { value: exceptionValue, stmts: exceptionAssignStmts, } = arkIRTransformer.generateAssignStmtForValue(caughtExceptionRef, [Position_1.FullPosition.DEFAULT]);
|
|
202
|
-
copyFinallyBfsBlocks[0].addHead(exceptionAssignStmts);
|
|
203
|
-
const finallyPredecessorsCnt = copyFinallyBfsBlocks[0].getPredecessors().length;
|
|
204
|
-
copyFinallyBfsBlocks[0].getPredecessors().splice(0, finallyPredecessorsCnt);
|
|
205
|
-
const throwStmt = new Stmt_1.ArkThrowStmt(exceptionValue);
|
|
206
|
-
let copyFinallyTailBlocks = copyFinallyBfsBlocks.splice(copyFinallyBfsBlocks.length - finallyTailBlocks.length, finallyTailBlocks.length);
|
|
207
|
-
copyFinallyTailBlocks.forEach((copyFinallyTailBlock) => {
|
|
208
|
-
const successorsCnt = copyFinallyTailBlock.getSuccessors().length;
|
|
209
|
-
copyFinallyTailBlock.getSuccessors().splice(0, successorsCnt);
|
|
210
|
-
});
|
|
211
|
-
if (copyFinallyTailBlocks.length > 1) {
|
|
212
|
-
const newCopyFinallyTailBlock = new BasicBlock_1.BasicBlock();
|
|
213
|
-
copyFinallyTailBlocks.forEach((copyFinallyTailBlock) => {
|
|
214
|
-
copyFinallyTailBlock.addSuccessorBlock(newCopyFinallyTailBlock);
|
|
215
|
-
newCopyFinallyTailBlock.addPredecessorBlock(copyFinallyTailBlock);
|
|
216
|
-
});
|
|
217
|
-
copyFinallyTailBlocks = [newCopyFinallyTailBlock];
|
|
218
|
-
}
|
|
219
|
-
(_a = copyFinallyTailBlocks[0]) === null || _a === void 0 ? void 0 : _a.addStmt(throwStmt);
|
|
220
|
-
copyFinallyBfsBlocks.push(...copyFinallyTailBlocks);
|
|
221
|
-
copyFinallyBfsBlocks.forEach((copyFinallyBfsBlock) => {
|
|
222
|
-
basicBlockSet.add(copyFinallyBfsBlock);
|
|
223
|
-
});
|
|
224
|
-
return copyFinallyBfsBlocks;
|
|
225
|
-
}
|
|
226
|
-
copyBlocks(sourceBlocks) {
|
|
227
|
-
const sourceToTarget = new Map();
|
|
228
|
-
const targetBlocks = [];
|
|
229
|
-
for (const sourceBlock of sourceBlocks) {
|
|
230
|
-
const targetBlock = new BasicBlock_1.BasicBlock();
|
|
231
|
-
for (const stmt of sourceBlock.getStmts()) {
|
|
232
|
-
targetBlock.addStmt(this.copyStmt(stmt));
|
|
233
|
-
}
|
|
234
|
-
sourceToTarget.set(sourceBlock, targetBlock);
|
|
235
|
-
targetBlocks.push(targetBlock);
|
|
236
|
-
}
|
|
237
|
-
for (const sourceBlock of sourceBlocks) {
|
|
238
|
-
const targetBlock = sourceToTarget.get(sourceBlock);
|
|
239
|
-
for (const predecessor of sourceBlock.getPredecessors()) {
|
|
240
|
-
const targetPredecessor = sourceToTarget.get(predecessor);
|
|
241
|
-
targetBlock.addPredecessorBlock(targetPredecessor);
|
|
242
|
-
}
|
|
243
|
-
for (const successor of sourceBlock.getSuccessors()) {
|
|
244
|
-
const targetSuccessor = sourceToTarget.get(successor);
|
|
245
|
-
targetBlock.addSuccessorBlock(targetSuccessor);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
return targetBlocks;
|
|
249
|
-
}
|
|
250
|
-
copyStmt(sourceStmt) {
|
|
251
|
-
if (sourceStmt instanceof Stmt_1.ArkAssignStmt) {
|
|
252
|
-
return new Stmt_1.ArkAssignStmt(sourceStmt.getLeftOp(), sourceStmt.getRightOp());
|
|
253
|
-
}
|
|
254
|
-
else if (sourceStmt instanceof Stmt_1.ArkInvokeStmt) {
|
|
255
|
-
return new Stmt_1.ArkInvokeStmt(sourceStmt.getInvokeExpr());
|
|
256
|
-
}
|
|
257
|
-
else if (sourceStmt instanceof Stmt_1.ArkIfStmt) {
|
|
258
|
-
return new Stmt_1.ArkIfStmt(sourceStmt.getConditionExpr());
|
|
259
|
-
}
|
|
260
|
-
else if (sourceStmt instanceof Stmt_1.ArkReturnStmt) {
|
|
261
|
-
return new Stmt_1.ArkReturnStmt(sourceStmt.getOp());
|
|
262
|
-
}
|
|
263
|
-
else if (sourceStmt instanceof Stmt_1.ArkReturnVoidStmt) {
|
|
264
|
-
return new Stmt_1.ArkReturnVoidStmt();
|
|
265
|
-
}
|
|
266
|
-
else if (sourceStmt instanceof Stmt_1.ArkThrowStmt) {
|
|
267
|
-
return new Stmt_1.ArkThrowStmt(sourceStmt.getOp());
|
|
268
|
-
}
|
|
269
|
-
return null;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
exports.TrapBuilder = TrapBuilder;
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 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.TrapBuilder = void 0;
|
|
41
|
+
const BasicBlock_1 = require("../BasicBlock");
|
|
42
|
+
const Trap_1 = require("../../base/Trap");
|
|
43
|
+
const Ref_1 = require("../../base/Ref");
|
|
44
|
+
const Type_1 = require("../../base/Type");
|
|
45
|
+
const Position_1 = require("../../base/Position");
|
|
46
|
+
const Stmt_1 = require("../../base/Stmt");
|
|
47
|
+
const logger_1 = __importStar(require("../../../utils/logger"));
|
|
48
|
+
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'TrapBuilder');
|
|
49
|
+
/**
|
|
50
|
+
* Builder for traps from try...catch
|
|
51
|
+
*/
|
|
52
|
+
class TrapBuilder {
|
|
53
|
+
buildTraps(blockBuilderToCfgBlock, blockBuildersBeforeTry, arkIRTransformer, basicBlockSet) {
|
|
54
|
+
var _a, _b, _c;
|
|
55
|
+
const traps = [];
|
|
56
|
+
for (const blockBuilderBeforeTry of blockBuildersBeforeTry) {
|
|
57
|
+
if (blockBuilderBeforeTry.nexts.length === 0) {
|
|
58
|
+
logger.error(`can't find try block.`);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const blockBuilderContainTry = blockBuilderBeforeTry.nexts[0];
|
|
62
|
+
const stmtsCnt = blockBuilderBeforeTry.stmts.length;
|
|
63
|
+
const tryStmtBuilder = blockBuilderBeforeTry.stmts[stmtsCnt - 1];
|
|
64
|
+
const finallyBlockBuilder = (_a = tryStmtBuilder.finallyStatement) === null || _a === void 0 ? void 0 : _a.block;
|
|
65
|
+
if (!finallyBlockBuilder) {
|
|
66
|
+
logger.error(`can't find finally block or dummy finally block.`);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const { bfsBlocks: tryBfsBlocks, tailBlocks: tryTailBlocks } = this.getAllBlocksBFS(blockBuilderToCfgBlock, blockBuilderContainTry, finallyBlockBuilder);
|
|
70
|
+
let catchBfsBlocks = [];
|
|
71
|
+
let catchTailBlocks = [];
|
|
72
|
+
const catchBlockBuilder = (_b = tryStmtBuilder.catchStatement) === null || _b === void 0 ? void 0 : _b.block;
|
|
73
|
+
if (catchBlockBuilder) {
|
|
74
|
+
({ bfsBlocks: catchBfsBlocks, tailBlocks: catchTailBlocks } = this.getAllBlocksBFS(blockBuilderToCfgBlock, catchBlockBuilder));
|
|
75
|
+
}
|
|
76
|
+
const finallyStmts = finallyBlockBuilder.stmts;
|
|
77
|
+
const blockBuilderAfterFinally = (_c = tryStmtBuilder.afterFinal) === null || _c === void 0 ? void 0 : _c.block;
|
|
78
|
+
if (!blockBuilderAfterFinally) {
|
|
79
|
+
logger.error(`can't find block after try...catch.`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (finallyStmts.length === 1 && finallyStmts[0].code === 'dummyFinally') { // no finally block
|
|
83
|
+
const trapsIfNoFinally = this.buildTrapsIfNoFinally(tryBfsBlocks, tryTailBlocks, catchBfsBlocks, catchTailBlocks, finallyBlockBuilder, blockBuilderAfterFinally, basicBlockSet, blockBuilderToCfgBlock);
|
|
84
|
+
if (trapsIfNoFinally) {
|
|
85
|
+
traps.push(...trapsIfNoFinally);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const trapsIfFinallyExist = this.buildTrapsIfFinallyExist(tryBfsBlocks, tryTailBlocks, catchBfsBlocks, catchTailBlocks, finallyBlockBuilder, blockBuilderAfterFinally, basicBlockSet, arkIRTransformer, blockBuilderToCfgBlock);
|
|
90
|
+
traps.push(...trapsIfFinallyExist);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return traps;
|
|
94
|
+
}
|
|
95
|
+
buildTrapsIfNoFinally(tryBfsBlocks, tryTailBlocks, catchBfsBlocks, catchTailBlocks, finallyBlockBuilder, blockBuilderAfterFinally, basicBlockSet, blockBuilderToCfgBlock) {
|
|
96
|
+
if (catchBfsBlocks.length === 0) {
|
|
97
|
+
logger.error(`catch block expected.`);
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
if (!blockBuilderToCfgBlock.has(blockBuilderAfterFinally)) {
|
|
101
|
+
logger.error(`can't find basicBlock corresponding to the blockBuilder.`);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
let blockAfterFinally = blockBuilderToCfgBlock.get(blockBuilderAfterFinally);
|
|
105
|
+
if (!blockBuilderToCfgBlock.has(finallyBlockBuilder)) {
|
|
106
|
+
logger.error(`can't find basicBlock corresponding to the blockBuilder.`);
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const finallyBlock = blockBuilderToCfgBlock.get(finallyBlockBuilder);
|
|
110
|
+
let dummyFinallyIdxInPredecessors = -1;
|
|
111
|
+
for (let i = 0; i < blockAfterFinally.getPredecessors().length; i++) {
|
|
112
|
+
if (blockAfterFinally.getPredecessors()[i] === finallyBlock) {
|
|
113
|
+
dummyFinallyIdxInPredecessors = i;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (dummyFinallyIdxInPredecessors === -1) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
blockAfterFinally.getPredecessors().splice(dummyFinallyIdxInPredecessors, 1);
|
|
121
|
+
for (const tryTailBlock of tryTailBlocks) {
|
|
122
|
+
tryTailBlock.setSuccessorBlock(0, blockAfterFinally);
|
|
123
|
+
blockAfterFinally.addPredecessorBlock(tryTailBlock);
|
|
124
|
+
}
|
|
125
|
+
basicBlockSet.delete(finallyBlock);
|
|
126
|
+
for (const catchTailBlock of catchTailBlocks) {
|
|
127
|
+
catchTailBlock.addSuccessorBlock(blockAfterFinally);
|
|
128
|
+
blockAfterFinally.addPredecessorBlock(catchTailBlock);
|
|
129
|
+
}
|
|
130
|
+
for (const tryTailBlock of tryTailBlocks) {
|
|
131
|
+
tryTailBlock.addExceptionalSuccessorBlock(catchBfsBlocks[0]);
|
|
132
|
+
}
|
|
133
|
+
return [new Trap_1.Trap(tryBfsBlocks, catchBfsBlocks)];
|
|
134
|
+
}
|
|
135
|
+
buildTrapsIfFinallyExist(tryBfsBlocks, tryTailBlocks, catchBfsBlocks, catchTailBlocks, finallyBlockBuilder, blockBuilderAfterFinally, basicBlockSet, arkIRTransformer, blockBuilderToCfgBlock) {
|
|
136
|
+
const { bfsBlocks: finallyBfsBlocks, tailBlocks: finallyTailBlocks } = this.getAllBlocksBFS(blockBuilderToCfgBlock, finallyBlockBuilder, blockBuilderAfterFinally);
|
|
137
|
+
const copyFinallyBfsBlocks = this.copyFinallyBlocks(finallyBfsBlocks, finallyTailBlocks, basicBlockSet, arkIRTransformer, blockBuilderToCfgBlock);
|
|
138
|
+
const traps = [];
|
|
139
|
+
if (catchBfsBlocks.length !== 0) {
|
|
140
|
+
for (const catchTailBlock of catchTailBlocks) {
|
|
141
|
+
catchTailBlock.addSuccessorBlock(finallyBfsBlocks[0]);
|
|
142
|
+
finallyBfsBlocks[0].addPredecessorBlock(catchTailBlock);
|
|
143
|
+
}
|
|
144
|
+
// try -> catch trap
|
|
145
|
+
for (const tryTailBlock of tryTailBlocks) {
|
|
146
|
+
tryTailBlock.addExceptionalSuccessorBlock(catchBfsBlocks[0]);
|
|
147
|
+
}
|
|
148
|
+
traps.push(new Trap_1.Trap(tryBfsBlocks, catchBfsBlocks));
|
|
149
|
+
// catch -> finally trap
|
|
150
|
+
for (const catchTailBlock of catchTailBlocks) {
|
|
151
|
+
catchTailBlock.addExceptionalSuccessorBlock(copyFinallyBfsBlocks[0]);
|
|
152
|
+
}
|
|
153
|
+
traps.push(new Trap_1.Trap(catchBfsBlocks, copyFinallyBfsBlocks));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// try -> finally trap
|
|
157
|
+
for (const tryTailBlock of tryTailBlocks) {
|
|
158
|
+
tryTailBlock.addExceptionalSuccessorBlock(copyFinallyBfsBlocks[0]);
|
|
159
|
+
}
|
|
160
|
+
traps.push(new Trap_1.Trap(tryBfsBlocks, copyFinallyBfsBlocks));
|
|
161
|
+
}
|
|
162
|
+
return traps;
|
|
163
|
+
}
|
|
164
|
+
getAllBlocksBFS(blockBuilderToCfgBlock, startBlockBuilder, endBlockBuilder) {
|
|
165
|
+
const bfsBlocks = [];
|
|
166
|
+
const tailBlocks = [];
|
|
167
|
+
const queue = [];
|
|
168
|
+
const visitedBlockBuilders = new Set();
|
|
169
|
+
queue.push(startBlockBuilder);
|
|
170
|
+
while (queue.length !== 0) {
|
|
171
|
+
const currBlockBuilder = queue.splice(0, 1)[0];
|
|
172
|
+
if (visitedBlockBuilders.has(currBlockBuilder)) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
visitedBlockBuilders.add(currBlockBuilder);
|
|
176
|
+
if (!blockBuilderToCfgBlock.has(currBlockBuilder)) {
|
|
177
|
+
logger.error(`can't find basicBlock corresponding to the blockBuilder.`);
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const currBlock = blockBuilderToCfgBlock.get(currBlockBuilder);
|
|
181
|
+
bfsBlocks.push(currBlock);
|
|
182
|
+
const childList = currBlockBuilder.nexts;
|
|
183
|
+
if (childList.length === 0 || (childList.length !== 0 && (childList[0] === endBlockBuilder))) {
|
|
184
|
+
if (childList[0] === endBlockBuilder) {
|
|
185
|
+
tailBlocks.push(currBlock);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (childList.length !== 0) {
|
|
190
|
+
for (const child of childList) {
|
|
191
|
+
queue.push(child);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return { bfsBlocks, tailBlocks };
|
|
196
|
+
}
|
|
197
|
+
copyFinallyBlocks(finallyBfsBlocks, finallyTailBlocks, basicBlockSet, arkIRTransformer, blockBuilderToCfgBlock) {
|
|
198
|
+
var _a;
|
|
199
|
+
const copyFinallyBfsBlocks = this.copyBlocks(finallyBfsBlocks);
|
|
200
|
+
const caughtExceptionRef = new Ref_1.ArkCaughtExceptionRef(Type_1.UnknownType.getInstance());
|
|
201
|
+
const { value: exceptionValue, stmts: exceptionAssignStmts, } = arkIRTransformer.generateAssignStmtForValue(caughtExceptionRef, [Position_1.FullPosition.DEFAULT]);
|
|
202
|
+
copyFinallyBfsBlocks[0].addHead(exceptionAssignStmts);
|
|
203
|
+
const finallyPredecessorsCnt = copyFinallyBfsBlocks[0].getPredecessors().length;
|
|
204
|
+
copyFinallyBfsBlocks[0].getPredecessors().splice(0, finallyPredecessorsCnt);
|
|
205
|
+
const throwStmt = new Stmt_1.ArkThrowStmt(exceptionValue);
|
|
206
|
+
let copyFinallyTailBlocks = copyFinallyBfsBlocks.splice(copyFinallyBfsBlocks.length - finallyTailBlocks.length, finallyTailBlocks.length);
|
|
207
|
+
copyFinallyTailBlocks.forEach((copyFinallyTailBlock) => {
|
|
208
|
+
const successorsCnt = copyFinallyTailBlock.getSuccessors().length;
|
|
209
|
+
copyFinallyTailBlock.getSuccessors().splice(0, successorsCnt);
|
|
210
|
+
});
|
|
211
|
+
if (copyFinallyTailBlocks.length > 1) {
|
|
212
|
+
const newCopyFinallyTailBlock = new BasicBlock_1.BasicBlock();
|
|
213
|
+
copyFinallyTailBlocks.forEach((copyFinallyTailBlock) => {
|
|
214
|
+
copyFinallyTailBlock.addSuccessorBlock(newCopyFinallyTailBlock);
|
|
215
|
+
newCopyFinallyTailBlock.addPredecessorBlock(copyFinallyTailBlock);
|
|
216
|
+
});
|
|
217
|
+
copyFinallyTailBlocks = [newCopyFinallyTailBlock];
|
|
218
|
+
}
|
|
219
|
+
(_a = copyFinallyTailBlocks[0]) === null || _a === void 0 ? void 0 : _a.addStmt(throwStmt);
|
|
220
|
+
copyFinallyBfsBlocks.push(...copyFinallyTailBlocks);
|
|
221
|
+
copyFinallyBfsBlocks.forEach((copyFinallyBfsBlock) => {
|
|
222
|
+
basicBlockSet.add(copyFinallyBfsBlock);
|
|
223
|
+
});
|
|
224
|
+
return copyFinallyBfsBlocks;
|
|
225
|
+
}
|
|
226
|
+
copyBlocks(sourceBlocks) {
|
|
227
|
+
const sourceToTarget = new Map();
|
|
228
|
+
const targetBlocks = [];
|
|
229
|
+
for (const sourceBlock of sourceBlocks) {
|
|
230
|
+
const targetBlock = new BasicBlock_1.BasicBlock();
|
|
231
|
+
for (const stmt of sourceBlock.getStmts()) {
|
|
232
|
+
targetBlock.addStmt(this.copyStmt(stmt));
|
|
233
|
+
}
|
|
234
|
+
sourceToTarget.set(sourceBlock, targetBlock);
|
|
235
|
+
targetBlocks.push(targetBlock);
|
|
236
|
+
}
|
|
237
|
+
for (const sourceBlock of sourceBlocks) {
|
|
238
|
+
const targetBlock = sourceToTarget.get(sourceBlock);
|
|
239
|
+
for (const predecessor of sourceBlock.getPredecessors()) {
|
|
240
|
+
const targetPredecessor = sourceToTarget.get(predecessor);
|
|
241
|
+
targetBlock.addPredecessorBlock(targetPredecessor);
|
|
242
|
+
}
|
|
243
|
+
for (const successor of sourceBlock.getSuccessors()) {
|
|
244
|
+
const targetSuccessor = sourceToTarget.get(successor);
|
|
245
|
+
targetBlock.addSuccessorBlock(targetSuccessor);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return targetBlocks;
|
|
249
|
+
}
|
|
250
|
+
copyStmt(sourceStmt) {
|
|
251
|
+
if (sourceStmt instanceof Stmt_1.ArkAssignStmt) {
|
|
252
|
+
return new Stmt_1.ArkAssignStmt(sourceStmt.getLeftOp(), sourceStmt.getRightOp());
|
|
253
|
+
}
|
|
254
|
+
else if (sourceStmt instanceof Stmt_1.ArkInvokeStmt) {
|
|
255
|
+
return new Stmt_1.ArkInvokeStmt(sourceStmt.getInvokeExpr());
|
|
256
|
+
}
|
|
257
|
+
else if (sourceStmt instanceof Stmt_1.ArkIfStmt) {
|
|
258
|
+
return new Stmt_1.ArkIfStmt(sourceStmt.getConditionExpr());
|
|
259
|
+
}
|
|
260
|
+
else if (sourceStmt instanceof Stmt_1.ArkReturnStmt) {
|
|
261
|
+
return new Stmt_1.ArkReturnStmt(sourceStmt.getOp());
|
|
262
|
+
}
|
|
263
|
+
else if (sourceStmt instanceof Stmt_1.ArkReturnVoidStmt) {
|
|
264
|
+
return new Stmt_1.ArkReturnVoidStmt();
|
|
265
|
+
}
|
|
266
|
+
else if (sourceStmt instanceof Stmt_1.ArkThrowStmt) {
|
|
267
|
+
return new Stmt_1.ArkThrowStmt(sourceStmt.getOp());
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
exports.TrapBuilder = TrapBuilder;
|