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