arkanalyzer 1.0.17 → 1.0.19

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.
Files changed (134) hide show
  1. package/lib/callgraph/pointerAnalysis/Pag.d.ts +3 -2
  2. package/lib/callgraph/pointerAnalysis/Pag.d.ts.map +1 -1
  3. package/lib/callgraph/pointerAnalysis/Pag.js +5 -3
  4. package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +4 -4
  5. package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -1
  6. package/lib/callgraph/pointerAnalysis/PagBuilder.js +5 -4
  7. package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +2 -0
  8. package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts.map +1 -1
  9. package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +11 -9
  10. package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts +8 -1
  11. package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts.map +1 -1
  12. package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.js +27 -3
  13. package/lib/callgraph/pointerAnalysis/PtsDS.d.ts +30 -6
  14. package/lib/callgraph/pointerAnalysis/PtsDS.d.ts.map +1 -1
  15. package/lib/callgraph/pointerAnalysis/PtsDS.js +86 -5
  16. package/lib/core/base/Decorator.d.ts +1 -0
  17. package/lib/core/base/Decorator.d.ts.map +1 -1
  18. package/lib/core/base/Decorator.js +4 -1
  19. package/lib/core/base/Stmt.d.ts +3 -0
  20. package/lib/core/base/Stmt.d.ts.map +1 -1
  21. package/lib/core/base/Stmt.js +34 -0
  22. package/lib/core/base/Type.d.ts +45 -3
  23. package/lib/core/base/Type.d.ts.map +1 -1
  24. package/lib/core/base/Type.js +84 -4
  25. package/lib/core/base/TypeExpr.d.ts +72 -0
  26. package/lib/core/base/TypeExpr.d.ts.map +1 -0
  27. package/lib/core/base/TypeExpr.js +155 -0
  28. package/lib/core/common/ArkIRTransformer.d.ts +1 -0
  29. package/lib/core/common/ArkIRTransformer.d.ts.map +1 -1
  30. package/lib/core/common/ArkIRTransformer.js +46 -23
  31. package/lib/core/common/ArkValueTransformer.d.ts +1 -0
  32. package/lib/core/common/ArkValueTransformer.d.ts.map +1 -1
  33. package/lib/core/common/ArkValueTransformer.js +66 -16
  34. package/lib/core/common/IRInference.d.ts +5 -1
  35. package/lib/core/common/IRInference.d.ts.map +1 -1
  36. package/lib/core/common/IRInference.js +71 -0
  37. package/lib/core/common/ModelUtils.d.ts +3 -1
  38. package/lib/core/common/ModelUtils.d.ts.map +1 -1
  39. package/lib/core/common/ModelUtils.js +23 -1
  40. package/lib/core/common/TypeInference.d.ts +6 -0
  41. package/lib/core/common/TypeInference.d.ts.map +1 -1
  42. package/lib/core/common/TypeInference.js +82 -14
  43. package/lib/core/{common → graph/builder}/CfgBuilder.d.ts +34 -46
  44. package/lib/core/graph/builder/CfgBuilder.d.ts.map +1 -0
  45. package/lib/core/graph/builder/CfgBuilder.js +1139 -0
  46. package/lib/core/graph/builder/ConditionBuilder.d.ts +16 -0
  47. package/lib/core/graph/builder/ConditionBuilder.d.ts.map +1 -0
  48. package/lib/core/graph/builder/ConditionBuilder.js +252 -0
  49. package/lib/core/graph/builder/LoopBuilder.d.ts +21 -0
  50. package/lib/core/graph/builder/LoopBuilder.d.ts.map +1 -0
  51. package/lib/core/graph/builder/LoopBuilder.js +251 -0
  52. package/lib/core/graph/builder/SwitchBuilder.d.ts +12 -0
  53. package/lib/core/graph/builder/SwitchBuilder.d.ts.map +1 -0
  54. package/lib/core/graph/builder/SwitchBuilder.js +152 -0
  55. package/lib/core/graph/builder/TrapBuilder.d.ts +17 -0
  56. package/lib/core/graph/builder/TrapBuilder.d.ts.map +1 -0
  57. package/lib/core/graph/builder/TrapBuilder.js +272 -0
  58. package/lib/core/model/ArkMethod.d.ts +1 -1
  59. package/lib/core/model/ArkMethod.js +1 -1
  60. package/lib/core/model/ArkSignature.d.ts +9 -1
  61. package/lib/core/model/ArkSignature.d.ts.map +1 -1
  62. package/lib/core/model/ArkSignature.js +17 -1
  63. package/lib/core/model/builder/ArkClassBuilder.d.ts.map +1 -1
  64. package/lib/core/model/builder/ArkClassBuilder.js +2 -1
  65. package/lib/core/model/builder/ArkMethodBuilder.js +1 -1
  66. package/lib/core/{common → model/builder}/BodyBuilder.d.ts +5 -5
  67. package/lib/core/model/builder/BodyBuilder.d.ts.map +1 -0
  68. package/lib/core/{common → model/builder}/BodyBuilder.js +12 -12
  69. package/lib/core/model/builder/builderUtils.d.ts.map +1 -1
  70. package/lib/core/model/builder/builderUtils.js +79 -5
  71. package/lib/save/JsonPrinter.d.ts +1 -1
  72. package/lib/save/JsonPrinter.d.ts.map +1 -1
  73. package/lib/save/JsonPrinter.js +2 -2
  74. package/lib/save/PrinterBuilder.d.ts +22 -0
  75. package/lib/save/PrinterBuilder.d.ts.map +1 -1
  76. package/lib/save/PrinterBuilder.js +54 -1
  77. package/lib/save/arkir/ArkIRClassPrinter.d.ts +14 -0
  78. package/lib/save/arkir/ArkIRClassPrinter.d.ts.map +1 -0
  79. package/lib/save/arkir/ArkIRClassPrinter.js +92 -0
  80. package/lib/save/arkir/ArkIRFieldPrinter.d.ts +12 -0
  81. package/lib/save/arkir/ArkIRFieldPrinter.d.ts.map +1 -0
  82. package/lib/save/arkir/ArkIRFieldPrinter.js +64 -0
  83. package/lib/save/arkir/ArkIRFilePrinter.d.ts +13 -0
  84. package/lib/save/arkir/ArkIRFilePrinter.d.ts.map +1 -0
  85. package/lib/save/arkir/ArkIRFilePrinter.js +54 -0
  86. package/lib/save/arkir/ArkIRMethodPrinter.d.ts +17 -0
  87. package/lib/save/arkir/ArkIRMethodPrinter.d.ts.map +1 -0
  88. package/lib/save/arkir/ArkIRMethodPrinter.js +159 -0
  89. package/lib/save/arkir/ArkIRNamespacePrinter.d.ts +12 -0
  90. package/lib/save/arkir/ArkIRNamespacePrinter.d.ts.map +1 -0
  91. package/lib/save/arkir/ArkIRNamespacePrinter.js +66 -0
  92. package/lib/save/base/BasePrinter.d.ts +24 -0
  93. package/lib/save/base/BasePrinter.d.ts.map +1 -0
  94. package/lib/save/base/BasePrinter.js +70 -0
  95. package/lib/save/base/ExportPrinter.d.ts +9 -0
  96. package/lib/save/base/ExportPrinter.d.ts.map +1 -0
  97. package/lib/save/base/ExportPrinter.js +67 -0
  98. package/lib/save/base/ImportPrinter.d.ts +10 -0
  99. package/lib/save/base/ImportPrinter.d.ts.map +1 -0
  100. package/lib/save/base/ImportPrinter.js +92 -0
  101. package/lib/save/{source/SourceUtils.d.ts → base/PrinterUtils.d.ts} +2 -2
  102. package/lib/save/{source/SourceUtils.d.ts.map → base/PrinterUtils.d.ts.map} +1 -1
  103. package/lib/save/{source/SourceUtils.js → base/PrinterUtils.js} +10 -10
  104. package/lib/save/source/SourceBase.d.ts +2 -11
  105. package/lib/save/source/SourceBase.d.ts.map +1 -1
  106. package/lib/save/source/SourceBase.js +3 -25
  107. package/lib/save/source/SourceBody.js +3 -3
  108. package/lib/save/source/SourceClass.d.ts +2 -1
  109. package/lib/save/source/SourceClass.d.ts.map +1 -1
  110. package/lib/save/source/SourceClass.js +18 -17
  111. package/lib/save/source/SourceFilePrinter.d.ts +1 -1
  112. package/lib/save/source/SourceFilePrinter.d.ts.map +1 -1
  113. package/lib/save/source/SourceFilePrinter.js +9 -10
  114. package/lib/save/source/SourceMethod.d.ts +1 -1
  115. package/lib/save/source/SourceMethod.d.ts.map +1 -1
  116. package/lib/save/source/SourceMethod.js +37 -22
  117. package/lib/save/source/SourceNamespace.d.ts.map +1 -1
  118. package/lib/save/source/SourceNamespace.js +6 -6
  119. package/lib/save/source/SourceStmt.d.ts +1 -1
  120. package/lib/save/source/SourceStmt.d.ts.map +1 -1
  121. package/lib/save/source/SourceStmt.js +29 -42
  122. package/lib/save/source/SourceTransformer.d.ts +5 -1
  123. package/lib/save/source/SourceTransformer.d.ts.map +1 -1
  124. package/lib/save/source/SourceTransformer.js +107 -33
  125. package/lib/utils/SparseBitVector.d.ts +11 -2
  126. package/lib/utils/SparseBitVector.d.ts.map +1 -1
  127. package/lib/utils/SparseBitVector.js +70 -3
  128. package/package.json +1 -1
  129. package/lib/core/common/BodyBuilder.d.ts.map +0 -1
  130. package/lib/core/common/CfgBuilder.d.ts.map +0 -1
  131. package/lib/core/common/CfgBuilder.js +0 -1886
  132. package/lib/save/source/SourceModule.d.ts +0 -16
  133. package/lib/save/source/SourceModule.d.ts.map +0 -1
  134. package/lib/save/source/SourceModule.js +0 -125
