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, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11 * either express or implied. See the License for the specific language governing permissions and limitations under the
12 * License.
13 */
14
15 #include <cassert>
16 #include <cstdint>
17 #include "libabckit/include/c/abckit.h"
18 #include "libabckit/include/c/extensions/js/metadata_js.h"
19
20 #include "libabckit/src/macros.h"
21 #include "libabckit/src/metadata_inspect_impl.h"
22 #include "libabckit/src/adapter_dynamic/metadata_modify_dynamic.h"
23 #include "libabckit/src/adapter_static/metadata_modify_static.h"
24 #include "scoped_timer.h"
25
26 namespace libabckit {
27
28 // ========================================
29 // File
30 // ========================================
31
FileAddExternalModule(AbckitFile * file,const struct AbckitJsExternalModuleCreateParams * params)32 extern "C" AbckitJsModule *FileAddExternalModule(AbckitFile *file,
33 const struct AbckitJsExternalModuleCreateParams *params)
34 {
35 LIBABCKIT_CLEAR_LAST_ERROR;
36 LIBABCKIT_IMPLEMENTED;
37 LIBABCKIT_TIME_EXEC;
38
39 LIBABCKIT_BAD_ARGUMENT(file, nullptr);
40 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
41
42 if (file->frontend != Mode::DYNAMIC) {
43 statuses::SetLastError(ABCKIT_STATUS_WRONG_MODE);
44 return nullptr;
45 }
46
47 return FileAddExternalJsModule(file, params);
48 }
49
50 // ========================================
51 // Module
52 // ========================================
53
ModuleAddImportFromJsToJs(AbckitJsModule * importing,AbckitJsModule * imported,const struct AbckitJsImportFromDynamicModuleCreateParams * params)54 extern "C" AbckitJsImportDescriptor *ModuleAddImportFromJsToJs(
55 AbckitJsModule *importing /* assert(importing.target === AbckitTarget_ArkTS_v2) */,
56 AbckitJsModule *imported /* assert(importing.target === AbckitTarget_ArkTS_v2) */,
57 const struct AbckitJsImportFromDynamicModuleCreateParams *params)
58 {
59 LIBABCKIT_CLEAR_LAST_ERROR;
60 LIBABCKIT_IMPLEMENTED;
61 LIBABCKIT_TIME_EXEC;
62
63 LIBABCKIT_BAD_ARGUMENT(importing, nullptr);
64 LIBABCKIT_BAD_ARGUMENT(imported, nullptr);
65 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
66
67 LIBABCKIT_INTERNAL_ERROR(importing->core, nullptr);
68 LIBABCKIT_INTERNAL_ERROR(imported->core, nullptr);
69
70 return ModuleAddImportFromDynamicModuleDynamic(importing->core, imported->core, params);
71 }
72
ModuleRemoveImportJs(AbckitJsModule * m,AbckitJsImportDescriptor * i)73 extern "C" void ModuleRemoveImportJs(AbckitJsModule *m, AbckitJsImportDescriptor *i)
74 {
75 LIBABCKIT_CLEAR_LAST_ERROR;
76 LIBABCKIT_IMPLEMENTED;
77 LIBABCKIT_TIME_EXEC;
78
79 LIBABCKIT_BAD_ARGUMENT_VOID(m)
80 LIBABCKIT_BAD_ARGUMENT_VOID(i)
81
82 LIBABCKIT_INTERNAL_ERROR_VOID(m->core)
83
84 return ModuleRemoveImportDynamic(m->core, i);
85 }
86
ModuleAddExportFromJsToJs(AbckitJsModule * exporting,AbckitJsModule * exported,const AbckitJsDynamicModuleExportCreateParams * params)87 extern "C" AbckitJsExportDescriptor *ModuleAddExportFromJsToJs(AbckitJsModule *exporting, AbckitJsModule *exported,
88 const AbckitJsDynamicModuleExportCreateParams *params)
89 {
90 LIBABCKIT_CLEAR_LAST_ERROR;
91 LIBABCKIT_IMPLEMENTED;
92 LIBABCKIT_TIME_EXEC;
93
94 LIBABCKIT_BAD_ARGUMENT(exporting, nullptr);
95 LIBABCKIT_BAD_ARGUMENT(exported, nullptr);
96 LIBABCKIT_BAD_ARGUMENT(params, nullptr);
97
98 LIBABCKIT_INTERNAL_ERROR(exporting->core, nullptr);
99 LIBABCKIT_INTERNAL_ERROR(exported->core, nullptr);
100
101 return DynamicModuleAddExportDynamic(exporting->core, exported->core, params);
102 }
103
ModuleRemoveExportJs(AbckitJsModule * m,AbckitJsExportDescriptor * e)104 extern "C" void ModuleRemoveExportJs(AbckitJsModule *m, AbckitJsExportDescriptor *e)
105 {
106 LIBABCKIT_CLEAR_LAST_ERROR;
107 LIBABCKIT_IMPLEMENTED;
108 LIBABCKIT_TIME_EXEC;
109
110 LIBABCKIT_BAD_ARGUMENT_VOID(m)
111 LIBABCKIT_BAD_ARGUMENT_VOID(e)
112
113 LIBABCKIT_INTERNAL_ERROR_VOID(m->core);
114
115 return ModuleRemoveExportDynamic(m->core, e);
116 }
117
118 // ========================================
119 // Class
120 // ========================================
121
122 // ========================================
123 // AnnotationInterface
124 // ========================================
125
126 // ========================================
127 // Function
128 // ========================================
129
130 // ========================================
131 // Annotation
132 // ========================================
133
134 // ========================================
135 // Type
136 // ========================================
137
138 // ========================================
139 // Value
140 // ========================================
141
142 // ========================================
143 // String
144 // ========================================
145
146 // ========================================
147 // LiteralArray
148 // ========================================
149
150 AbckitJsModifyApi g_jsModifyApiImpl = {
151
152 // ========================================
153 // File
154 // ========================================
155
156 FileAddExternalModule,
157
158 // ========================================
159 // Module
160 // ========================================
161
162 ModuleAddImportFromJsToJs, ModuleRemoveImportJs, ModuleAddExportFromJsToJs, ModuleRemoveExportJs,
163
164 // ========================================
165 // Class
166 // ========================================
167
168 // ========================================
169 // AnnotationInterface
170 // ========================================
171
172 // ========================================
173 // Function
174 // ========================================
175
176 // ========================================
177 // Annotation
178 // ========================================
179
180 // ========================================
181 // Type
182 // ========================================
183
184 // ========================================
185 // Value
186 // ========================================
187
188 // ========================================
189 // String
190 // ========================================
191
192 // ========================================
193 // LiteralArray
194 // ========================================
195
196 // ========================================
197 // LiteralArray
198 // ========================================
199 };
200
201 } // namespace libabckit
202
203 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
204 #include "./mock/abckit_mock.h"
205 #endif
206
AbckitGetJsModifyApiImpl(AbckitApiVersion version)207 extern "C" AbckitJsModifyApi const *AbckitGetJsModifyApiImpl(AbckitApiVersion version)
208 {
209 #ifdef ABCKIT_ENABLE_MOCK_IMPLEMENTATION
210 return AbckitGetMockJsModifyApiImpl(ABCKIT_VERSION_RELEASE_1_0_0);
211 #endif
212 switch (version) {
213 case ABCKIT_VERSION_RELEASE_1_0_0:
214 return &libabckit::g_jsModifyApiImpl;
215 default:
216 libabckit::statuses::SetLastError(ABCKIT_STATUS_UNKNOWN_API_VERSION);
217 return nullptr;
218 }
219 }
220