• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "libabckit/include/c/metadata_core.h"
17 #include "libabckit/include/c/ir_core.h"
18 #include "libabckit/include/c/isa/isa_dynamic.h"
19 #include "libabckit/include/c/abckit.h"
20 
21 #include "helpers/helpers.h"
22 #include "helpers/helpers_runtime.h"
23 
24 #include <gtest/gtest.h>
25 
26 // NOLINTBEGIN(readability-magic-numbers)
27 namespace libabckit::test {
28 
29 namespace {
30 
31 auto g_impl = AbckitGetApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
32 auto g_implI = AbckitGetInspectApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
33 auto g_implM = AbckitGetModifyApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
34 auto g_implG = AbckitGetGraphApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
35 auto g_dynG = AbckitGetIsaApiDynamicImpl(ABCKIT_VERSION_RELEASE_1_0_0);
36 
__anon0f0f2c480202(AbckitFile *file, AbckitCoreFunction * , AbckitGraph *graph) 37 auto g_icreateApplyLambda0 = [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
38     auto *ldlexvar = g_dynG->iCreateLdlexvar(graph, 0x0, 0x0);
39     auto *ldundefined = g_dynG->iCreateLdundefined(graph);
40     auto *createemptyarray = g_dynG->iCreateCreateemptyarray(graph);
41     auto *const0 = g_implG->gFindOrCreateConstantU64(graph, 0x0);
42     auto *param3 = g_implG->gGetParameter(graph, 0x3);
43     auto *starrayspread = g_dynG->iCreateStarrayspread(graph, param3, createemptyarray, const0);
44     auto *stringLength = g_implM->createString(file, "length", strlen("length"));
45     auto *ldobjbyname = g_dynG->iCreateLdobjbyname(graph, createemptyarray, stringLength);
46     auto *apply = g_dynG->iCreateApply(graph, ldlexvar, ldundefined, createemptyarray);
47     ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
48     auto *returnundefLast = helpers::FindLastInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED);
49     g_implG->iInsertBefore(ldlexvar, returnundefLast);
50     g_implG->iInsertBefore(ldundefined, returnundefLast);
51     g_implG->iInsertBefore(createemptyarray, returnundefLast);
52     g_implG->iInsertBefore(starrayspread, returnundefLast);
53     g_implG->iInsertBefore(ldobjbyname, returnundefLast);
54     g_implG->iInsertBefore(apply, returnundefLast);
55 };
56 
__anon0f0f2c480302(AbckitFile *file, AbckitCoreFunction * , AbckitGraph *graph) 57 auto g_icreateApplyLambda1 = [](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
58     std::vector<AbckitLiteral *> arr = {g_implM->createLiteralU32(file, 1), g_implM->createLiteralU32(file, 2)};
59     auto *litArr = g_implM->createLiteralArray(file, arr.data(), arr.size());
60 
61     auto *newlexenv = g_dynG->iCreateNewlexenv(graph, 0x1);
62     auto *definefuncfunc = helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINEFUNC);
63     auto *definefunctest = helpers::FindLastInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINEFUNC);
64     auto *stlexvar = g_dynG->iCreateStlexvar(graph, definefuncfunc, 0x0, 0x0);
65     auto *createarraywithbuffer = g_dynG->iCreateCreatearraywithbuffer(graph, litArr);
66     auto *callarg1 = g_dynG->iCreateCallarg1(graph, definefunctest, createarraywithbuffer);
67 
68     auto *returnundef = helpers::FindLastInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED);
69     g_implG->iInsertBefore(newlexenv, definefunctest);
70     g_implG->iInsertBefore(stlexvar, returnundef);
71     g_implG->iInsertBefore(createarraywithbuffer, returnundef);
72     g_implG->iInsertBefore(callarg1, returnundef);
73 };
74 
75 }  // namespace
76 
77 class LibAbcKitCreateDynApply : public ::testing::Test {};
78 
79 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateApply, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateDynApply,IcreateApply)80 TEST_F(LibAbcKitCreateDynApply, IcreateApply)
81 {
82     auto output =
83         helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/apply_dynamic.abc", "apply_dynamic");
84     EXPECT_TRUE(helpers::Match(output, ""));
85 
86     helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/apply_dynamic.abc",
87                              ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/apply_dynamic_modified.abc", "test",
88                              g_icreateApplyLambda0);
89 
90     helpers::TransformMethod(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/apply_dynamic_modified.abc",
91                              ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/apply_dynamic_modified.abc", "func_main_0",
92                              g_icreateApplyLambda1);
93 
94     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/apply_dynamic_modified.abc",
95                                         "apply_dynamic");
96     EXPECT_TRUE(helpers::Match(output, "1 2\n"));
97 }
98 
99 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateNewobjapply, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateDynApply,IcreateNewobjapply_1)100 TEST_F(LibAbcKitCreateDynApply, IcreateNewobjapply_1)
101 {
102     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/newobjapply_dynamic.abc",
103                                              "newobjapply_dynamic");
104     EXPECT_TRUE(helpers::Match(output, ""));
105 
106     helpers::TransformMethod(
107         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/newobjapply_dynamic.abc",
108         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/newobjapply_dynamic_modified.abc", "func_main_0",
109         [&](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
110             auto *createemptyarray = g_dynG->iCreateCreateemptyarray(graph);
111             auto *const0 = g_implG->gFindOrCreateConstantU64(graph, 0x0);
112             auto *createarraywithbuffer =
113                 helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEARRAYWITHBUFFER);
114             auto *starrayspread = g_dynG->iCreateStarrayspread(graph, createarraywithbuffer, createemptyarray, const0);
115             auto *stringLength = g_implM->createString(file, "length", strlen("length"));
116             auto *ldobjbyname = g_dynG->iCreateLdobjbyname(graph, createemptyarray, stringLength);
117             auto *defineclasswithbuffer =
118                 helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINECLASSWITHBUFFER);
119             auto *newobjapply = g_dynG->iCreateNewobjapply(graph, createemptyarray, defineclasswithbuffer);
120             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
121             auto *stringPrint = g_implM->createString(file, "print", strlen("print"));
122             auto *tryldglobalbyname = g_dynG->iCreateTryldglobalbyname(graph, stringPrint);
123             auto *stringA = g_implM->createString(file, "a", strlen("a"));
124             auto *ldobjbyname2 = g_dynG->iCreateLdobjbyname(graph, newobjapply, stringA);
125             auto *callarg1 = g_dynG->iCreateCallarg1(graph, tryldglobalbyname, ldobjbyname2);
126 
127             auto *returnundef = helpers::FindLastInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED);
128             g_implG->iInsertBefore(createemptyarray, returnundef);
129             g_implG->iInsertBefore(starrayspread, returnundef);
130             g_implG->iInsertBefore(ldobjbyname, returnundef);
131             g_implG->iInsertBefore(newobjapply, returnundef);
132             g_implG->iInsertBefore(tryldglobalbyname, returnundef);
133             g_implG->iInsertBefore(ldobjbyname2, returnundef);
134             g_implG->iInsertBefore(callarg1, returnundef);
135         });
136 
137     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/newobjapply_dynamic_modified.abc",
138                                         "newobjapply_dynamic");
139     EXPECT_TRUE(helpers::Match(output, "1\n"));
140 }
141 
142 // Test: test-kind=api, api=IsaApiDynamicImpl::iCreateNewobjapply, abc-kind=ArkTS1, category=positive, extension=c
TEST_F(LibAbcKitCreateDynApply,IcreateNewobjapply_2)143 TEST_F(LibAbcKitCreateDynApply, IcreateNewobjapply_2)
144 {
145     auto output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/newobjapply_dynamic.abc",
146                                              "newobjapply_dynamic");
147     EXPECT_TRUE(helpers::Match(output, ""));
148 
149     helpers::TransformMethod(
150         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/newobjapply_dynamic.abc",
151         ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/newobjapply_dynamic_modified.abc", "func_main_0",
152         [&](AbckitFile *file, AbckitCoreFunction * /*method*/, AbckitGraph *graph) {
153             auto *createemptyarray = g_dynG->iCreateCreateemptyarray(graph);
154             auto *const0 = g_implG->gFindOrCreateConstantU64(graph, 0x0);
155             auto *createarraywithbuffer =
156                 helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_CREATEARRAYWITHBUFFER);
157             auto *starrayspread = g_dynG->iCreateStarrayspread(graph, createarraywithbuffer, createemptyarray, const0);
158             auto *stringLength = g_implM->createString(file, "length", strlen("length"));
159             auto *ldobjbyname = g_dynG->iCreateLdobjbyname(graph, createemptyarray, stringLength);
160             auto *defineclasswithbuffer =
161                 helpers::FindFirstInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_DEFINECLASSWITHBUFFER);
162             auto *newobjapply = g_dynG->iCreateNewobjapply(graph, createemptyarray, defineclasswithbuffer);
163             ASSERT_EQ(g_impl->getLastError(), ABCKIT_STATUS_NO_ERROR);
164             auto *stringPrint = g_implM->createString(file, "print", strlen("print"));
165             auto *tryldglobalbyname = g_dynG->iCreateTryldglobalbyname(graph, stringPrint);
166             auto *stringA = g_implM->createString(file, "a", strlen("a"));
167             auto *ldobjbynameA = g_dynG->iCreateLdobjbyname(graph, newobjapply, stringA);
168             auto *callarg1A = g_dynG->iCreateCallarg1(graph, tryldglobalbyname, ldobjbynameA);
169             auto *stringB = g_implM->createString(file, "b", strlen("b"));
170             auto *ldobjbynameB = g_dynG->iCreateLdobjbyname(graph, newobjapply, stringB);
171             auto *callarg1B = g_dynG->iCreateCallarg1(graph, tryldglobalbyname, ldobjbynameB);
172             auto *stringC = g_implM->createString(file, "c", strlen("c"));
173             auto *ldobjbynameC = g_dynG->iCreateLdobjbyname(graph, newobjapply, stringC);
174             auto *callarg1C = g_dynG->iCreateCallarg1(graph, tryldglobalbyname, ldobjbynameC);
175 
176             auto *returnundef = helpers::FindLastInst(graph, ABCKIT_ISA_API_DYNAMIC_OPCODE_RETURNUNDEFINED);
177             g_implG->iInsertBefore(createemptyarray, returnundef);
178             g_implG->iInsertBefore(starrayspread, returnundef);
179             g_implG->iInsertBefore(ldobjbyname, returnundef);
180             g_implG->iInsertBefore(newobjapply, returnundef);
181             g_implG->iInsertBefore(tryldglobalbyname, returnundef);
182             g_implG->iInsertBefore(ldobjbynameA, returnundef);
183             g_implG->iInsertBefore(ldobjbynameB, returnundef);
184             g_implG->iInsertBefore(ldobjbynameC, returnundef);
185             g_implG->iInsertBefore(callarg1A, returnundef);
186             g_implG->iInsertBefore(callarg1B, returnundef);
187             g_implG->iInsertBefore(callarg1C, returnundef);
188         });
189 
190     output = helpers::ExecuteDynamicAbc(ABCKIT_ABC_DIR "ut/isa/isa_dynamic/apply/newobjapply_dynamic_modified.abc",
191                                         "newobjapply_dynamic");
192     EXPECT_TRUE(helpers::Match(output, "1\n2\na\n"));
193 }
194 
195 }  // namespace libabckit::test
196 // NOLINTEND(readability-magic-numbers)
197