@@ -0,0 +1,16 @@
1
+ import { BasicBlock } from '../BasicBlock';
2
+ /**
3
+ * Builder for condition in CFG
4
+ */
5
+ export declare class ConditionBuilder {
6
+ rebuildBlocksContainConditionalOperator(basicBlockSet: Set<BasicBlock>, isArkUIBuilder: boolean): void;
7
+ private relinkPrevAndSuccOfBlockContainConditionalOperator;
8
+ private generateBlocksContainConditionalOperatorGroup;
9
+ private generateBlocksContainSingleConditionalOperator;
10
+ private generateBlockWithoutConditionalOperator;
11
+ private deleteDummyConditionalOperatorStmt;
12
+ private findFirstConditionalOperator;
13
+ private removeUnnecessaryBlocksInConditionalOperator;
14
+ private replaceTempRecursively;
15
+ }
16
+ //# sourceMappingURL=ConditionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConditionBuilder.d.ts","sourceRoot":"","sources":["../../../../src/core/graph/builder/ConditionBuilder.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C;;GAEG;AACH,qBAAa,gBAAgB;IAClB,uCAAuC,CAAC,aAAa,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IA8C7G,OAAO,CAAC,kDAAkD;IAqB1D,OAAO,CAAC,6CAA6C;IAkCrD,OAAO,CAAC,8CAA8C;IAoDtD,OAAO,CAAC,uCAAuC;IAc/C,OAAO,CAAC,kCAAkC;IAY1C,OAAO,CAAC,4BAA4B;IA4BpC,OAAO,CAAC,4CAA4C;IAqCpD,OAAO,CAAC,sBAAsB;CA4CjC"}
@@ -0,0 +1,252 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ConditionBuilder = void 0;
18
+ const BasicBlock_1 = require("../BasicBlock");
19
+ const ArkIRTransformer_1 = require("../../common/ArkIRTransformer");
20
+ const Stmt_1 = require("../../base/Stmt");
21
+ const Local_1 = require("../../base/Local");
22
+ const IRUtils_1 = require("../../common/IRUtils");
23
+ /**
24
+ * Builder for condition in CFG
25
+ */
26
+ class ConditionBuilder {
27
+ rebuildBlocksContainConditionalOperator(basicBlockSet, isArkUIBuilder) {
28
+ var _a;
29
+ if (isArkUIBuilder) {
30
+ this.deleteDummyConditionalOperatorStmt(basicBlockSet);
31
+ return;
32
+ }
33
+ const currBasicBlocks = Array.from(basicBlockSet);
34
+ for (const currBasicBlock of currBasicBlocks) {
35
+ const stmtsInCurrBasicBlock = Array.from(currBasicBlock.getStmts());
36
+ const stmtsCnt = stmtsInCurrBasicBlock.length;
37
+ let conditionalOperatorEndPos = -1;
38
+ for (let i = stmtsCnt - 1; i >= 0; i--) {
39
+ const stmt = stmtsInCurrBasicBlock[i];
40
+ if (stmt instanceof ArkIRTransformer_1.DummyStmt && ((_a = stmt.toString()) === null || _a === void 0 ? void 0 : _a.startsWith(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_END_STMT))) {
41
+ conditionalOperatorEndPos = i;
42
+ break;
43
+ }
44
+ }
45
+ if (conditionalOperatorEndPos === -1) {
46
+ continue;
47
+ }
48
+ let { generatedTopBlock: generatedTopBlock, generatedBottomBlocks: generatedBottomBlocks, } = this.generateBlocksContainConditionalOperatorGroup(stmtsInCurrBasicBlock.slice(0, conditionalOperatorEndPos + 1), basicBlockSet);
49
+ if (conditionalOperatorEndPos !== stmtsCnt - 1) { // need create a new basic block for rest statements
50
+ const { generatedTopBlock: extraBlock, } = this.generateBlockWithoutConditionalOperator(stmtsInCurrBasicBlock.slice(conditionalOperatorEndPos + 1));
51
+ generatedBottomBlocks.forEach(generatedBottomBlock => {
52
+ generatedBottomBlock.addSuccessorBlock(extraBlock);
53
+ extraBlock.addPredecessorBlock(generatedBottomBlock);
54
+ });
55
+ basicBlockSet.add(extraBlock);
56
+ generatedBottomBlocks = this.removeUnnecessaryBlocksInConditionalOperator(extraBlock, basicBlockSet);
57
+ }
58
+ this.relinkPrevAndSuccOfBlockContainConditionalOperator(currBasicBlock, generatedTopBlock, generatedBottomBlocks);
59
+ basicBlockSet.delete(currBasicBlock);
60
+ }
61
+ }
62
+ relinkPrevAndSuccOfBlockContainConditionalOperator(currBasicBlock, generatedTopBlock, generatedBottomBlocks) {
63
+ const predecessorsOfCurrBasicBlock = Array.from(currBasicBlock.getPredecessors());
64
+ predecessorsOfCurrBasicBlock.forEach(predecessor => {
65
+ predecessor.removeSuccessorBlock(currBasicBlock);
66
+ currBasicBlock.removePredecessorBlock(predecessor);
67
+ generatedTopBlock.addPredecessorBlock(predecessor);
68
+ predecessor.addSuccessorBlock(generatedTopBlock);
69
+ });
70
+ const successorsOfCurrBasicBlock = Array.from(currBasicBlock.getSuccessors());
71
+ successorsOfCurrBasicBlock.forEach(successor => {
72
+ successor.removePredecessorBlock(currBasicBlock);
73
+ currBasicBlock.removeSuccessorBlock(successor);
74
+ generatedBottomBlocks.forEach(generatedBottomBlock => {
75
+ generatedBottomBlock.addSuccessorBlock(successor);
76
+ successor.addPredecessorBlock(generatedBottomBlock);
77
+ });
78
+ });
79
+ }
80
+ generateBlocksContainConditionalOperatorGroup(sourceStmts, basicBlockSet) {
81
+ const { firstEndPos: firstEndPos } = this.findFirstConditionalOperator(sourceStmts);
82
+ if (firstEndPos === -1) {
83
+ return this.generateBlockWithoutConditionalOperator(sourceStmts);
84
+ }
85
+ const { generatedTopBlock: firstGeneratedTopBlock, generatedBottomBlocks: firstGeneratedBottomBlocks, generatedAllBlocks: firstGeneratedAllBlocks, } = this.generateBlocksContainSingleConditionalOperator(sourceStmts.slice(0, firstEndPos + 1));
86
+ const generatedTopBlock = firstGeneratedTopBlock;
87
+ let generatedBottomBlocks = firstGeneratedBottomBlocks;
88
+ firstGeneratedAllBlocks.forEach(block => basicBlockSet.add(block));
89
+ const stmtsCnt = sourceStmts.length;
90
+ if (firstEndPos !== stmtsCnt - 1) { // need handle other conditional operators
91
+ const { generatedTopBlock: restGeneratedTopBlock, generatedBottomBlocks: restGeneratedBottomBlocks, } = this.generateBlocksContainConditionalOperatorGroup(sourceStmts.slice(firstEndPos + 1, stmtsCnt), basicBlockSet);
92
+ firstGeneratedBottomBlocks.forEach(firstGeneratedBottomBlock => {
93
+ firstGeneratedBottomBlock.addSuccessorBlock(restGeneratedTopBlock);
94
+ restGeneratedTopBlock.addPredecessorBlock(firstGeneratedBottomBlock);
95
+ });
96
+ restGeneratedBottomBlocks.forEach(block => basicBlockSet.add(block));
97
+ this.removeUnnecessaryBlocksInConditionalOperator(restGeneratedTopBlock, basicBlockSet);
98
+ generatedBottomBlocks = restGeneratedBottomBlocks;
99
+ }
100
+ return { generatedTopBlock, generatedBottomBlocks };
101
+ }
102
+ generateBlocksContainSingleConditionalOperator(sourceStmts) {
103
+ const { firstIfTruePos: ifTruePos, firstIfFalsePos: ifFalsePos, firstEndPos: endPos, } = this.findFirstConditionalOperator(sourceStmts);
104
+ if (endPos === -1) {
105
+ return this.generateBlockWithoutConditionalOperator(sourceStmts);
106
+ }
107
+ const { generatedTopBlock: generatedTopBlock, generatedAllBlocks: generatedAllBlocks, } = this.generateBlockWithoutConditionalOperator(sourceStmts.slice(0, ifTruePos));
108
+ let generatedBottomBlocks = [];
109
+ const { generatedTopBlock: generatedTopBlockOfTrueBranch, generatedBottomBlocks: generatedBottomBlocksOfTrueBranch, generatedAllBlocks: generatedAllBlocksOfTrueBranch, } = this.generateBlocksContainSingleConditionalOperator(sourceStmts.slice(ifTruePos + 1, ifFalsePos));
110
+ generatedBottomBlocks.push(...generatedBottomBlocksOfTrueBranch);
111
+ generatedAllBlocks.push(...generatedAllBlocksOfTrueBranch);
112
+ const { generatedTopBlock: generatedTopBlockOfFalseBranch, generatedBottomBlocks: generatedBottomBlocksOfFalseBranch, generatedAllBlocks: generatedAllBlocksOfFalseBranch, } = this.generateBlocksContainSingleConditionalOperator(sourceStmts.slice(ifFalsePos + 1, endPos));
113
+ generatedBottomBlocks.push(...generatedBottomBlocksOfFalseBranch);
114
+ generatedAllBlocks.push(...generatedAllBlocksOfFalseBranch);
115
+ generatedTopBlock.addSuccessorBlock(generatedTopBlockOfTrueBranch);
116
+ generatedTopBlockOfTrueBranch.addPredecessorBlock(generatedTopBlock);
117
+ generatedTopBlock.addSuccessorBlock(generatedTopBlockOfFalseBranch);
118
+ generatedTopBlockOfFalseBranch.addPredecessorBlock(generatedTopBlock);
119
+ const stmtsCnt = sourceStmts.length;
120
+ if (endPos !== stmtsCnt - 1) { // need create a new basic block for rest statements
121
+ const { generatedTopBlock: extraBlock, } = this.generateBlockWithoutConditionalOperator(sourceStmts.slice(endPos + 1));
122
+ generatedBottomBlocks.forEach(generatedBottomBlock => {
123
+ generatedBottomBlock.addSuccessorBlock(extraBlock);
124
+ extraBlock.addPredecessorBlock(generatedBottomBlock);
125
+ });
126
+ generatedBottomBlocks = [extraBlock];
127
+ generatedAllBlocks.push(extraBlock);
128
+ }
129
+ return { generatedTopBlock, generatedBottomBlocks, generatedAllBlocks };
130
+ }
131
+ generateBlockWithoutConditionalOperator(sourceStmts) {
132
+ const generatedBlock = new BasicBlock_1.BasicBlock();
133
+ sourceStmts.forEach(stmt => generatedBlock.addStmt(stmt));
134
+ return {
135
+ generatedTopBlock: generatedBlock,
136
+ generatedBottomBlocks: [generatedBlock],
137
+ generatedAllBlocks: [generatedBlock],
138
+ };
139
+ }
140
+ deleteDummyConditionalOperatorStmt(basicBlockSet) {
141
+ var _a;
142
+ for (const basicBlock of basicBlockSet) {
143
+ const stmts = Array.from(basicBlock.getStmts());
144
+ for (const stmt of stmts) {
145
+ if (stmt instanceof ArkIRTransformer_1.DummyStmt && ((_a = stmt.toString()) === null || _a === void 0 ? void 0 : _a.startsWith(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR))) {
146
+ basicBlock.remove(stmt);
147
+ }
148
+ }
149
+ }
150
+ }
151
+ findFirstConditionalOperator(stmts) {
152
+ let firstIfTruePos = -1;
153
+ let firstIfFalsePos = -1;
154
+ let firstEndPos = -1;
155
+ let firstConditionalOperatorNo = '';
156
+ for (let i = 0; i < stmts.length; i++) {
157
+ const stmt = stmts[i];
158
+ if (stmt instanceof ArkIRTransformer_1.DummyStmt) {
159
+ if (stmt.toString()
160
+ .startsWith(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_IF_TRUE_STMT) && firstIfTruePos ===
161
+ -1) {
162
+ firstIfTruePos = i;
163
+ firstConditionalOperatorNo =
164
+ stmt.toString().replace(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_IF_TRUE_STMT, '');
165
+ }
166
+ else if (stmt.toString() === ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_IF_FALSE_STMT +
167
+ firstConditionalOperatorNo) {
168
+ firstIfFalsePos = i;
169
+ }
170
+ else if (stmt.toString() === ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_END_STMT +
171
+ firstConditionalOperatorNo) {
172
+ firstEndPos = i;
173
+ }
174
+ }
175
+ }
176
+ return { firstIfTruePos, firstIfFalsePos, firstEndPos };
177
+ }
178
+ removeUnnecessaryBlocksInConditionalOperator(bottomBlock, allBlocks) {
179
+ const firstStmtInBottom = bottomBlock.getStmts()[0];
180
+ if (!(firstStmtInBottom instanceof Stmt_1.ArkAssignStmt)) {
181
+ return [bottomBlock];
182
+ }
183
+ const targetValue = firstStmtInBottom.getLeftOp();
184
+ const tempResultValue = firstStmtInBottom.getRightOp();
185
+ if (!(targetValue instanceof Local_1.Local && IRUtils_1.IRUtils.isTempLocal(tempResultValue))) {
186
+ return [bottomBlock];
187
+ }
188
+ const oldPredecessors = Array.from(bottomBlock.getPredecessors());
189
+ const newPredecessors = [];
190
+ for (const predecessor of oldPredecessors) {
191
+ predecessor.removeSuccessorBlock(bottomBlock);
192
+ newPredecessors.push(...this.replaceTempRecursively(predecessor, targetValue, tempResultValue, allBlocks));
193
+ }
194
+ bottomBlock.remove(firstStmtInBottom);
195
+ if (bottomBlock.getStmts().length === 0) { // must be a new block without successors
196
+ allBlocks.delete(bottomBlock);
197
+ return newPredecessors;
198
+ }
199
+ oldPredecessors.forEach((oldPredecessor) => {
200
+ bottomBlock.removePredecessorBlock(oldPredecessor);
201
+ });
202
+ newPredecessors.forEach((newPredecessor) => {
203
+ bottomBlock.addPredecessorBlock(newPredecessor);
204
+ newPredecessor.addSuccessorBlock(bottomBlock);
205
+ });
206
+ return [bottomBlock];
207
+ }
208
+ replaceTempRecursively(currBottomBlock, targetLocal, tempResultLocal, allBlocks) {
209
+ const stmts = currBottomBlock.getStmts();
210
+ const stmtsCnt = stmts.length;
211
+ let tempResultReassignStmt = null;
212
+ for (let i = stmtsCnt - 1; i >= 0; i--) {
213
+ const stmt = stmts[i];
214
+ if (stmt instanceof Stmt_1.ArkAssignStmt && stmt.getLeftOp() === tempResultLocal) {
215
+ if (IRUtils_1.IRUtils.isTempLocal(stmt.getRightOp())) {
216
+ tempResultReassignStmt = stmt;
217
+ }
218
+ else {
219
+ stmt.setLeftOp(targetLocal);
220
+ }
221
+ }
222
+ }
223
+ let newBottomBlocks = [];
224
+ if (tempResultReassignStmt) {
225
+ const oldPredecessors = currBottomBlock.getPredecessors();
226
+ const newPredecessors = [];
227
+ const prevTempResultLocal = tempResultReassignStmt.getRightOp();
228
+ for (const predecessor of oldPredecessors) {
229
+ predecessor.removeSuccessorBlock(currBottomBlock);
230
+ newPredecessors.push(...this.replaceTempRecursively(predecessor, targetLocal, prevTempResultLocal, allBlocks));
231
+ }
232
+ currBottomBlock.remove(tempResultReassignStmt);
233
+ if (currBottomBlock.getStmts().length === 0) {
234
+ // remove this block
235
+ newBottomBlocks = newPredecessors;
236
+ allBlocks.delete(currBottomBlock);
237
+ }
238
+ else {
239
+ currBottomBlock.getPredecessors().splice(0, oldPredecessors.length, ...newPredecessors);
240
+ newPredecessors.forEach((newPredecessor) => {
241
+ newPredecessor.addSuccessorBlock(currBottomBlock);
242
+ });
243
+ newBottomBlocks = [currBottomBlock];
244
+ }
245
+ }
246
+ else {
247
+ newBottomBlocks = [currBottomBlock];
248
+ }
249
+ return newBottomBlocks;
250
+ }
251
+ }
252
+ exports.ConditionBuilder = ConditionBuilder;
@@ -0,0 +1,21 @@
1
+ import { BasicBlock } from '../BasicBlock';
2
+ import { BlockBuilder } from './CfgBuilder';
3
+ /**
4
+ * Builder for loop in CFG
5
+ */
6
+ export declare class LoopBuilder {
7
+ rebuildBlocksInLoop(blockBuilderToCfgBlock: Map<BlockBuilder, BasicBlock>, blocksContainLoopCondition: Set<BlockBuilder>, basicBlockSet: Set<BasicBlock>, blockBuilders: BlockBuilder[]): void;
8
+ private doesPrevBlockBuilderContainLoop;
9
+ private insertBeforeConditionBlockBuilder;
10
+ private getBlockFromMap;
11
+ private collectBlocksBeforeAndReenter;
12
+ private getCollectedBlocks;
13
+ private createAndLinkBlocks;
14
+ private updatePredecessors;
15
+ private getNewPrevBlocks;
16
+ private updateConditionBlockBuilder;
17
+ private finalizeInsertion;
18
+ private findIteratorIdx;
19
+ private adjustIncrementorStmts;
20
+ }
21
+ //# sourceMappingURL=LoopBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoopBuilder.d.ts","sourceRoot":"","sources":["../../../../src/core/graph/builder/LoopBuilder.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;GAEG;AACH,qBAAa,WAAW;IACb,mBAAmB,CAAC,sBAAsB,EAAE,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,EACrD,0BAA0B,EAAE,GAAG,CAAC,YAAY,CAAC,EAC7C,aAAa,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI;IAwD/F,OAAO,CAAC,+BAA+B;IAYvC,OAAO,CAAC,iCAAiC;IAqCzC,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,6BAA6B;IA2BrC,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,sBAAsB;CA4CjC"}
@@ -0,0 +1,251 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.LoopBuilder = void 0;
18
+ const BasicBlock_1 = require("../BasicBlock");
19
+ const Stmt_1 = require("../../base/Stmt");
20
+ const Expr_1 = require("../../base/Expr");
21
+ const Builtin_1 = require("../../common/Builtin");
22
+ const ArkIRTransformer_1 = require("../../common/ArkIRTransformer");
23
+ const CfgBuilder_1 = require("./CfgBuilder");
24
+ /**
25
+ * Builder for loop in CFG
26
+ */
27
+ class LoopBuilder {
28
+ rebuildBlocksInLoop(blockBuilderToCfgBlock, blocksContainLoopCondition, basicBlockSet, blockBuilders) {
29
+ for (const blockBuilder of blocksContainLoopCondition) {
30
+ if (!blockBuilderToCfgBlock.get(blockBuilder)) {
31
+ continue;
32
+ }
33
+ const block = blockBuilderToCfgBlock.get(blockBuilder);
34
+ const blockId = block.getId();
35
+ const stmts = block.getStmts();
36
+ const stmtsCnt = stmts.length;
37
+ const { ifStmtIdx, iteratorNextStmtIdx, dummyInitializerStmtIdx } = this.findIteratorIdx(stmts);
38
+ if (iteratorNextStmtIdx !== -1 || dummyInitializerStmtIdx !== -1) {
39
+ const lastStmtIdxBeforeCondition = iteratorNextStmtIdx !==
40
+ -1 ? iteratorNextStmtIdx : dummyInitializerStmtIdx;
41
+ const stmtsInsertBeforeCondition = stmts.slice(0, lastStmtIdxBeforeCondition);
42
+ // If the loop body is empty, the loop conditional block should contain its own
43
+ const emptyLoopBody = blockBuilder.nexts.length === 1;
44
+ if (emptyLoopBody) {
45
+ blockBuilder.nexts.splice(0, 0, blockBuilder);
46
+ blockBuilder.lasts.push(blockBuilder);
47
+ block.getSuccessors().splice(0, 0, block);
48
+ block.addPredecessorBlock(block);
49
+ }
50
+ let prevBlockBuilderContainsLoop = this.doesPrevBlockBuilderContainLoop(blockBuilder, blockId, blocksContainLoopCondition);
51
+ if (prevBlockBuilderContainsLoop) {
52
+ // should create an extra block when previous block contains loop condition
53
+ this.insertBeforeConditionBlockBuilder(blockBuilderToCfgBlock, blockBuilder, stmtsInsertBeforeCondition, false, basicBlockSet, blockBuilders);
54
+ }
55
+ else {
56
+ const blockBuilderBeforeCondition = blockBuilder.lasts[0];
57
+ const blockBeforeCondition = blockBuilderToCfgBlock.get(blockBuilderBeforeCondition);
58
+ stmtsInsertBeforeCondition.forEach(stmt => blockBeforeCondition === null || blockBeforeCondition === void 0 ? void 0 : blockBeforeCondition.getStmts().push(stmt));
59
+ }
60
+ if (dummyInitializerStmtIdx !== -1 && ifStmtIdx !== stmtsCnt - 1) {
61
+ // put incrementor statements into block which reenters condition
62
+ this.adjustIncrementorStmts(stmts, ifStmtIdx, blockBuilder, blockId, blockBuilderToCfgBlock, blocksContainLoopCondition, basicBlockSet, emptyLoopBody, blockBuilders);
63
+ }
64
+ else if (iteratorNextStmtIdx !== -1) {
65
+ // put statements which get value of iterator into block after condition
66
+ const blockBuilderAfterCondition = blockBuilder.nexts[0];
67
+ const blockAfterCondition = blockBuilderToCfgBlock.get(blockBuilderAfterCondition);
68
+ const stmtsAfterCondition = stmts.slice(ifStmtIdx + 1);
69
+ blockAfterCondition === null || blockAfterCondition === void 0 ? void 0 : blockAfterCondition.getStmts().splice(0, 0, ...stmtsAfterCondition);
70
+ }
71
+ // remove statements which should not in condition
72
+ const firstStmtIdxInCondition = iteratorNextStmtIdx !==
73
+ -1 ? iteratorNextStmtIdx : dummyInitializerStmtIdx + 1;
74
+ stmts.splice(0, firstStmtIdxInCondition);
75
+ stmts.splice(ifStmtIdx - firstStmtIdxInCondition + 1);
76
+ }
77
+ }
78
+ }
79
+ doesPrevBlockBuilderContainLoop(currBlockBuilder, currBlockId, blocksContainLoopCondition) {
80
+ let prevBlockBuilderContainsLoop = false;
81
+ for (const prevBlockBuilder of currBlockBuilder.lasts) {
82
+ if (prevBlockBuilder.id < currBlockId && blocksContainLoopCondition.has(prevBlockBuilder)) {
83
+ prevBlockBuilderContainsLoop = true;
84
+ break;
85
+ }
86
+ }
87
+ return prevBlockBuilderContainsLoop;
88
+ }
89
+ insertBeforeConditionBlockBuilder(blockBuilderToCfgBlock, conditionBlockBuilder, stmtsInsertBeforeCondition, collectReenter, basicBlockSet, blockBuilders) {
90
+ if (stmtsInsertBeforeCondition.length === 0) {
91
+ return;
92
+ }
93
+ const blockId = conditionBlockBuilder.id;
94
+ const block = this.getBlockFromMap(blockBuilderToCfgBlock, conditionBlockBuilder);
95
+ const { blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition, } = this.collectBlocksBeforeAndReenter(blockBuilderToCfgBlock, conditionBlockBuilder, blockId);
96
+ const { collectedBlockBuilders, collectedBlocks, } = this.getCollectedBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition);
97
+ const { blockBuilderInsertBeforeCondition, blockInsertBeforeCondition } = this.createAndLinkBlocks(collectedBlockBuilders, collectedBlocks, conditionBlockBuilder, stmtsInsertBeforeCondition, block);
98
+ this.updatePredecessors(collectedBlockBuilders, blockBuilderToCfgBlock, conditionBlockBuilder, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition);
99
+ const { newPrevBlockBuildersBeforeCondition, newPrevBlocksBeforeCondition } = this.getNewPrevBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition);
100
+ this.updateConditionBlockBuilder(conditionBlockBuilder, newPrevBlockBuildersBeforeCondition, block, newPrevBlocksBeforeCondition);
101
+ this.finalizeInsertion(blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, basicBlockSet, blockBuilderToCfgBlock, blockBuilders);
102
+ }
103
+ getBlockFromMap(blockBuilderToCfgBlock, conditionBlockBuilder) {
104
+ return blockBuilderToCfgBlock.get(conditionBlockBuilder);
105
+ }
106
+ collectBlocksBeforeAndReenter(blockBuilderToCfgBlock, conditionBlockBuilder, blockId) {
107
+ const blockBuildersBeforeCondition = [];
108
+ const blocksBeforeCondition = [];
109
+ const blockBuildersReenterCondition = [];
110
+ const blocksReenterCondition = [];
111
+ for (const prevBlockBuilder of conditionBlockBuilder.lasts) {
112
+ const prevBlock = blockBuilderToCfgBlock.get(prevBlockBuilder);
113
+ if (prevBlock.getId() < blockId) {
114
+ blockBuildersBeforeCondition.push(prevBlockBuilder);
115
+ blocksBeforeCondition.push(prevBlock);
116
+ }
117
+ else {
118
+ blockBuildersReenterCondition.push(prevBlockBuilder);
119
+ blocksReenterCondition.push(prevBlock);
120
+ }
121
+ }
122
+ return {
123
+ blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition,
124
+ };
125
+ }
126
+ getCollectedBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition) {
127
+ let collectedBlockBuilders = [];
128
+ let collectedBlocks = [];
129
+ if (collectReenter) {
130
+ collectedBlockBuilders = blockBuildersReenterCondition;
131
+ collectedBlocks = blocksReenterCondition;
132
+ }
133
+ else {
134
+ collectedBlockBuilders = blockBuildersBeforeCondition;
135
+ collectedBlocks = blocksBeforeCondition;
136
+ }
137
+ return { collectedBlockBuilders, collectedBlocks };
138
+ }
139
+ createAndLinkBlocks(collectedBlockBuilders, collectedBlocks, conditionBlockBuilder, stmtsInsertBeforeCondition, block) {
140
+ const blockBuilderInsertBeforeCondition = new CfgBuilder_1.BlockBuilder(-1, []);
141
+ blockBuilderInsertBeforeCondition.lasts.push(...collectedBlockBuilders);
142
+ blockBuilderInsertBeforeCondition.nexts.push(conditionBlockBuilder);
143
+ const blockInsertBeforeCondition = new BasicBlock_1.BasicBlock();
144
+ stmtsInsertBeforeCondition.forEach(stmt => blockInsertBeforeCondition.getStmts().push(stmt));
145
+ blockInsertBeforeCondition.getPredecessors().push(...collectedBlocks);
146
+ blockInsertBeforeCondition.addSuccessorBlock(block);
147
+ return { blockBuilderInsertBeforeCondition, blockInsertBeforeCondition };
148
+ }
149
+ updatePredecessors(collectedBlockBuilders, blockBuilderToCfgBlock, conditionBlockBuilder, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition) {
150
+ for (const prevBlockBuilder of collectedBlockBuilders) {
151
+ const prevBlock = blockBuilderToCfgBlock.get(prevBlockBuilder);
152
+ for (let j = 0; j < prevBlockBuilder.nexts.length; j++) {
153
+ if (prevBlockBuilder.nexts[j] === conditionBlockBuilder) {
154
+ prevBlockBuilder.nexts[j] = blockBuilderInsertBeforeCondition;
155
+ prevBlock.setSuccessorBlock(j, blockInsertBeforeCondition);
156
+ break;
157
+ }
158
+ }
159
+ }
160
+ }
161
+ getNewPrevBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition) {
162
+ let newPrevBlockBuildersBeforeCondition = [];
163
+ let newPrevBlocksBeforeCondition = [];
164
+ if (collectReenter) {
165
+ newPrevBlockBuildersBeforeCondition = [...blockBuildersBeforeCondition, blockBuilderInsertBeforeCondition];
166
+ newPrevBlocksBeforeCondition = [...blocksBeforeCondition, blockInsertBeforeCondition];
167
+ }
168
+ else {
169
+ newPrevBlockBuildersBeforeCondition = [blockBuilderInsertBeforeCondition, ...blockBuildersReenterCondition];
170
+ newPrevBlocksBeforeCondition = [blockInsertBeforeCondition, ...blocksReenterCondition];
171
+ }
172
+ return { newPrevBlockBuildersBeforeCondition, newPrevBlocksBeforeCondition };
173
+ }
174
+ updateConditionBlockBuilder(conditionBlockBuilder, newPrevBlockBuildersBeforeCondition, block, newPrevBlocksBeforeCondition) {
175
+ conditionBlockBuilder.lasts = newPrevBlockBuildersBeforeCondition;
176
+ const predecessorsCnt = block.getPredecessors().length;
177
+ block.getPredecessors().splice(0, predecessorsCnt, ...newPrevBlocksBeforeCondition);
178
+ }
179
+ finalizeInsertion(blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, basicBlockSet, blockBuilderToCfgBlock, blockBuilders) {
180
+ blockBuilders.push(blockBuilderInsertBeforeCondition);
181
+ basicBlockSet.add(blockInsertBeforeCondition);
182
+ blockBuilderToCfgBlock.set(blockBuilderInsertBeforeCondition, blockInsertBeforeCondition);
183
+ }
184
+ findIteratorIdx(stmts) {
185
+ let ifStmtIdx = -1;
186
+ let iteratorNextStmtIdx = -1;
187
+ let dummyInitializerStmtIdx = -1;
188
+ const stmtsCnt = stmts.length;
189
+ for (let i = 0; i < stmtsCnt; i++) {
190
+ const stmt = stmts[i];
191
+ if (stmt instanceof Stmt_1.ArkAssignStmt && stmt.getRightOp() instanceof Expr_1.AbstractInvokeExpr) {
192
+ const invokeExpr = stmt.getRightOp();
193
+ if (invokeExpr.getMethodSignature().getMethodSubSignature()
194
+ .getMethodName() === Builtin_1.Builtin.ITERATOR_NEXT) {
195
+ iteratorNextStmtIdx = i;
196
+ continue;
197
+ }
198
+ }
199
+ if (stmt.toString() === ArkIRTransformer_1.ArkIRTransformer.DUMMY_LOOP_INITIALIZER_STMT) {
200
+ dummyInitializerStmtIdx = i;
201
+ continue;
202
+ }
203
+ if (stmt instanceof Stmt_1.ArkIfStmt) {
204
+ ifStmtIdx = i;
205
+ break;
206
+ }
207
+ }
208
+ return {
209
+ ifStmtIdx: ifStmtIdx,
210
+ iteratorNextStmtIdx: iteratorNextStmtIdx,
211
+ dummyInitializerStmtIdx: dummyInitializerStmtIdx,
212
+ };
213
+ }
214
+ adjustIncrementorStmts(stmts, ifStmtIdx, currBlockBuilder, currBlockId, blockBuilderToCfgBlock, blocksContainLoopCondition, basicBlockSet, emptyLoopBody, blockBuilders) {
215
+ const stmtsReenterCondition = stmts.slice(ifStmtIdx + 1);
216
+ if (emptyLoopBody) {
217
+ const incrementorBlockBuilder = new CfgBuilder_1.BlockBuilder(-1, []);
218
+ incrementorBlockBuilder.lasts.push(currBlockBuilder);
219
+ currBlockBuilder.nexts[0] = incrementorBlockBuilder;
220
+ incrementorBlockBuilder.nexts.push(currBlockBuilder);
221
+ currBlockBuilder.lasts[1] = incrementorBlockBuilder;
222
+ const incrementorBlock = new BasicBlock_1.BasicBlock();
223
+ blockBuilderToCfgBlock.set(incrementorBlockBuilder, incrementorBlock);
224
+ stmtsReenterCondition.forEach(stmt => incrementorBlock.getStmts().push(stmt));
225
+ const currBlock = blockBuilderToCfgBlock.get(currBlockBuilder);
226
+ incrementorBlock.getPredecessors().push(currBlock);
227
+ currBlock.setPredecessorBlock(1, incrementorBlock);
228
+ incrementorBlock.addSuccessorBlock(currBlock);
229
+ currBlock.setSuccessorBlock(0, incrementorBlock);
230
+ basicBlockSet.add(incrementorBlock);
231
+ return;
232
+ }
233
+ const blockBuildersReenterCondition = [];
234
+ for (const prevBlockBuilder of currBlockBuilder.lasts) {
235
+ const prevBlock = blockBuilderToCfgBlock.get(prevBlockBuilder);
236
+ if (prevBlock.getId() > currBlockId) {
237
+ blockBuildersReenterCondition.push(prevBlockBuilder);
238
+ }
239
+ }
240
+ if (blockBuildersReenterCondition.length > 1 || blocksContainLoopCondition.has(blockBuildersReenterCondition[0])) {
241
+ // put incrementor statements into an extra block
242
+ this.insertBeforeConditionBlockBuilder(blockBuilderToCfgBlock, currBlockBuilder, stmtsReenterCondition, true, basicBlockSet, blockBuilders);
243
+ }
244
+ else {
245
+ // put incrementor statements into prev reenter block
246
+ const blockReenterCondition = blockBuilderToCfgBlock.get(blockBuildersReenterCondition[0]);
247
+ stmtsReenterCondition.forEach(stmt => blockReenterCondition === null || blockReenterCondition === void 0 ? void 0 : blockReenterCondition.getStmts().push(stmt));
248
+ }
249
+ }
250
+ }
251
+ exports.LoopBuilder = LoopBuilder;
@@ -0,0 +1,12 @@
1
+ import { BasicBlock } from '../BasicBlock';
2
+ import { ArkIRTransformer, ValueAndStmts } from '../../common/ArkIRTransformer';
3
+ import { BlockBuilder } from './CfgBuilder';
4
+ /**
5
+ * Builder for switch statement in CFG
6
+ */
7
+ export declare class SwitchBuilder {
8
+ buildSwitch(blockBuilderToCfgBlock: Map<BlockBuilder, BasicBlock>, blockBuildersContainSwitch: BlockBuilder[], valueAndStmtsOfSwitchAndCasesAll: ValueAndStmts[][], arkIRTransformer: ArkIRTransformer, basicBlockSet: Set<BasicBlock>): void;
9
+ private generateIfBlocksForCases;
10
+ private linkIfBlockAndCaseBlock;
11
+ }
12
+ //# sourceMappingURL=SwitchBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwitchBuilder.d.ts","sourceRoot":"","sources":["../../../../src/core/graph/builder/SwitchBuilder.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,YAAY,EAA0B,MAAM,cAAc,CAAC;AAKpE;;GAEG;AACH,qBAAa,aAAa;IACf,WAAW,CAAC,sBAAsB,EAAE,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,EACrD,0BAA0B,EAAE,YAAY,EAAE,EAC1C,gCAAgC,EAAE,aAAa,EAAE,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,EACvF,aAAa,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI;IAsCxD,OAAO,CAAC,wBAAwB;IAiChC,OAAO,CAAC,uBAAuB;CA8ClC"}