• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 #ifndef ECMASCRIPT_BUILTINS_BUILTINS_ARK_TOOLS_H
17 #define ECMASCRIPT_BUILTINS_BUILTINS_ARK_TOOLS_H
18 
19 #include "ecmascript/base/builtins_base.h"
20 #include "ecmascript/js_thread.h"
21 
22 // List of functions in ArkTools, extension of ArkTS engine.
23 // V(name, func, length, stubIndex)
24 // where BuiltinsArkTools::func refers to the native implementation of ArkTools[name].
25 //       kungfu::BuiltinsStubCSigns::stubIndex refers to the builtin stub index, or INVALID if no stub available.
26 #define BUILTIN_ARK_TOOLS_FUNCTIONS_COMMON(V)                                             \
27     V("compareHClass",                  CompareHClass,                  2, INVALID)       \
28     V("dumpHClass",                     DumpHClass,                     1, INVALID)       \
29     V("excutePendingJob",               ExcutePendingJob,               0, INVALID)       \
30     V("forceFullGC",                    ForceFullGC,                    0, INVALID)       \
31     V("getHClass",                      GetHClass,                      1, INVALID)       \
32     V("getLexicalEnv",                  GetLexicalEnv,                  1, INVALID)       \
33     V("hasTSSubtyping",                 HasTSSubtyping,                 1, INVALID)       \
34     V("isSlicedString",                 IsSlicedString,                 1, INVALID)       \
35     V("hiddenStackSourceFile",          HiddenStackSourceFile,          0, INVALID)       \
36     V("hintGC",                         HintGC,                         0, INVALID)       \
37     V("isNotHoleProperty",              IsNotHoleProperty,              2, INVALID)       \
38     V("isPrototype",                    IsPrototype,                    1, INVALID)       \
39     V("isRegExpReplaceDetectorValid",   IsRegExpReplaceDetectorValid,   0, INVALID)       \
40     V("isSymbolIteratorDetectorValid",  IsSymbolIteratorDetectorValid,  1, INVALID)       \
41     V("isTSHClass",                     IsTSHClass,                     1, INVALID)       \
42     V("pgoAssertType",                  PGOAssertType,                  2, INVALID)       \
43     V("print",                          ObjectDump,                     0, INVALID)       \
44     V("removeAOTFlag",                  RemoveAOTFlag,                  1, INVALID)       \
45     V("timeInUs",                       TimeInUs,                       0, INVALID)       \
46     V("getElementsKind",                GetElementsKind,                1, INVALID)       \
47     V("isAOTCompiled",                  IsAOTCompiled,                  1, INVALID)       \
48     V("isAOTDeoptimized",               IsAOTDeoptimized,               1, INVALID)       \
49     V("printTypedOpProfilerAndReset",   PrintTypedOpProfilerAndReset,   1, INVALID)       \
50     V("isOnHeap",                       IsOnHeap,                       1, INVALID)       \
51 
52 #define BUILTIN_ARK_TOOLS_FUNCTIONS_REGRESS(V)                                                                \
53     V("prepareFunctionForOptimization",            PrepareFunctionForOptimization,            1, INVALID)     \
54     V("optimizeFunctionOnNextCall",                OptimizeFunctionOnNextCall,                1, INVALID)     \
55     V("optimizeMaglevOnNextCall",                  OptimizeMaglevOnNextCall,                  1, INVALID)     \
56     V("deoptimizeFunction",                        DeoptimizeFunction,                        1, INVALID)     \
57     V("optimizeOsr",                               OptimizeOsr,                               1, INVALID)     \
58     V("neverOptimizeFunction",                     NeverOptimizeFunction,                     1, INVALID)     \
59     V("heapObjectVerify",                          HeapObjectVerify,                          1, INVALID)     \
60     V("disableOptimizationFinalization",           DisableOptimizationFinalization,           0, INVALID)     \
61     V("deoptimizeNow",                             DeoptimizeNow,                             0, INVALID)     \
62     V("deoptimize_now",                            DeoptimizeNow,                             0, INVALID)     \
63     V("waitForBackgroundOptimization",             WaitForBackgroundOptimization,             0, INVALID)     \
64     V("gc",                                        Gc,                                        0, INVALID)     \
65     V("toLength",                                  ToLength,                                  1, INVALID)     \
66     V("hasHoleyElements",                          HasHoleyElements,                          1, INVALID)     \
67     V("hasDictionaryElements",                     HasDictionaryElements,                     1, INVALID)     \
68     V("hasSmiElements",                            HasSmiElements,                            1, INVALID)     \
69     V("hasDoubleElements",                         HasDoubleElements,                         1, INVALID)     \
70     V("hasObjectElements",                         HasObjectElements,                         1, INVALID)     \
71     V("arrayBufferDetach",                         ArrayBufferDetach,                         1, INVALID)     \
72     V("haveSameMap",                               HaveSameMap,                               2, INVALID)     \
73     V("createPrivateSymbol",                       CreatePrivateSymbol,                       1, INVALID)     \
74     V("isArray",                                   IsArray,                                   1, INVALID)     \
75     V("createDataProperty",                        CreateDataProperty,                        3, INVALID)     \
76     V("functionGetInferredName",                   FunctionGetInferredName,                   1, INVALID)     \
77     V("stringLessThan",                            StringLessThan,                            2, INVALID)     \
78     V("stringMaxLength",                           StringMaxLength,                           0, INVALID)     \
79     V("arrayBufferMaxByteLength",                  ArrayBufferMaxByteLength,                  0, INVALID)     \
80     V("typedArrayMaxLength",                       TypedArrayMaxLength,                       0, INVALID)     \
81     V("maxSmi",                                    MaxSmi,                                    0, INVALID)     \
82     V("is64Bit",                                   Is64Bit,                                   0, INVALID)     \
83     V("finalizeOptimization",                      FinalizeOptimization,                      0, INVALID)     \
84     V("ensureFeedbackVectorForFunction",           EnsureFeedbackVectorForFunction,           1, INVALID)     \
85     V("compileBaseline",                           CompileBaseline,                           1, INVALID)     \
86     V("debugGetLoadedScriptIds",                   DebugGetLoadedScriptIds,                   0, INVALID)     \
87     V("toFastProperties",                          ToFastProperties,                          1, INVALID)     \
88     V("abortJS",                                   AbortJS,                                   1, INVALID)     \
89     V("internalizeString",                         InternalizeString,                         1, INVALID)     \
90     V("handleDebuggerStatement",                   HandleDebuggerStatement,                   0, INVALID)     \
91     V("setAllocationTimeout",                      SetAllocationTimeout,                      0, INVALID)     \
92     V("hasFastProperties",                         HasFastProperties,                         1, INVALID)     \
93     V("hasOwnConstDataProperty",                   HasOwnConstDataProperty,                   2, INVALID)     \
94     V("getHoleNaNUpper",                           GetHoleNaNUpper,                           0, INVALID)     \
95     V("getHoleNaNLower",                           GetHoleNaNLower,                           0, INVALID)     \
96     V("systemBreak",                               SystemBreak,                               0, INVALID)     \
97     V("scheduleBreak",                             ScheduleBreak,                             0, INVALID)     \
98     V("enqueueMicrotask",                          EnqueueMicrotask,                          1, INVALID)     \
99     V("debugPrint",                                DebugPrint,                                1, INVALID)     \
100     V("getOptimizationStatus",                     GetOptimizationStatus,                     1, INVALID)     \
101     V("getUndetectable",                           GetUndetectable,                           0, INVALID)     \
102     V("setKeyedProperty",                          SetKeyedProperty,                          3, INVALID)     \
103     V("disassembleFunction",                       DisassembleFunction,                       1, INVALID)     \
104     V("tryMigrateInstance",                        TryMigrateInstance,                        1, INVALID)     \
105     V("inLargeObjectSpace",                        InLargeObjectSpace,                        1, INVALID)     \
106     V("performMicrotaskCheckpoint",                PerformMicrotaskCheckpoint,                0, INVALID)     \
107     V("isJSReceiver",                              IsJSReceiver,                              1, INVALID)     \
108     V("isDictPropertyConstTrackingEnabled",        IsDictPropertyConstTrackingEnabled,        1, INVALID)     \
109     V("allocateHeapNumber",                        AllocateHeapNumber,                        1, INVALID)     \
110     V("constructConsString",                       ConstructConsString,                       1, INVALID)     \
111     V("completeInobjectSlackTracking",             CompleteInobjectSlackTracking,             1, INVALID)     \
112     V("normalizeElements",                         NormalizeElements,                         1, INVALID)     \
113     V("call",                                      Call,                                      2, INVALID)     \
114     V("debugPushPromise",                          DebugPushPromise,                          1, INVALID)     \
115     V("setForceSlowPath",                          SetForceSlowPath,                          1, INVALID)     \
116     V("notifyContextDisposed",                     NotifyContextDisposed,                     0, INVALID)     \
117     V("optimizeObjectForAddingMultipleProperties", OptimizeObjectForAddingMultipleProperties, 2, INVALID)     \
118     V("isBeingInterpreted",                        IsBeingInterpreted,                        0, INVALID)     \
119     V("clearFunctionFeedback",                     ClearFunctionFeedback,                     1, INVALID)
120 
121 
122 #ifdef ECMASCRIPT_SUPPORT_CPUPROFILER
123 #define BUILTIN_ARK_TOOLS_FUNCTIONS_CPUPROFILER(V)      \
124     V("startCpuProf", StartCpuProfiler, 0, INVALID)     \
125     V("stopCpuProf",  StopCpuProfiler,  0, INVALID)
126 #else
127 #define BUILTIN_ARK_TOOLS_FUNCTIONS_CPUPROFILER(V) // Nothing
128 #endif
129 
130 #define BUILTIN_ARK_TOOLS_FUNCTIONS(V)                  \
131     BUILTIN_ARK_TOOLS_FUNCTIONS_COMMON(V)               \
132     BUILTIN_ARK_TOOLS_FUNCTIONS_CPUPROFILER(V)          \
133     BUILTIN_ARK_TOOLS_FUNCTIONS_REGRESS(V)
134 
135 namespace panda::ecmascript::builtins {
136 class BuiltinsArkTools : public base::BuiltinsBase {
137 public:
138     // Make sure the enable-ark-tools has been opened before use it
139     // Use through ArkTools.print(msg, [obj1, obj2, ... objn]) in js
140     static JSTaggedValue ObjectDump(EcmaRuntimeCallInfo *info);
141 
142     static JSTaggedValue ExcutePendingJob(EcmaRuntimeCallInfo *info);
143 
144     static JSTaggedValue GetLexicalEnv(EcmaRuntimeCallInfo *info);
145 
146     static JSTaggedValue CompareHClass(EcmaRuntimeCallInfo *info);
147 
148     static JSTaggedValue DumpHClass(EcmaRuntimeCallInfo *info);
149 
150     // return whether the hclass used for object is created by static ts type
151     static JSTaggedValue IsTSHClass(EcmaRuntimeCallInfo *info);
152 
153     static JSTaggedValue GetHClass(EcmaRuntimeCallInfo *info);
154 
155     static JSTaggedValue HasTSSubtyping(EcmaRuntimeCallInfo *info);
156 
157     static JSTaggedValue IsSlicedString(EcmaRuntimeCallInfo *info);
158 
159     static JSTaggedValue IsNotHoleProperty(EcmaRuntimeCallInfo *info);
160 
161     static JSTaggedValue ForceFullGC(EcmaRuntimeCallInfo *info);
162 
163     static JSTaggedValue HintGC(EcmaRuntimeCallInfo *info);
164 
165     static JSTaggedValue HiddenStackSourceFile(EcmaRuntimeCallInfo *info);
166 
167     static JSTaggedValue RemoveAOTFlag(EcmaRuntimeCallInfo *info);
168 
169 #if defined(ECMASCRIPT_SUPPORT_CPUPROFILER)
170     static JSTaggedValue StartCpuProfiler(EcmaRuntimeCallInfo *info);
171 
172     static JSTaggedValue StopCpuProfiler(EcmaRuntimeCallInfo *info);
173 
174     static std::string GetProfileName();
175 
176     static bool CreateFile(std::string &fileName);
177 #endif
178     // ArkTools.isPrototype(object)
179     static JSTaggedValue IsPrototype(EcmaRuntimeCallInfo *info);
180 
181     // ArkTools.isAOTCompiledAssert(func)
182     static JSTaggedValue IsAOTCompiled(EcmaRuntimeCallInfo *info);
183 
184     // ArkTools.isAOTCompiledAssert(func)
185     static JSTaggedValue IsAOTDeoptimized(EcmaRuntimeCallInfo *info);
186 
187     // ArkTools.isOnHeap(object)
188     static JSTaggedValue IsOnHeap(EcmaRuntimeCallInfo *info);
189 
190     // ArkTools.GetElementsKind(array)
191     static JSTaggedValue GetElementsKind(EcmaRuntimeCallInfo *info);
192 
193     static JSTaggedValue PrintTypedOpProfilerAndReset(EcmaRuntimeCallInfo *info);
194 
195     static JSTaggedValue IsRegExpReplaceDetectorValid(EcmaRuntimeCallInfo *info);
196 
197     static JSTaggedValue IsSymbolIteratorDetectorValid(EcmaRuntimeCallInfo *info);
198 
199     static JSTaggedValue TimeInUs(EcmaRuntimeCallInfo *info);
200 
201     static JSTaggedValue PrepareFunctionForOptimization(EcmaRuntimeCallInfo *info);
202 
203     static JSTaggedValue OptimizeFunctionOnNextCall(EcmaRuntimeCallInfo *info);
204 
205     static JSTaggedValue OptimizeMaglevOnNextCall(EcmaRuntimeCallInfo *info);
206 
207     static JSTaggedValue DeoptimizeFunction(EcmaRuntimeCallInfo *info);
208 
209     static JSTaggedValue OptimizeOsr(EcmaRuntimeCallInfo *info);
210 
211     static JSTaggedValue NeverOptimizeFunction(EcmaRuntimeCallInfo *info);
212 
213     static JSTaggedValue HeapObjectVerify(EcmaRuntimeCallInfo *info);
214 
215     static JSTaggedValue DisableOptimizationFinalization(EcmaRuntimeCallInfo *info);
216 
217     static JSTaggedValue DeoptimizeNow(EcmaRuntimeCallInfo *info);
218 
219     static JSTaggedValue WaitForBackgroundOptimization(EcmaRuntimeCallInfo *info);
220 
221     static JSTaggedValue Gc(EcmaRuntimeCallInfo *info);
222 
223     static JSTaggedValue PGOAssertType(EcmaRuntimeCallInfo *info);
224 
225     static JSTaggedValue ToLength(EcmaRuntimeCallInfo *info);
226 
227     static JSTaggedValue HasHoleyElements(EcmaRuntimeCallInfo *info);
228 
229     static JSTaggedValue HasDictionaryElements(EcmaRuntimeCallInfo *info);
230 
231     static JSTaggedValue HasSmiElements(EcmaRuntimeCallInfo *info);
232 
233     static JSTaggedValue HasDoubleElements(EcmaRuntimeCallInfo *info);
234 
235     static JSTaggedValue HasObjectElements(EcmaRuntimeCallInfo *info);
236 
237     static JSTaggedValue ArrayBufferDetach(EcmaRuntimeCallInfo *info);
238 
239     static JSTaggedValue HaveSameMap(EcmaRuntimeCallInfo *info);
240 
241     static JSTaggedValue CreatePrivateSymbol(EcmaRuntimeCallInfo *info);
242 
243     static JSTaggedValue IsArray(EcmaRuntimeCallInfo *info);
244 
245     static JSTaggedValue CreateDataProperty(EcmaRuntimeCallInfo *info);
246 
247     static JSTaggedValue FunctionGetInferredName(EcmaRuntimeCallInfo *info);
248 
249     static JSTaggedValue StringLessThan(EcmaRuntimeCallInfo *info);
250 
251     static JSTaggedValue StringMaxLength(EcmaRuntimeCallInfo *info);
252 
253     static JSTaggedValue ArrayBufferMaxByteLength(EcmaRuntimeCallInfo *info);
254 
255     static JSTaggedValue TypedArrayMaxLength(EcmaRuntimeCallInfo *info);
256 
257     static JSTaggedValue MaxSmi(EcmaRuntimeCallInfo *info);
258 
259     static JSTaggedValue Is64Bit(EcmaRuntimeCallInfo *info);
260 
261     static JSTaggedValue FinalizeOptimization(EcmaRuntimeCallInfo *info);
262 
263     static JSTaggedValue EnsureFeedbackVectorForFunction(EcmaRuntimeCallInfo *info);
264 
265     static JSTaggedValue CompileBaseline(EcmaRuntimeCallInfo *info);
266 
267     static JSTaggedValue DebugGetLoadedScriptIds(EcmaRuntimeCallInfo *info);
268 
269     static JSTaggedValue ToFastProperties(EcmaRuntimeCallInfo *info);
270 
271     static JSTaggedValue AbortJS(EcmaRuntimeCallInfo *info);
272 
273     static JSTaggedValue InternalizeString(EcmaRuntimeCallInfo *info);
274 
275     static JSTaggedValue HandleDebuggerStatement(EcmaRuntimeCallInfo *info);
276 
277     static JSTaggedValue SetAllocationTimeout(EcmaRuntimeCallInfo *info);
278 
279     static JSTaggedValue HasFastProperties(EcmaRuntimeCallInfo *info);
280 
281     static JSTaggedValue HasOwnConstDataProperty(EcmaRuntimeCallInfo *info);
282 
283     static JSTaggedValue GetHoleNaNUpper(EcmaRuntimeCallInfo *info);
284 
285     static JSTaggedValue GetHoleNaNLower(EcmaRuntimeCallInfo *info);
286 
287     static JSTaggedValue SystemBreak(EcmaRuntimeCallInfo *info);
288 
289     static JSTaggedValue ScheduleBreak(EcmaRuntimeCallInfo *info);
290 
291     static JSTaggedValue EnqueueMicrotask(EcmaRuntimeCallInfo *info);
292 
293     static JSTaggedValue DebugPrint(EcmaRuntimeCallInfo *info);
294 
295     static JSTaggedValue GetOptimizationStatus(EcmaRuntimeCallInfo *info);
296 
297     static JSTaggedValue GetUndetectable(EcmaRuntimeCallInfo *info);
298 
299     static JSTaggedValue SetKeyedProperty(EcmaRuntimeCallInfo *info);
300 
301     static JSTaggedValue DisassembleFunction(EcmaRuntimeCallInfo *info);
302 
303     static JSTaggedValue TryMigrateInstance(EcmaRuntimeCallInfo *info);
304 
305     static JSTaggedValue InLargeObjectSpace(EcmaRuntimeCallInfo *info);
306 
307     static JSTaggedValue PerformMicrotaskCheckpoint(EcmaRuntimeCallInfo *info);
308 
309     static JSTaggedValue IsJSReceiver(EcmaRuntimeCallInfo *info);
310 
311     static JSTaggedValue IsDictPropertyConstTrackingEnabled(EcmaRuntimeCallInfo *info);
312 
313     static JSTaggedValue AllocateHeapNumber(EcmaRuntimeCallInfo *info);
314 
315     static JSTaggedValue ConstructConsString(EcmaRuntimeCallInfo *info);
316 
317     static JSTaggedValue CompleteInobjectSlackTracking(EcmaRuntimeCallInfo *info);
318 
319     static JSTaggedValue NormalizeElements(EcmaRuntimeCallInfo *info);
320 
321     static JSTaggedValue Call(EcmaRuntimeCallInfo *info);
322 
323     static JSTaggedValue DebugPushPromise(EcmaRuntimeCallInfo *info);
324 
325     static JSTaggedValue SetForceSlowPath(EcmaRuntimeCallInfo *info);
326 
327     static JSTaggedValue NotifyContextDisposed(EcmaRuntimeCallInfo *info);
328 
329     static JSTaggedValue OptimizeObjectForAddingMultipleProperties(EcmaRuntimeCallInfo *info);
330 
331     static JSTaggedValue IsBeingInterpreted(EcmaRuntimeCallInfo *info);
332 
333     static JSTaggedValue ClearFunctionFeedback(EcmaRuntimeCallInfo *info);
334 
GetArkToolsFunctions()335     static Span<const base::BuiltinFunctionEntry> GetArkToolsFunctions()
336     {
337         return Span<const base::BuiltinFunctionEntry>(ARK_TOOLS_FUNCTIONS);
338     }
339 
340 private:
341 #define BUILTINS_ARK_TOOLS_FUNCTION_ENTRY(name, method, length, id) \
342     base::BuiltinFunctionEntry::Create(name, BuiltinsArkTools::method, length, kungfu::BuiltinsStubCSigns::id),
343 
344     static constexpr std::array ARK_TOOLS_FUNCTIONS  = {
345         BUILTIN_ARK_TOOLS_FUNCTIONS(BUILTINS_ARK_TOOLS_FUNCTION_ENTRY)
346     };
347 #undef BUILTINS_ARK_TOOLS_FUNCTION_ENTRY
348 };
349 }  // namespace panda::ecmascript::builtins
350 
351 #endif  // ECMASCRIPT_BUILTINS_BUILTINS_ARK_TOOLS_H
352