1 /* 2 * Copyright (c) 2021-2022 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_H 17 #define ECMASCRIPT_BUILTINS_H 18 19 #include "ecmascript/builtins/builtins_lazy_callback.h" 20 #include "ecmascript/global_env.h" 21 #include "ecmascript/js_function.h" 22 #include "ecmascript/js_handle.h" 23 #include "ecmascript/js_tagged_value.h" 24 #include "ecmascript/js_thread.h" 25 #include "ecmascript/object_factory.h" 26 27 namespace panda::ecmascript { 28 struct ErrorParameter { 29 EcmaEntrypoint nativeConstructor{nullptr}; 30 EcmaEntrypoint nativeMethod{nullptr}; 31 const char *nativePropertyName{nullptr}; 32 JSType nativeJstype{JSType::INVALID}; 33 }; 34 35 enum FunctionLength : uint8_t { ZERO = 0, ONE, TWO, THREE, FOUR }; 36 37 class Builtins { 38 public: 39 Builtins() = default; Builtins(JSThread * thread,ObjectFactory * factory,EcmaVM * vm)40 Builtins(JSThread *thread, ObjectFactory *factory, EcmaVM *vm) 41 : thread_(thread), factory_(factory), vm_(vm) {} 42 ~Builtins() = default; 43 NO_COPY_SEMANTIC(Builtins); 44 NO_MOVE_SEMANTIC(Builtins); 45 46 void Initialize(const JSHandle<GlobalEnv> &env, JSThread *thread, bool lazyInit = false, bool isRealm = false); 47 void InitializeForSnapshot(JSThread *thread); 48 49 private: 50 JSThread *thread_{nullptr}; 51 ObjectFactory *factory_{nullptr}; 52 EcmaVM *vm_{nullptr}; 53 54 JSHandle<JSFunction> NewBuiltinConstructor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 55 EcmaEntrypoint ctorFunc, const char *name, int length, 56 kungfu::BuiltinsStubCSigns::ID builtinId = 57 kungfu::BuiltinsStubCSigns::INVALID) const; 58 59 JSHandle<JSFunction> NewBuiltinCjsCtor(const JSHandle<GlobalEnv> &env, 60 const JSHandle<JSObject> &prototype, EcmaEntrypoint ctorFunc, 61 const char *name, int length) const; 62 63 JSHandle<JSFunction> NewFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &key, 64 EcmaEntrypoint func, int length, 65 kungfu::BuiltinsStubCSigns::ID builtinId = 66 kungfu::BuiltinsStubCSigns::INVALID) const; 67 68 void SetLazyAccessor(const JSHandle<JSObject> &object, const JSHandle<JSTaggedValue> &key, 69 const JSHandle<AccessorData> &accessor) const; 70 71 void InitializeCtor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 72 const JSHandle<JSFunction> &ctor, const char *name, int length) const; 73 74 void InitializeGlobalObject(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject); 75 76 void InitializeFunctionHclassForOptimized(const JSHandle<GlobalEnv> &env) const; 77 78 void InitializeFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &emptyFuncClass) const; 79 80 void InitializeObject(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &objFuncPrototype, 81 const JSHandle<JSObject> &objFunc); 82 83 void InitializeNumber(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject, 84 const JSHandle<JSHClass> &primRefObjClass); 85 86 void InitializeBigInt(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &primRefObjClass) const; 87 88 void InitializeBigIntWithRealm(const JSHandle<GlobalEnv> &realm) const; 89 90 void InitializeDate(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 91 void LazyInitializeDate(const JSHandle<GlobalEnv> &env) const; 92 93 void InitializeBoolean(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &primRefObjClass) const; 94 95 void InitializeSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 96 97 void InitializeSymbolWithRealm(const JSHandle<GlobalEnv> &realm, const JSHandle<JSHClass> &objFuncInstanceHClass); 98 99 void InitializeArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 100 101 void InitializeTypedArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 102 void LazyInitializeTypedArray(const JSHandle<GlobalEnv> &env) const; 103 104 void InitializeInt8Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 105 void LazyInitializeInt8Array(const JSHandle<GlobalEnv> &env) const; 106 107 void InitializeUint8Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 108 void LazyInitializeUint8Array(const JSHandle<GlobalEnv> &env) const; 109 110 void InitializeUint8ClampedArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 111 void LazyInitializeUint8ClampedArray(const JSHandle<GlobalEnv> &env) const; 112 113 void InitializeInt16Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 114 void LazyInitializeInt16Array(const JSHandle<GlobalEnv> &env) const; 115 116 void InitializeUint16Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 117 void LazyInitializeUint16Array(const JSHandle<GlobalEnv> &env) const; 118 119 void InitializeInt32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 120 void LazyInitializeInt32Array(const JSHandle<GlobalEnv> &env) const; 121 122 void InitializeUint32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 123 void LazyInitializeUint32Array(const JSHandle<GlobalEnv> &env) const; 124 125 void InitializeFloat32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 126 void LazyInitializeFloat32Array(const JSHandle<GlobalEnv> &env) const; 127 128 void InitializeFloat64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 129 void LazyInitializeFloat64Array(const JSHandle<GlobalEnv> &env) const; 130 131 void InitializeBigInt64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 132 void LazyInitializeBigInt64Array(const JSHandle<GlobalEnv> &env) const; 133 134 void InitializeBigUint64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 135 void LazyInitializeBigUint64Array(const JSHandle<GlobalEnv> &env) const; 136 137 void InitializeAllTypeError(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 138 139 void InitializeAllTypeErrorWithRealm(const JSHandle<GlobalEnv> &realm) const; 140 141 void InitializeError(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass, 142 const JSType &errorTag) const; 143 144 void SetErrorWithRealm(const JSHandle<GlobalEnv> &realm, const JSType &errorTag) const; 145 146 void InitializeRegExp(const JSHandle<GlobalEnv> &env); 147 148 // for Intl. 149 JSHandle<JSFunction> NewIntlConstructor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 150 EcmaEntrypoint ctorFunc, const char *name, int length); 151 void InitializeIntlCtor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 152 const JSHandle<JSFunction> &ctor, const char *name, int length); 153 void InitializeIntl(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeValue); 154 void InitializeLocale(const JSHandle<GlobalEnv> &env); 155 void InitializeDateTimeFormat(const JSHandle<GlobalEnv> &env); 156 void InitializeRelativeTimeFormat(const JSHandle<GlobalEnv> &env); 157 void InitializeNumberFormat(const JSHandle<GlobalEnv> &env); 158 void InitializeCollator(const JSHandle<GlobalEnv> &env); 159 void InitializePluralRules(const JSHandle<GlobalEnv> &env); 160 void InitializeDisplayNames(const JSHandle<GlobalEnv> &env); 161 void InitializeListFormat(const JSHandle<GlobalEnv> &env); 162 163 void LazyInitializeLocale(const JSHandle<GlobalEnv> &env) const; 164 void LazyInitializeDateTimeFormat(const JSHandle<GlobalEnv> &env) const; 165 void LazyInitializeNumberFormat(const JSHandle<GlobalEnv> &env) const; 166 void LazyInitializeRelativeTimeFormat(const JSHandle<GlobalEnv> &env) const; 167 void LazyInitializeCollator(const JSHandle<GlobalEnv> &env) const; 168 void LazyInitializePluralRules(const JSHandle<GlobalEnv> &env) const; 169 void LazyInitializeDisplayNames(const JSHandle<GlobalEnv> &env) const; 170 void LazyInitializeListFormat(const JSHandle<GlobalEnv> &env) const; 171 172 void GeneralUpdateError(ErrorParameter *error, EcmaEntrypoint constructor, EcmaEntrypoint method, const char *name, 173 JSType type) const; 174 175 void InitializeSet(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 176 void LazyInitializeSet(const JSHandle<GlobalEnv> &env); 177 178 void InitializeMap(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 179 void LazyInitializeMap(const JSHandle<GlobalEnv> &env) const; 180 181 void InitializeWeakMap(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 182 void LazyInitializeWeakMap(const JSHandle<GlobalEnv> &env) const; 183 184 void InitializeWeakSet(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 185 void LazyInitializeWeakSet(const JSHandle<GlobalEnv> &env) const; 186 187 void InitializeWeakRef(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 188 void LazyInitializeWeakRef(const JSHandle<GlobalEnv> &env) const; 189 190 void InitializeFinalizationRegistry(const JSHandle<GlobalEnv> &env, 191 const JSHandle<JSHClass> &objFuncClass) const; 192 void LazyInitializeFinalizationRegistry(const JSHandle<GlobalEnv> &env) const; 193 194 void InitializeMath(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 195 196 void InitializeAtomics(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 197 198 void InitializeJson(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 199 200 void InitializeString(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &primRefObjHClass) const; 201 202 void InitializeIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 203 204 void InitializeRegexpIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 205 206 void InitializeStringIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 207 208 void InitializeAsyncFromSyncIterator(const JSHandle<GlobalEnv> &env, 209 const JSHandle<JSHClass> &iteratorFuncClass) const; 210 211 void InitializeForinIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 212 213 void InitializeMapIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 214 215 void InitializeSetIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 216 217 void InitializeArrayIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 218 219 void InitializeArrayBuffer(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 220 void LazyInitializeArrayBuffer(const JSHandle<GlobalEnv> &env) const; 221 222 void InitializeSharedArrayBuffer(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 223 void LazyInitializeSharedArrayBuffer(const JSHandle<GlobalEnv> &env) const; 224 225 void InitializeDataView(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 226 void LazyInitializeDataView(const JSHandle<GlobalEnv> &env) const; 227 228 void InitializeForPromiseFuncClass(const JSHandle<GlobalEnv> &env); 229 230 void InitializeProxy(const JSHandle<GlobalEnv> &env); 231 232 void InitializeReflect(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 233 234 void InitializeAsyncFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 235 236 void InitializeGeneratorFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 237 238 void InitializeAsyncGeneratorFunction(const JSHandle<GlobalEnv> &env, 239 const JSHandle<JSHClass> &objFuncClass) const; 240 241 void InitializeAsyncGenerator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 242 243 void InitializeAsyncIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 244 245 void InitializeGenerator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 246 247 JSHandle<JSFunction> InitializeExoticConstructor(const JSHandle<GlobalEnv> &env, EcmaEntrypoint ctorFunc, 248 const char *name, int length); 249 250 void InitializePromise(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &promiseFuncClass); 251 252 void InitializePromiseJob(const JSHandle<GlobalEnv> &env); 253 254 void InitializeModuleNamespace(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 255 256 void InitializeCjsModule(const JSHandle<GlobalEnv> &env) const; 257 258 void InitializeCjsExports(const JSHandle<GlobalEnv> &env) const; 259 260 void InitializeCjsRequire(const JSHandle<GlobalEnv> &env) const; 261 262 void InitializeDefaultExportOfScript(const JSHandle<GlobalEnv> &env) const; 263 264 void SetFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, const char *key, 265 EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = 266 kungfu::BuiltinsStubCSigns::INVALID) const; 267 268 void SetFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 269 EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = 270 kungfu::BuiltinsStubCSigns::INVALID) const; 271 272 void SetFuncToObjAndGlobal(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject, 273 const JSHandle<JSObject> &obj, const char *key, EcmaEntrypoint func, int length); 274 275 template<int type = JSSymbol::SYMBOL_DEFAULT_TYPE> 276 void SetFunctionAtSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 277 const JSHandle<JSTaggedValue> &symbol, const char *name, EcmaEntrypoint func, 278 int length) const; 279 280 void SetStringTagSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, const char *key) const; 281 JSHandle<JSTaggedValue> CreateGetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, const char *name, 282 int length) const; 283 284 void SetConstant(const JSHandle<JSObject> &obj, const char *key, JSTaggedValue value) const; 285 286 void SetGlobalThis(const JSHandle<JSObject> &obj, const char *key, const JSHandle<JSTaggedValue> &globalValue); 287 288 void SetAttribute(const JSHandle<JSObject> &obj, const char *key, const char *value) const; 289 290 void SetNoneAttributeProperty(const JSHandle<JSObject> &obj, const char *key, 291 const JSHandle<JSTaggedValue> &value) const; 292 293 void StrictModeForbiddenAccessCallerArguments(const JSHandle<GlobalEnv> &env, 294 const JSHandle<JSObject> &prototype) const; 295 296 JSHandle<JSTaggedValue> CreateSetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, const char *name, 297 int length); 298 void SetArgumentsSharedAccessor(const JSHandle<GlobalEnv> &env); 299 void SetAccessor(const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 300 const JSHandle<JSTaggedValue> &getter, const JSHandle<JSTaggedValue> &setter) const; 301 void SetGetter(const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 302 const JSHandle<JSTaggedValue> &getter) const; 303 JSHandle<JSObject> InitializeArkTools(const JSHandle<GlobalEnv> &env) const; 304 void InitializeGlobalRegExp(JSHandle<JSObject> &obj) const; 305 // Using to initialize jsapi container 306 JSHandle<JSObject> InitializeArkPrivate(const JSHandle<GlobalEnv> &env) const; 307 void SetConstantObject(const JSHandle<JSObject> &obj, const char *key, JSHandle<JSTaggedValue> &value) const; 308 void SetFrozenFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, const char *key, 309 EcmaEntrypoint func, int length) const; 310 void SetNonConstantObject(const JSHandle<JSObject> &obj, const char *key, JSHandle<JSTaggedValue> &value) const; 311 312 friend class builtins::BuiltinsLazyCallback; 313 }; 314 } // namespace panda::ecmascript 315 #endif // ECMASCRIPT_BUILTINS_H 316