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