1 /**
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <gtest/gtest.h>
17 #include <cstring>
18
19 #include "libabckit/include/c/abckit.h"
20 #include "helpers/helpers.h"
21 #include "helpers/helpers_runtime.h"
22 #include "libabckit/include/c/metadata_core.h"
23 #include "libabckit/include/c/extensions/arkts/metadata_arkts.h"
24 #include "ir_impl.h"
25 #include "libabckit/include/c/isa/isa_dynamic.h"
26 #include "libabckit/include/c/statuses.h"
27
28 // NOLINTBEGIN(readability-magic-numbers)
29 namespace libabckit::test {
30
31 static auto g_impl = AbckitGetApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
32 static auto g_implI = AbckitGetInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
33 static auto g_implM = AbckitGetModifyApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
34 static auto g_implG = AbckitGetGraphApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
35 static auto g_dynG = AbckitGetIsaApiDynamicImpl(ABCKIT_VERSION_RELEASE_1_0_0);
36
37 class LibAbcKitIsaDynamicModulesTest : public ::testing::Test {};
38
39 // ========================================
40 // Helpers
41 // ========================================
42
IsetModuleTest(AbckitGraph * graph,AbckitCoreModule * module,AbckitIsaApiDynamicOpcode opcode,bool negative=false,bool wrongCtx=false)43 static void IsetModuleTest(AbckitGraph *graph, AbckitCoreModule *module, AbckitIsaApiDynamicOpcode opcode,
44 bool negative = false, bool wrongCtx = false)
45 {
46 auto moduleRequestIdx = 0x2;
47 AbckitInst *instWithModule = helpers::FindFirstInst(graph, opcode, [moduleRequestIdx](AbckitInst *inst) {
48 auto imm = g_implG->iGetImmediate(inst, 0);
49 return imm == moduleRequestIdx;
50 });
51
52 g_dynG->iSetModule(instWithModule, module);
53 if (negative) {
54 if (wrongCtx) {
55 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_WRONG_CTX);
56 return;
57 }
58 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
59 return;
60 }
61 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
62 }
63
IsetImportDescriptorTest(AbckitGraph * graph,AbckitCoreModule * m,AbckitIsaApiDynamicOpcode opcode,bool negative=false,AbckitCoreImportDescriptor * importToRemove=nullptr)64 static void IsetImportDescriptorTest(AbckitGraph *graph, AbckitCoreModule *m, AbckitIsaApiDynamicOpcode opcode,
65 bool negative = false, AbckitCoreImportDescriptor *importToRemove = nullptr)
66 {
67 auto moduleRequestIdx = 0x2;
68 AbckitInst *instWithID = helpers::FindFirstInst(graph, opcode, [moduleRequestIdx](AbckitInst *inst) {
69 auto imm = g_implG->iGetImmediate(inst, 0);
70 return imm == moduleRequestIdx;
71 });
72 ASSERT_NE(instWithID, nullptr);
73
74 if (importToRemove == nullptr) {
75 helpers::ImportByAliasContext importFinder = {nullptr, "MF1M2"};
76 g_implI->moduleEnumerateImports(m, &importFinder, helpers::ImportByAliasFinder);
77 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
78 ASSERT_NE(importFinder.id, nullptr);
79 importToRemove = importFinder.id;
80 }
81
82 g_dynG->iSetImportDescriptor(instWithID, importToRemove);
83 if (negative) {
84 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
85 return;
86 }
87 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
88 }
89
IsetExportDescriptorTest(AbckitGraph * graph,AbckitCoreModule * m,AbckitIsaApiDynamicOpcode opcode,bool negative=false,AbckitCoreExportDescriptor * exportToRemove=nullptr)90 static void IsetExportDescriptorTest(AbckitGraph *graph, AbckitCoreModule *m, AbckitIsaApiDynamicOpcode opcode,
91 bool negative = false, AbckitCoreExportDescriptor *exportToRemove = nullptr)
92 {
93 auto moduleRequestIdx = 0x3;
94 AbckitInst *instWithID = helpers::FindFirstInst(graph, opcode, [moduleRequestIdx](AbckitInst *inst) {
95 auto imm = g_implG->iGetImmediate(inst, 0);
96 return imm == moduleRequestIdx;
97 });
98 ASSERT_NE(instWithID, nullptr);
99
100 if (exportToRemove == nullptr) {
101 helpers::ExportByAliasContext exportFinder = {nullptr, "LocalExportLet"};
102 g_implI->moduleEnumerateExports(m, &exportFinder, helpers::ExportByAliasFinder);
103 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
104 ASSERT_NE(exportFinder.ed, nullptr);
105 exportToRemove = exportFinder.ed;
106 }
107
108 g_dynG->iSetExportDescriptor(instWithID, exportToRemove);
109 if (negative) {
110 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
111 return;
112 }
113 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
114 }
115
IgetModuleTest(AbckitGraph * graph,AbckitIsaApiDynamicOpcode opcode)116 static void IgetModuleTest(AbckitGraph *graph, AbckitIsaApiDynamicOpcode opcode)
117 {
118 auto moduleRequestIdx = 0x0;
119 AbckitInst *instWithModule = helpers::FindFirstInst(graph, opcode, [moduleRequestIdx](AbckitInst *inst) {
120 auto imm = g_implG->iGetImmediate(inst, 0);
121 return imm == moduleRequestIdx;
122 });
123
124 ASSERT_NE(instWithModule, nullptr);
125 auto moduleI = g_dynG->iGetModule(instWithModule);
126 if (opcode != ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE) {
127 ASSERT_NE(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
128 return;
129 }
130 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
131 helpers::ModuleByNameContext ctxFinder = {nullptr, "modules/module1"};
132 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
133 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
134 ASSERT_NE(ctxFinder.module, nullptr);
135 auto *module = ctxFinder.module;
136 ASSERT_EQ(moduleI, module);
137 }
138
IgetImportDescriptorTest(AbckitGraph * graph,AbckitCoreModule * m,AbckitIsaApiDynamicOpcode opcode)139 static void IgetImportDescriptorTest(AbckitGraph *graph, AbckitCoreModule *m, AbckitIsaApiDynamicOpcode opcode)
140 {
141 auto moduleRequestIdx = 0x3;
142 AbckitInst *instWithID = helpers::FindFirstInst(graph, opcode, [moduleRequestIdx](AbckitInst *inst) {
143 auto imm = g_implG->iGetImmediate(inst, 0);
144 return imm == moduleRequestIdx;
145 });
146
147 ASSERT_NE(instWithID, nullptr);
148 auto importI = g_dynG->iGetImportDescriptor(instWithID);
149 if (opcode != ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR) {
150 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
151 return;
152 }
153 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
154
155 helpers::ImportByAliasContext importFinder = {nullptr, "regularImportFunc1FromModule1"};
156 g_implI->moduleEnumerateImports(m, &importFinder, helpers::ImportByAliasFinder);
157 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
158 ASSERT_NE(importFinder.id, nullptr);
159
160 ASSERT_EQ(importFinder.id, importI);
161 }
162
IgetExportDescriptorTest(AbckitGraph * graph,AbckitCoreModule * m,AbckitIsaApiDynamicOpcode opcode,size_t moduleRequestIdx)163 static void IgetExportDescriptorTest(AbckitGraph *graph, AbckitCoreModule *m, AbckitIsaApiDynamicOpcode opcode,
164 size_t moduleRequestIdx)
165 {
166 AbckitInst *instWithID = helpers::FindFirstInst(graph, opcode, [&](AbckitInst *inst) {
167 auto imm = g_implG->iGetImmediate(inst, 0);
168 return imm == moduleRequestIdx;
169 });
170
171 ASSERT_NE(instWithID, nullptr);
172 auto exportI = g_dynG->iGetExportDescriptor(instWithID);
173 if (opcode != ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR) {
174 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_BAD_ARGUMENT);
175 return;
176 }
177 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
178
179 helpers::ExportByAliasContext exportFinder = {nullptr, "LocalExportLet"};
180 g_implI->moduleEnumerateExports(m, &exportFinder, helpers::ExportByAliasFinder);
181 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
182 ASSERT_NE(exportFinder.ed, nullptr);
183
184 ASSERT_EQ(exportFinder.ed, exportI);
185 }
186
TransformIrGetModuleNamespace(AbckitGraph * graph,AbckitString * funcName,bool isWide=false)187 static void TransformIrGetModuleNamespace(AbckitGraph *graph, AbckitString *funcName, bool isWide = false)
188 {
189 helpers::ModuleByNameContext ctxFinder = {nullptr, "modules/module2"};
190 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
191 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
192 ASSERT_NE(ctxFinder.module, nullptr);
193
194 AbckitBasicBlock *mainBB = g_implG->bbGetSuccBlock(g_implG->gGetStartBasicBlock(graph), 0);
195 AbckitInst *lastInst = g_implG->bbGetLastInst(mainBB);
196 auto getModuleNamespaceInst = isWide ? g_dynG->iCreateWideGetmodulenamespace(graph, ctxFinder.module)
197 : g_dynG->iCreateGetmodulenamespace(graph, ctxFinder.module);
198 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
199 auto ldObjByNameInst = g_dynG->iCreateLdobjbyname(graph, getModuleNamespaceInst, funcName);
200 auto callInst = g_dynG->iCreateCallthis0(graph, ldObjByNameInst, getModuleNamespaceInst);
201 g_implG->iInsertBefore(getModuleNamespaceInst, lastInst);
202 g_implG->iInsertBefore(ldObjByNameInst, lastInst);
203 g_implG->iInsertBefore(callInst, lastInst);
204 }
205
TransformIrLdExternalModuleVar(AbckitGraph * graph,AbckitString * funcName,bool isWide=false)206 static void TransformIrLdExternalModuleVar(AbckitGraph *graph, AbckitString *funcName, bool isWide = false)
207 {
208 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
209 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
210 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
211 ASSERT_NE(ctxFinder.module, nullptr);
212 helpers::ImportByAliasContext importFinder = {nullptr, "MF1M2"};
213 g_implI->moduleEnumerateImports(ctxFinder.module, &importFinder, helpers::ImportByAliasFinder);
214 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
215 ASSERT_NE(importFinder.id, nullptr);
216
217 AbckitBasicBlock *mainBB = g_implG->bbGetSuccBlock(g_implG->gGetStartBasicBlock(graph), 0);
218 AbckitInst *lastInst = g_implG->bbGetLastInst(mainBB);
219 auto ldExternalModuleVarInst = isWide ? g_dynG->iCreateWideLdexternalmodulevar(graph, importFinder.id)
220 : g_dynG->iCreateLdexternalmodulevar(graph, importFinder.id);
221 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
222 auto throwUndef = g_dynG->iCreateThrowUndefinedifholewithname(graph, ldExternalModuleVarInst, funcName);
223 auto callInst = g_dynG->iCreateCallarg0(graph, ldExternalModuleVarInst);
224 g_implG->iInsertBefore(ldExternalModuleVarInst, lastInst);
225 g_implG->iInsertBefore(throwUndef, lastInst);
226 g_implG->iInsertBefore(callInst, lastInst);
227 }
228
TransformIrLdLocalModuleVar(AbckitGraph * graph,AbckitString * localVarName,AbckitString * funcName,bool isWide=false)229 static void TransformIrLdLocalModuleVar(AbckitGraph *graph, AbckitString *localVarName, AbckitString *funcName,
230 bool isWide = false)
231 {
232 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
233 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
234 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
235 ASSERT_NE(ctxFinder.module, nullptr);
236 helpers::ExportByAliasContext exportFinder = {nullptr, "LocalExportLet"};
237 g_implI->moduleEnumerateExports(ctxFinder.module, &exportFinder, helpers::ExportByAliasFinder);
238 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
239 ASSERT_NE(exportFinder.ed, nullptr);
240
241 AbckitBasicBlock *mainBB = g_implG->bbGetSuccBlock(g_implG->gGetStartBasicBlock(graph), 0);
242 AbckitInst *lastInst = g_implG->bbGetLastInst(mainBB);
243 auto tryLdGlobalByNameInst = g_dynG->iCreateTryldglobalbyname(graph, funcName);
244 auto ldLocalModuleVarInst = isWide ? g_dynG->iCreateWideLdlocalmodulevar(graph, exportFinder.ed)
245 : g_dynG->iCreateLdlocalmodulevar(graph, exportFinder.ed);
246 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
247 auto throwUndef = g_dynG->iCreateThrowUndefinedifholewithname(graph, ldLocalModuleVarInst, localVarName);
248 auto callInst = g_dynG->iCreateCallarg1(graph, tryLdGlobalByNameInst, ldLocalModuleVarInst);
249 g_implG->iInsertBefore(tryLdGlobalByNameInst, lastInst);
250 g_implG->iInsertBefore(ldLocalModuleVarInst, lastInst);
251 g_implG->iInsertBefore(throwUndef, lastInst);
252 g_implG->iInsertBefore(callInst, lastInst);
253 }
254
TransformIrStModuleVar(AbckitGraph * graph,AbckitString * localVarName,AbckitString * funcName,bool isWide=false)255 static void TransformIrStModuleVar(AbckitGraph *graph, AbckitString *localVarName, AbckitString *funcName,
256 bool isWide = false)
257 {
258 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
259 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
260 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
261 ASSERT_NE(ctxFinder.module, nullptr);
262 helpers::ExportByAliasContext exportFinder = {nullptr, "LocalExportConst"};
263 g_implI->moduleEnumerateExports(ctxFinder.module, &exportFinder, helpers::ExportByAliasFinder);
264 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
265 ASSERT_NE(exportFinder.ed, nullptr);
266
267 auto *startBB = g_implG->gGetStartBasicBlock(graph);
268 auto *const1Inst = g_implG->bbGetLastInst(startBB);
269 auto *mainBB = g_implG->bbGetSuccBlock(startBB, 0);
270 auto *lastInst = g_implG->bbGetLastInst(mainBB);
271 auto tryLdGlobalByNameInst = g_dynG->iCreateTryldglobalbyname(graph, funcName);
272 auto stModuleVarInst = isWide ? g_dynG->iCreateWideStmodulevar(graph, const1Inst, exportFinder.ed)
273 : g_dynG->iCreateStmodulevar(graph, const1Inst, exportFinder.ed);
274 auto ldLocalModuleVarInst = isWide ? g_dynG->iCreateWideLdlocalmodulevar(graph, exportFinder.ed)
275 : g_dynG->iCreateLdlocalmodulevar(graph, exportFinder.ed);
276 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
277 auto throwUndef = g_dynG->iCreateThrowUndefinedifholewithname(graph, ldLocalModuleVarInst, localVarName);
278 auto callInst = g_dynG->iCreateCallarg1(graph, tryLdGlobalByNameInst, ldLocalModuleVarInst);
279 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
280 g_implG->iInsertBefore(tryLdGlobalByNameInst, lastInst);
281 g_implG->iInsertBefore(stModuleVarInst, lastInst);
282 g_implG->iInsertBefore(ldLocalModuleVarInst, lastInst);
283 g_implG->iInsertBefore(throwUndef, lastInst);
284 g_implG->iInsertBefore(callInst, lastInst);
285 }
286
287 static std::vector<helpers::InstSchema<AbckitIsaApiDynamicOpcode>> g_bb2Insts {
288 {12, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINEFUNC, {}},
289 {13, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {12}},
290 {10, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDUNDEFINED, {}},
291 {11, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {10}},
292 {14, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE, {}},
293 {15, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE, {}},
294 {16, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE, {}},
295 {17, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE, {}},
296 {18, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {17}},
297 {19, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDHOLE, {}},
298 {20, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINECLASSWITHBUFFER, {19}},
299 {21, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {20}},
300 {22, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {20}},
301 {23, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {3}},
302 {24, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {4}},
303 {25, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDHOLE, {}},
304 {26, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINECLASSWITHBUFFER, {25}},
305 {27, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {26}},
306 {28, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {26}},
307 {29, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, {}},
308 {30, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {29}},
309 {31, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {29}},
310 {32, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, {}},
311 {33, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {32}},
312 {34, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {32}},
313 {35, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, {}},
314 {36, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {35}},
315 {37, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {35}},
316 {38, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, {}},
317 {39, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {38}},
318 {40, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {38}},
319 {41, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {14}},
320 {42, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {41, 14}},
321 {43, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {14}},
322 {44, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {43, 14}},
323 {45, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}},
324 {46, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, {}},
325 {47, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {46}},
326 {48, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {45, 46}},
327 {49, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}},
328 {50, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, {}},
329 {51, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {50}},
330 {52, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {49, 50}},
331 {53, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {15}},
332 {54, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {53, 15}},
333 {55, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {16}},
334 {56, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {55, 16}},
335 {57, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED, {}}};
336
CreateBBSchemaForModules()337 static std::vector<helpers::BBSchema<AbckitIsaApiDynamicOpcode>> CreateBBSchemaForModules()
338 {
339 return {{{},
340 {1},
341 {{0, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
342 {1, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
343 {2, ABCKIT_ISA_API_DYNAMIC_OPCODE_PARAMETER, {}},
344 {3, ABCKIT_ISA_API_DYNAMIC_OPCODE_CONSTANT, {}},
345 {4, ABCKIT_ISA_API_DYNAMIC_OPCODE_CONSTANT, {}}}},
346 {
347 {0},
348 {2},
349 g_bb2Insts,
350 },
351 {{1}, {}, {}}};
352 }
353
354 // ========================================
355 // Modules Tests
356 // ========================================
357
358 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetModule, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetModule)359 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetModule)
360 {
361 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
362 "isa_dynamic_modules");
363 auto expected =
364 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
365 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
366 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
367 EXPECT_TRUE(helpers::Match(output, expected));
368
369 helpers::TransformMethod(
370 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
371 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
372 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
373 helpers::ModuleByNameContext ctxFinder = {nullptr, "modules/module1"};
374 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
375 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
376 ASSERT_NE(ctxFinder.module, nullptr);
377
378 IsetModuleTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE);
379 });
380
381 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
382 "isa_dynamic_modules");
383 expected =
384 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
385 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
386 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module1\n";
387 EXPECT_TRUE(helpers::Match(output, expected));
388 }
389
390 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetModule, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetModuleWrongInst)391 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetModuleWrongInst)
392 {
393 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
394 "isa_dynamic_modules");
395 auto expected =
396 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
397 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
398 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
399 EXPECT_TRUE(helpers::Match(output, expected));
400
401 helpers::TransformMethod(
402 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
403 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
404 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
405 helpers::ModuleByNameContext ctxFinder = {nullptr, "modules/module1"};
406 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
407 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
408 ASSERT_NE(ctxFinder.module, nullptr);
409
410 IsetModuleTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, true);
411 });
412
413 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
414 "isa_dynamic_modules");
415 expected =
416 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
417 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
418 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
419 EXPECT_TRUE(helpers::Match(output, expected));
420 }
421
422 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetModule, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetModuleWrongModule)423 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetModuleWrongModule)
424 {
425 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
426 "isa_dynamic_modules");
427 auto expected =
428 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
429 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
430 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
431 EXPECT_TRUE(helpers::Match(output, expected));
432
433 helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
434 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
435 "isa_dynamic_modules.func_main_0",
436 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
437 auto newM = new AbckitCoreModule();
438 newM->impl = std::make_unique<AbckitArktsModule>();
439 IsetModuleTest(graph, newM, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, true, true);
440 delete newM;
441 });
442
443 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
444 "isa_dynamic_modules");
445 expected =
446 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
447 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
448 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
449 EXPECT_TRUE(helpers::Match(output, expected));
450 }
451
452 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetImportDescriptor, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetImportDescriptor)453 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetImportDescriptor)
454 {
455 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
456 "isa_dynamic_modules");
457 auto expected =
458 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
459 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
460 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
461 EXPECT_TRUE(helpers::Match(output, expected));
462
463 helpers::TransformMethod(
464 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
465 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
466 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
467 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
468 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
469 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
470 ASSERT_NE(ctxFinder.module, nullptr);
471 IsetImportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR);
472 });
473
474 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
475 "isa_dynamic_modules");
476 expected =
477 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
478 "module3\nregular import func1 from module2\nnamespace import func2 from module1\nnamespace import func3 from "
479 "module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
480 EXPECT_TRUE(helpers::Match(output, expected));
481 }
482
483 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetImportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetImportDescriptorWrongInst)484 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetImportDescriptorWrongInst)
485 {
486 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
487 "isa_dynamic_modules");
488 auto expected =
489 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
490 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
491 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
492 EXPECT_TRUE(helpers::Match(output, expected));
493
494 helpers::TransformMethod(
495 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
496 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
497 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
498 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
499 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
500 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
501 ASSERT_NE(ctxFinder.module, nullptr);
502 IsetImportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, true);
503 });
504
505 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
506 "isa_dynamic_modules");
507 expected =
508 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
509 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
510 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
511 EXPECT_TRUE(helpers::Match(output, expected));
512 }
513
514 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetImportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetImportDescriptorWrongImport)515 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetImportDescriptorWrongImport)
516 {
517 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
518 "isa_dynamic_modules");
519 auto expected =
520 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
521 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
522 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
523 EXPECT_TRUE(helpers::Match(output, expected));
524
525 helpers::TransformMethod(
526 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
527 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
528 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
529 auto *newID = new AbckitCoreImportDescriptor();
530 newID->impl = std::make_unique<AbckitArktsImportDescriptor>();
531 IsetImportDescriptorTest(graph, nullptr, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, true, newID);
532 delete newID;
533 });
534
535 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
536 "isa_dynamic_modules");
537 expected =
538 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
539 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
540 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
541 EXPECT_TRUE(helpers::Match(output, expected));
542 }
543
544 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetExportDescriptor, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetExportDescriptor)545 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetExportDescriptor)
546 {
547 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
548 "isa_dynamic_modules");
549 auto expected =
550 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
551 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
552 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
553 EXPECT_TRUE(helpers::Match(output, expected));
554
555 helpers::TransformMethod(
556 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
557 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
558 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
559 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
560 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
561 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
562 ASSERT_NE(ctxFinder.module, nullptr);
563 IsetExportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR);
564 });
565
566 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
567 "isa_dynamic_modules");
568 expected =
569 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
570 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
571 "func3 from module1\n2\n2\nnamespace import func3 from module2\nthe same func from module3\n";
572 EXPECT_TRUE(helpers::Match(output, expected));
573 }
574
575 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetExportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetExportDescriptorWrongInst)576 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetExportDescriptorWrongInst)
577 {
578 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
579 "isa_dynamic_modules");
580 auto expected =
581 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
582 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
583 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
584 EXPECT_TRUE(helpers::Match(output, expected));
585
586 helpers::TransformMethod(
587 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
588 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
589 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
590 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
591 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
592 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
593 ASSERT_NE(ctxFinder.module, nullptr);
594 IsetExportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, true);
595 });
596
597 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
598 "isa_dynamic_modules");
599 expected =
600 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
601 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
602 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
603 EXPECT_TRUE(helpers::Match(output, expected));
604 }
605
606 // Test: test-kind=api, api=IsaApiDynamicImpl::iSetExportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIsetExportDescriptorWrongExport)607 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIsetExportDescriptorWrongExport)
608 {
609 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
610 "isa_dynamic_modules");
611 auto expected =
612 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
613 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
614 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
615 EXPECT_TRUE(helpers::Match(output, expected));
616
617 helpers::TransformMethod(
618 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
619 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
620 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
621 auto *newED = new AbckitCoreExportDescriptor();
622 newED->impl = std::make_unique<AbckitArktsExportDescriptor>();
623 IsetExportDescriptorTest(graph, nullptr, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, true, newED);
624 delete newED;
625 });
626
627 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
628 "isa_dynamic_modules");
629 expected =
630 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
631 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
632 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
633 EXPECT_TRUE(helpers::Match(output, expected));
634 }
635
636 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetModule, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetModule)637 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetModule)
638 {
639 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
640 "isa_dynamic_modules");
641 auto expected =
642 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
643 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
644 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
645 EXPECT_TRUE(helpers::Match(output, expected));
646
647 helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
648 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
649 "isa_dynamic_modules.func_main_0",
650 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
651 IgetModuleTest(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE);
652 });
653
654 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
655 "isa_dynamic_modules");
656 expected =
657 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
658 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
659 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
660 EXPECT_TRUE(helpers::Match(output, expected));
661 }
662
663 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetModule, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetModuleWrongInst)664 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetModuleWrongInst)
665 {
666 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
667 "isa_dynamic_modules");
668 auto expected =
669 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
670 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
671 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
672 EXPECT_TRUE(helpers::Match(output, expected));
673
674 helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
675 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
676 "isa_dynamic_modules.func_main_0",
677 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
678 IgetModuleTest(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR);
679 });
680
681 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
682 "isa_dynamic_modules");
683 expected =
684 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
685 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
686 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
687 EXPECT_TRUE(helpers::Match(output, expected));
688 }
689
690 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetImportDescriptor, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetImportDescriptor)691 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetImportDescriptor)
692 {
693 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
694 "isa_dynamic_modules");
695 auto expected =
696 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
697 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
698 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
699 EXPECT_TRUE(helpers::Match(output, expected));
700 helpers::TransformMethod(
701 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
702 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
703 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
704 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
705 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
706 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
707 ASSERT_NE(ctxFinder.module, nullptr);
708 IgetImportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR);
709 });
710
711 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
712 "isa_dynamic_modules");
713 expected =
714 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
715 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
716 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
717 EXPECT_TRUE(helpers::Match(output, expected));
718 }
719
720 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetImportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetImportDescriptorWrongInst)721 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetImportDescriptorWrongInst)
722 {
723 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
724 "isa_dynamic_modules");
725 auto expected =
726 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
727 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
728 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
729 EXPECT_TRUE(helpers::Match(output, expected));
730
731 helpers::TransformMethod(
732 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
733 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
734 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
735 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
736 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
737 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
738 ASSERT_NE(ctxFinder.module, nullptr);
739 IgetImportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR);
740 });
741
742 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
743 "isa_dynamic_modules");
744 expected =
745 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
746 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
747 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
748 EXPECT_TRUE(helpers::Match(output, expected));
749 }
750
751 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetExportDescriptor, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetExportDescriptor)752 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetExportDescriptor)
753 {
754 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
755 "isa_dynamic_modules");
756 auto expected =
757 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
758 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
759 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
760 EXPECT_TRUE(helpers::Match(output, expected));
761
762 helpers::TransformMethod(
763 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
764 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
765 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
766 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
767 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
768 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
769 ASSERT_NE(ctxFinder.module, nullptr);
770 IgetExportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, 0X5);
771 });
772
773 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
774 "isa_dynamic_modules");
775 expected =
776 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
777 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
778 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
779 EXPECT_TRUE(helpers::Match(output, expected));
780 }
781
782 // Test: test-kind=api, api=IsaApiDynamicImpl::iGetExportDescriptor, abc-kind=ArkTS1, category=negative
TEST_F(LibAbcKitIsaDynamicModulesTest,DynamicIgetExportDescriptorWrongInst)783 TEST_F(LibAbcKitIsaDynamicModulesTest, DynamicIgetExportDescriptorWrongInst)
784 {
785 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
786 "isa_dynamic_modules");
787 auto expected =
788 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
789 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
790 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
791 EXPECT_TRUE(helpers::Match(output, expected));
792
793 helpers::TransformMethod(
794 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
795 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
796 [](AbckitFile * /*file*/, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
797 helpers::ModuleByNameContext ctxFinder = {nullptr, "isa_dynamic_modules"};
798 g_implI->fileEnumerateModules(graph->file, &ctxFinder, helpers::ModuleByNameFinder);
799 ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
800 ASSERT_NE(ctxFinder.module, nullptr);
801 IgetExportDescriptorTest(graph, ctxFinder.module, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, 0X3);
802 });
803
804 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
805 "isa_dynamic_modules");
806 expected =
807 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
808 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
809 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
810 EXPECT_TRUE(helpers::Match(output, expected));
811 }
812
813 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateGetmodulenamespace, abc-kind=ArkTS1, category=positive,
814 // extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynGetmodulenamespace)815 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynGetmodulenamespace)
816 {
817 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
818 "isa_dynamic_modules");
819 std::string expected =
820 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
821 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
822 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
823 EXPECT_TRUE(helpers::Match(output, expected));
824
825 helpers::TransformMethod(
826 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
827 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
828 [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
829 AbckitString *abckitstr =
830 g_implM->createString(file, "sameFuncInDifferentModules", strlen("sameFuncInDifferentModules"));
831
832 TransformIrGetModuleNamespace(graph, abckitstr);
833 },
834 [](AbckitGraph *graph) {
835 auto bbSchema = CreateBBSchemaForModules();
836 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
837 {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_GETMODULENAMESPACE, {}});
838 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
839 {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {59}});
840 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
841 {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {60, 59}});
842 helpers::VerifyGraph(graph, bbSchema);
843 });
844
845 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
846 "isa_dynamic_modules");
847 expected += "the same func from module2\n";
848 EXPECT_TRUE(helpers::Match(output, expected));
849 }
850
851 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateWideGetmodulenamespace, abc-kind=ArkTS1, category=positive,
852 // extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynWideGetmodulenamespace)853 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynWideGetmodulenamespace)
854 {
855 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
856 "isa_dynamic_modules");
857 std::string expected =
858 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
859 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
860 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
861 EXPECT_TRUE(helpers::Match(output, expected));
862
863 helpers::TransformMethod(
864 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
865 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
866 [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
867 AbckitString *abckitstr =
868 g_implM->createString(file, "sameFuncInDifferentModules", strlen("sameFuncInDifferentModules"));
869
870 TransformIrGetModuleNamespace(graph, abckitstr, true);
871 },
872 [](AbckitGraph *graph) {
873 auto bbSchema = CreateBBSchemaForModules();
874 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
875 {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_WIDE_GETMODULENAMESPACE, {}});
876 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
877 {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDOBJBYNAME, {59}});
878 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
879 {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLTHIS0, {60, 59}});
880 helpers::VerifyGraph(graph, bbSchema);
881 });
882
883 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
884 "isa_dynamic_modules");
885 expected += "the same func from module2\n";
886 EXPECT_TRUE(helpers::Match(output, expected));
887 }
888
889 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateLdexternalmodulevar, abc-kind=ArkTS1, category=positive,
890 // extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynLdexternalmodulevar)891 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynLdexternalmodulevar)
892 {
893 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
894 "isa_dynamic_modules");
895 std::string expected =
896 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
897 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
898 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
899 EXPECT_TRUE(helpers::Match(output, expected));
900
901 helpers::TransformMethod(
902 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
903 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
904 [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
905 AbckitString *abckitstr = g_implM->createString(file, "MF1M2", strlen("MF1M2"));
906
907 TransformIrLdExternalModuleVar(graph, abckitstr);
908 },
909 [](AbckitGraph *graph) {
910 auto bbSchema = CreateBBSchemaForModules();
911 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
912 {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDEXTERNALMODULEVAR, {}});
913 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
914 {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {59}});
915 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
916 {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {59}});
917 helpers::VerifyGraph(graph, bbSchema);
918 });
919
920 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
921 "isa_dynamic_modules");
922 expected += "regular import func1 from module2\n";
923 EXPECT_TRUE(helpers::Match(output, expected));
924 }
925
926 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateWideLdexternalmodulevar, abc-kind=ArkTS1, category=positive,
927 // extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynWideLdexternalmodulevar)928 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynWideLdexternalmodulevar)
929 {
930 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
931 "isa_dynamic_modules");
932 std::string expected =
933 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
934 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
935 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
936 EXPECT_TRUE(helpers::Match(output, expected));
937
938 helpers::TransformMethod(
939 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
940 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
941 [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
942 AbckitString *abckitstr = g_implM->createString(file, "MF1M2", strlen("MF1M2"));
943
944 TransformIrLdExternalModuleVar(graph, abckitstr, true);
945 },
946 [](AbckitGraph *graph) {
947 auto bbSchema = CreateBBSchemaForModules();
948 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
949 {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_WIDE_LDEXTERNALMODULEVAR, {}});
950 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
951 {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {59}});
952 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
953 {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG0, {59}});
954 helpers::VerifyGraph(graph, bbSchema);
955 });
956
957 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
958 "isa_dynamic_modules");
959 expected += "regular import func1 from module2\n";
960 EXPECT_TRUE(helpers::Match(output, expected));
961 }
962
963 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateLdlocalmodulevar, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynLdlocalmodulevar)964 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynLdlocalmodulevar)
965 {
966 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
967 "isa_dynamic_modules");
968 std::string expected =
969 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
970 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
971 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
972 EXPECT_TRUE(helpers::Match(output, expected));
973
974 helpers::TransformMethod(
975 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
976 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
977 [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
978 AbckitString *abckitstr = g_implM->createString(file, "LocalExportLet", strlen("LocalExportLet"));
979 AbckitString *abckitcallStr = g_implM->createString(file, "print", strlen("print"));
980
981 TransformIrLdLocalModuleVar(graph, abckitstr, abckitcallStr);
982 },
983 [](AbckitGraph *graph) {
984 auto bbSchema = CreateBBSchemaForModules();
985 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
986 {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}});
987 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
988 {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, {}});
989 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
990 {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {60}});
991 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 50,
992 {62, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {59, 60}});
993 helpers::VerifyGraph(graph, bbSchema);
994 });
995
996 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
997 "isa_dynamic_modules");
998 expected += "2\n";
999 EXPECT_TRUE(helpers::Match(output, expected));
1000 }
1001
1002 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateWideLdlocalmodulevar, abc-kind=ArkTS1, category=positive,
1003 // extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynWideLdlocalmodulevar)1004 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynWideLdlocalmodulevar)
1005 {
1006 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1007 "isa_dynamic_modules");
1008 std::string expected =
1009 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
1010 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
1011 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
1012 EXPECT_TRUE(helpers::Match(output, expected));
1013
1014 helpers::TransformMethod(
1015 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1016 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
1017 [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
1018 AbckitString *abckitstr = g_implM->createString(file, "LocalExportLet", strlen("LocalExportLet"));
1019 AbckitString *abckitcallStr = g_implM->createString(file, "print", strlen("print"));
1020
1021 TransformIrLdLocalModuleVar(graph, abckitstr, abckitcallStr, true);
1022 },
1023 [](AbckitGraph *graph) {
1024 auto bbSchema = CreateBBSchemaForModules();
1025 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
1026 {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}});
1027 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
1028 {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_WIDE_LDLOCALMODULEVAR, {}});
1029 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
1030 {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {60}});
1031 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 50,
1032 {62, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {59, 60}});
1033 helpers::VerifyGraph(graph, bbSchema);
1034 });
1035
1036 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
1037 "isa_dynamic_modules");
1038 expected += "2\n";
1039 EXPECT_TRUE(helpers::Match(output, expected));
1040 }
1041
1042 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateStmodulevar, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynStmodulevar)1043 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynStmodulevar)
1044 {
1045 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1046 "isa_dynamic_modules");
1047 std::string expected =
1048 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
1049 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
1050 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
1051 EXPECT_TRUE(helpers::Match(output, expected));
1052
1053 helpers::TransformMethod(
1054 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1055 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
1056 [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
1057 AbckitString *abckitstr = g_implM->createString(file, "LocalExportConst", strlen("LocalExportConst"));
1058 AbckitString *abckitcallStr = g_implM->createString(file, "print", strlen("print"));
1059
1060 TransformIrStModuleVar(graph, abckitstr, abckitcallStr);
1061 },
1062 [](AbckitGraph *graph) {
1063 auto bbSchema = CreateBBSchemaForModules();
1064 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
1065 {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}});
1066 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
1067 {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_STMODULEVAR, {4}});
1068 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
1069 {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_LDLOCALMODULEVAR, {}});
1070 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 50,
1071 {62, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {61}});
1072 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 51,
1073 {63, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {59, 61}});
1074 helpers::VerifyGraph(graph, bbSchema);
1075 });
1076
1077 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
1078 "isa_dynamic_modules");
1079 expected += "1\n";
1080 EXPECT_TRUE(helpers::Match(output, expected));
1081 }
1082
1083 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateWideStmodulevar, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitIsaDynamicModulesTest,LibAbcKitTestCreateDynWideStmodulevar)1084 TEST_F(LibAbcKitIsaDynamicModulesTest, LibAbcKitTestCreateDynWideStmodulevar)
1085 {
1086 auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1087 "isa_dynamic_modules");
1088 std::string expected =
1089 "regular import func1 from module1\nregular import func1 from module2\nregular default import func1 from "
1090 "module3\nregular default import func2 from module2\nnamespace import func2 from module1\nnamespace import "
1091 "func3 from module1\n1\n2\nnamespace import func3 from module2\nthe same func from module3\n";
1092 EXPECT_TRUE(helpers::Match(output, expected));
1093
1094 helpers::TransformMethod(
1095 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules.abc",
1096 ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc", "isa_dynamic_modules.func_main_0",
1097 [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
1098 AbckitString *abckitstr = g_implM->createString(file, "LocalExportConst", strlen("LocalExportConst"));
1099 AbckitString *abckitcallStr = g_implM->createString(file, "print", strlen("print"));
1100
1101 TransformIrStModuleVar(graph, abckitstr, abckitcallStr, true);
1102 },
1103 [](AbckitGraph *graph) {
1104 auto bbSchema = CreateBBSchemaForModules();
1105 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 47,
1106 {59, ABCKIT_ISA_API_DYNAMIC_OPCODE_TRYLDGLOBALBYNAME, {}});
1107 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 48,
1108 {60, ABCKIT_ISA_API_DYNAMIC_OPCODE_WIDE_STMODULEVAR, {4}});
1109 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 49,
1110 {61, ABCKIT_ISA_API_DYNAMIC_OPCODE_WIDE_LDLOCALMODULEVAR, {}});
1111 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 50,
1112 {62, ABCKIT_ISA_API_DYNAMIC_OPCODE_THROW_UNDEFINEDIFHOLEWITHNAME, {61}});
1113 bbSchema[1].instSchemas.insert(bbSchema[1].instSchemas.begin() + 51,
1114 {63, ABCKIT_ISA_API_DYNAMIC_OPCODE_CALLARG1, {59, 61}});
1115 helpers::VerifyGraph(graph, bbSchema);
1116 });
1117
1118 output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/modules/isa_dynamic_modules_modified.abc",
1119 "isa_dynamic_modules");
1120 expected += "1\n";
1121 EXPECT_TRUE(helpers::Match(output, expected));
1122 }
1123
1124 } // namespace libabckit::test
1125 // NOLINTEND(readability-magic-numbers)
1126