1 /**
2 * Copyright (c) 2023-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 "intrinsics.h"
17 #include "plugins/ets/runtime/interop_js/intrinsics_api_impl.h"
18 #include "plugins/ets/runtime/types/ets_string.h"
19 #include "interop_js/call/call.h"
20
21 namespace ark::ets::interop::js::intrinsics {
22
JSRuntimeFinalizationRegistryCallbackIntrinsic(EtsObject * obj)23 void JSRuntimeFinalizationRegistryCallbackIntrinsic(EtsObject *obj)
24 {
25 JSRuntimeFinalizationRegistryCallback(obj);
26 }
27
JSRuntimeNewJSValueDoubleIntrinsic(double v)28 JSValue *JSRuntimeNewJSValueDoubleIntrinsic(double v)
29 {
30 return JSRuntimeNewJSValueDouble(v);
31 }
32
JSRuntimeNewJSValueBooleanIntrinsic(uint8_t v)33 JSValue *JSRuntimeNewJSValueBooleanIntrinsic(uint8_t v)
34 {
35 return JSRuntimeNewJSValueBoolean(v);
36 }
37
JSRuntimeNewJSValueStringIntrinsic(EtsString * v)38 JSValue *JSRuntimeNewJSValueStringIntrinsic(EtsString *v)
39 {
40 return JSRuntimeNewJSValueString(v);
41 }
42
JSRuntimeNewJSValueObjectIntrinsic(EtsObject * v)43 JSValue *JSRuntimeNewJSValueObjectIntrinsic(EtsObject *v)
44 {
45 return JSRuntimeNewJSValueObject(v);
46 }
47
JSRuntimeGetValueDoubleIntrinsic(JSValue * etsJsValue)48 double JSRuntimeGetValueDoubleIntrinsic(JSValue *etsJsValue)
49 {
50 return JSRuntimeGetValueDouble(etsJsValue);
51 }
52
JSRuntimeGetValueBooleanIntrinsic(JSValue * etsJsValue)53 uint8_t JSRuntimeGetValueBooleanIntrinsic(JSValue *etsJsValue)
54 {
55 return JSRuntimeGetValueBoolean(etsJsValue);
56 }
57
JSRuntimeGetValueStringIntrinsic(JSValue * etsJsValue)58 EtsString *JSRuntimeGetValueStringIntrinsic(JSValue *etsJsValue)
59 {
60 return JSRuntimeGetValueString(etsJsValue);
61 }
62
JSRuntimeGetValueObjectIntrinsic(JSValue * etsJsValue,EtsClass * cls)63 EtsObject *JSRuntimeGetValueObjectIntrinsic(JSValue *etsJsValue, EtsClass *cls)
64 {
65 return JSRuntimeGetValueObject(etsJsValue, cls);
66 }
67
JSRuntimeGetPropertyJSValueIntrinsic(JSValue * etsJsValue,EtsString * etsPropName)68 JSValue *JSRuntimeGetPropertyJSValueIntrinsic(JSValue *etsJsValue, EtsString *etsPropName)
69 {
70 return JSValueNamedGetter<JSConvertJSValue>(etsJsValue, etsPropName);
71 }
72
JSRuntimeGetPropertyDoubleIntrinsic(JSValue * etsJsValue,EtsString * etsPropName)73 double JSRuntimeGetPropertyDoubleIntrinsic(JSValue *etsJsValue, EtsString *etsPropName)
74 {
75 return JSValueNamedGetter<JSConvertF64>(etsJsValue, etsPropName);
76 }
77
JSRuntimeGetPropertyStringIntrinsic(JSValue * etsJsValue,EtsString * etsPropName)78 EtsString *JSRuntimeGetPropertyStringIntrinsic(JSValue *etsJsValue, EtsString *etsPropName)
79 {
80 return JSValueNamedGetter<JSConvertString>(etsJsValue, etsPropName);
81 }
82
JSRuntimeGetPropertyBooleanIntrinsic(JSValue * etsJsValue,EtsString * etsPropName)83 uint8_t JSRuntimeGetPropertyBooleanIntrinsic(JSValue *etsJsValue, EtsString *etsPropName)
84 {
85 return static_cast<uint8_t>(JSValueNamedGetter<JSConvertU1>(etsJsValue, etsPropName));
86 }
87
JSRuntimeSetPropertyJSValueIntrinsic(JSValue * etsJsValue,EtsString * etsPropName,JSValue * value)88 void JSRuntimeSetPropertyJSValueIntrinsic(JSValue *etsJsValue, EtsString *etsPropName, JSValue *value)
89 {
90 JSValueNamedSetter<JSConvertJSValue>(etsJsValue, etsPropName, value);
91 }
92
JSRuntimeSetPropertyDoubleIntrinsic(JSValue * etsJsValue,EtsString * etsPropName,double value)93 void JSRuntimeSetPropertyDoubleIntrinsic(JSValue *etsJsValue, EtsString *etsPropName, double value)
94 {
95 JSValueNamedSetter<JSConvertF64>(etsJsValue, etsPropName, value);
96 }
97
JSRuntimeSetPropertyStringIntrinsic(JSValue * etsJsValue,EtsString * etsPropName,EtsString * value)98 void JSRuntimeSetPropertyStringIntrinsic(JSValue *etsJsValue, EtsString *etsPropName, EtsString *value)
99 {
100 JSValueNamedSetter<JSConvertString>(etsJsValue, etsPropName, value);
101 }
102
JSRuntimeSetPropertyBooleanIntrinsic(JSValue * etsJsValue,EtsString * etsPropName,uint8_t value)103 void JSRuntimeSetPropertyBooleanIntrinsic(JSValue *etsJsValue, EtsString *etsPropName, uint8_t value)
104 {
105 JSValueNamedSetter<JSConvertU1>(etsJsValue, etsPropName, static_cast<bool>(value));
106 }
107
JSRuntimeGetElementJSValueIntrinsic(JSValue * etsJsValue,int32_t index)108 JSValue *JSRuntimeGetElementJSValueIntrinsic(JSValue *etsJsValue, int32_t index)
109 {
110 return JSValueIndexedGetter<JSConvertJSValue>(etsJsValue, index);
111 }
112
JSRuntimeGetElementDoubleIntrinsic(JSValue * etsJsValue,int32_t index)113 double JSRuntimeGetElementDoubleIntrinsic(JSValue *etsJsValue, int32_t index)
114 {
115 return JSValueIndexedGetter<JSConvertF64>(etsJsValue, index);
116 }
117
JSRuntimeGetUndefinedIntrinsic()118 JSValue *JSRuntimeGetUndefinedIntrinsic()
119 {
120 return JSRuntimeGetUndefined();
121 }
122
JSRuntimeGetNullIntrinsic()123 JSValue *JSRuntimeGetNullIntrinsic()
124 {
125 return JSRuntimeGetNull();
126 }
127
JSRuntimeGetGlobalIntrinsic()128 JSValue *JSRuntimeGetGlobalIntrinsic()
129 {
130 return JSRuntimeGetGlobal();
131 }
132
JSRuntimeCreateObjectIntrinsic()133 JSValue *JSRuntimeCreateObjectIntrinsic()
134 {
135 return JSRuntimeCreateObject();
136 }
137
JSRuntimeInstanceOfDynamicIntrinsic(JSValue * object,JSValue * ctor)138 uint8_t JSRuntimeInstanceOfDynamicIntrinsic(JSValue *object, JSValue *ctor)
139 {
140 return JSRuntimeInstanceOfDynamic(object, ctor);
141 }
142
JSRuntimeInstanceOfStaticIntrinsic(JSValue * object,EtsClass * clsObj)143 uint8_t JSRuntimeInstanceOfStaticIntrinsic(JSValue *object, EtsClass *clsObj)
144 {
145 return JSRuntimeInstanceOfStatic(object, clsObj);
146 }
147
JSRuntimeInitJSCallClassIntrinsic()148 uint8_t JSRuntimeInitJSCallClassIntrinsic()
149 {
150 return JSRuntimeInitJSCallClass();
151 }
152
JSRuntimeInitJSNewClassIntrinsic()153 uint8_t JSRuntimeInitJSNewClassIntrinsic()
154 {
155 return JSRuntimeInitJSNewClass();
156 }
157
JSRuntimeLoadModuleIntrinsic(EtsString * module)158 JSValue *JSRuntimeLoadModuleIntrinsic(EtsString *module)
159 {
160 return JSRuntimeLoadModule(module);
161 }
162
JSRuntimeStrictEqualIntrinsic(JSValue * lhs,JSValue * rhs)163 uint8_t JSRuntimeStrictEqualIntrinsic(JSValue *lhs, JSValue *rhs)
164 {
165 return JSRuntimeStrictEqual(lhs, rhs);
166 }
167
JSValueToStringIntrinsic(JSValue * object)168 EtsString *JSValueToStringIntrinsic(JSValue *object)
169 {
170 return JSValueToString(object);
171 }
172
JSONStringifyIntrinsic(JSValue * obj)173 EtsString *JSONStringifyIntrinsic(JSValue *obj)
174 {
175 return JSONStringify(obj);
176 }
177
178 // Compiler intrinsics for fast interop
CompilerGetJSNamedPropertyIntrinsic(void * val,void * propName)179 void *CompilerGetJSNamedPropertyIntrinsic(void *val, void *propName)
180 {
181 return CompilerGetJSNamedProperty(val, reinterpret_cast<char *>(propName));
182 }
183
CompilerGetJSPropertyIntrinsic(void * val,void * prop)184 void *CompilerGetJSPropertyIntrinsic(void *val, void *prop)
185 {
186 return CompilerGetJSProperty(val, prop);
187 }
188
CompilerGetJSElementIntrinsic(void * val,int32_t index)189 void *CompilerGetJSElementIntrinsic(void *val, int32_t index)
190 {
191 return CompilerGetJSElement(val, index);
192 }
193
CompilerJSCallCheckIntrinsic(void * fn)194 void *CompilerJSCallCheckIntrinsic(void *fn)
195 {
196 return CompilerJSCallCheck(fn);
197 }
198
CompilerJSCallFunctionIntrinsic(void * obj,void * fn,uint32_t argc,void * args)199 void *CompilerJSCallFunctionIntrinsic(void *obj, void *fn, uint32_t argc, void *args)
200 {
201 return CompilerJSCallFunction<true>(obj, fn, argc, args);
202 }
203
CompilerJSCallVoidFunctionIntrinsic(void * obj,void * fn,uint32_t argc,void * args)204 void CompilerJSCallVoidFunctionIntrinsic(void *obj, void *fn, uint32_t argc, void *args)
205 {
206 CompilerJSCallFunction<false>(obj, fn, argc, args);
207 }
208
CompilerJSNewInstanceIntrinsic(void * fn,uint32_t argc,void * args)209 void *CompilerJSNewInstanceIntrinsic(void *fn, uint32_t argc, void *args)
210 {
211 return CompilerJSNewInstance(fn, argc, args);
212 }
213
CompilerConvertVoidToLocalIntrinsic()214 void *CompilerConvertVoidToLocalIntrinsic()
215 {
216 return CompilerConvertVoidToLocal();
217 }
218
219 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
220 #define CONVERT_LOCAL_VALUE(type, cpptype) \
221 /* CC-OFFNXT(G.PRE.02) part name */ \
222 void *CompilerConvert##type##ToLocalIntrinsic(cpptype etsVal) \
223 { \
224 /* CC-OFFNXT(G.PRE.05) code generation */ \
225 return ConvertToLocal<JSConvert##type>(etsVal); \
226 } \
227 \
228 cpptype CompilerConvertLocalTo##type##Intrinsic(void *val) \
229 { \
230 /* CC-OFFNXT(G.PRE.05) code generation */ \
231 return ConvertFromLocal<JSConvert##type>(val); \
232 }
233
CONVERT_LOCAL_VALUE(U1,uint8_t)234 CONVERT_LOCAL_VALUE(U1, uint8_t)
235 CONVERT_LOCAL_VALUE(U8, uint8_t)
236 CONVERT_LOCAL_VALUE(I8, int8_t)
237 CONVERT_LOCAL_VALUE(U16, uint16_t)
238 CONVERT_LOCAL_VALUE(I16, int16_t)
239 CONVERT_LOCAL_VALUE(U32, uint32_t)
240 CONVERT_LOCAL_VALUE(I32, int32_t)
241 CONVERT_LOCAL_VALUE(U64, uint64_t)
242 CONVERT_LOCAL_VALUE(I64, int64_t)
243 CONVERT_LOCAL_VALUE(F32, float)
244 CONVERT_LOCAL_VALUE(F64, double)
245 CONVERT_LOCAL_VALUE(JSValue, JSValue *)
246
247 #undef CONVERT_LOCAL_VALUE
248
249 void *CompilerConvertRefTypeToLocalIntrinsic(EtsObject *etsVal)
250 {
251 return CompilerConvertRefTypeToLocal(etsVal);
252 }
CompilerConvertLocalToStringIntrinsic(void * val)253 EtsString *CompilerConvertLocalToStringIntrinsic(void *val)
254 {
255 return CompilerConvertLocalToString(val);
256 }
257
CompilerConvertLocalToRefTypeIntrinsic(void * klassPtr,void * val)258 EtsObject *CompilerConvertLocalToRefTypeIntrinsic(void *klassPtr, void *val)
259 {
260 return CompilerConvertLocalToRefType(klassPtr, val);
261 }
262
CompilerCreateLocalScopeIntrinsic()263 void CompilerCreateLocalScopeIntrinsic()
264 {
265 CreateLocalScope();
266 }
267
CompilerDestroyLocalScopeIntrinsic()268 void CompilerDestroyLocalScopeIntrinsic()
269 {
270 CompilerDestroyLocalScope();
271 }
272
CompilerLoadJSConstantPoolIntrinsic()273 void *CompilerLoadJSConstantPoolIntrinsic()
274 {
275 return CompilerLoadJSConstantPool();
276 }
277
CompilerInitJSCallClassForCtxIntrinsic(void * klass)278 void CompilerInitJSCallClassForCtxIntrinsic(void *klass)
279 {
280 return CompilerInitJSCallClassForCtx(klass);
281 }
282
PromiseInteropResolveIntrinsic(EtsObject * value,EtsLong deferred)283 void PromiseInteropResolveIntrinsic(EtsObject *value, EtsLong deferred)
284 {
285 PromiseInteropResolve(value, deferred);
286 }
287
PromiseInteropRejectIntrinsic(EtsObject * value,EtsLong deferred)288 void PromiseInteropRejectIntrinsic(EtsObject *value, EtsLong deferred)
289 {
290 PromiseInteropReject(value, deferred);
291 }
292
293 } // namespace ark::ets::interop::js::intrinsics
294