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_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 "object_factory.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 explicit Builtins() = default; 40 ~Builtins() = default; 41 NO_COPY_SEMANTIC(Builtins); 42 NO_MOVE_SEMANTIC(Builtins); 43 44 void Initialize(const JSHandle<GlobalEnv> &env, 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) const; 53 54 JSHandle<JSFunction> NewFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &key, 55 EcmaEntrypoint func, int length) const; 56 57 void InitializeCtor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 58 const JSHandle<JSFunction> &ctor, const char *name, int length) const; 59 60 void InitializeGlobalObject(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject); 61 62 void InitializeFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &emptyFuncDynclass) const; 63 64 void InitializeObject(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &objFuncPrototype, 65 const JSHandle<JSObject> &objFunc); 66 67 void InitializeNumber(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject, 68 const JSHandle<JSHClass> &primRefObjDynclass); 69 70 void InitializeBigInt(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 71 void InitializeDate(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 72 73 void InitializeBoolean(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &primRefObjDynclass) const; 74 75 void InitializeSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 76 77 void InitializeSymbolWithRealm(const JSHandle<GlobalEnv> &realm, const JSHandle<JSHClass> &objFuncInstanceDynclass); 78 79 void InitializeArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 80 81 void InitializeTypedArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 82 83 void InitializeInt8Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 84 85 void InitializeUint8Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 86 87 void InitializeUint8ClampedArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 88 89 void InitializeInt16Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 90 91 void InitializeUint16Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 92 93 void InitializeInt32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 94 95 void InitializeUint32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 96 97 void InitializeFloat32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 98 99 void InitializeFloat64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 100 101 void InitializeAllTypeError(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 102 103 void InitializeAllTypeErrorWithRealm(const JSHandle<GlobalEnv> &realm) const; 104 105 void InitializeError(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass, 106 const JSType &errorTag) const; 107 108 void SetErrorWithRealm(const JSHandle<GlobalEnv> &realm, const JSType &errorTag) const; 109 110 void InitializeRegExp(const JSHandle<GlobalEnv> &env); 111 112 // for Intl. 113 JSHandle<JSFunction> NewIntlConstructor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 114 EcmaEntrypoint ctorFunc, const char *name, int length); 115 void InitializeIntlCtor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 116 const JSHandle<JSFunction> &ctor, const char *name, int length); 117 void InitializeIntl(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeValue); 118 void InitializeLocale(const JSHandle<GlobalEnv> &env); 119 void InitializeDateTimeFormat(const JSHandle<GlobalEnv> &env); 120 void InitializeRelativeTimeFormat(const JSHandle<GlobalEnv> &env); 121 void InitializeNumberFormat(const JSHandle<GlobalEnv> &env); 122 void InitializeCollator(const JSHandle<GlobalEnv> &env); 123 void InitializePluralRules(const JSHandle<GlobalEnv> &env); 124 125 void GeneralUpdateError(ErrorParameter *error, EcmaEntrypoint constructor, EcmaEntrypoint method, const char *name, 126 JSType type) const; 127 128 void InitializeSet(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 129 130 void InitializeMap(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 131 132 void InitializeWeakMap(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 133 134 void InitializeWeakSet(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 135 136 void InitializeMath(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 137 138 void InitializeJson(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 139 140 void InitializeString(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &primRefObjDynclass) const; 141 142 void InitializeIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 143 144 void InitializeStringIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncDynclass) const; 145 146 void InitializeForinIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncDynclass) const; 147 148 void InitializeMapIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncDynclass) const; 149 150 void InitializeSetIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncDynclass) const; 151 152 void InitializeArrayIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncDynclass) const; 153 154 void InitializeArrayBuffer(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 155 156 void InitializeDataView(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 157 158 void InitializeProxy(const JSHandle<GlobalEnv> &env); 159 160 void InitializeReflect(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 161 162 void InitializeAsyncFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 163 164 void InitializeGeneratorFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 165 166 void InitializeGenerator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncDynclass) const; 167 168 JSHandle<JSFunction> InitializeExoticConstructor(const JSHandle<GlobalEnv> &env, EcmaEntrypoint ctorFunc, 169 const char *name, int length); 170 171 void InitializePromise(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &promiseFuncDynclass); 172 173 void InitializePromiseJob(const JSHandle<GlobalEnv> &env); 174 175 void SetFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, const char *key, 176 EcmaEntrypoint func, int length) const; 177 178 void SetFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 179 EcmaEntrypoint func, int length) const; 180 181 void SetFuncToObjAndGlobal(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject, 182 const JSHandle<JSObject> &obj, const char *key, EcmaEntrypoint func, int length); 183 184 template<int type = JSSymbol::SYMBOL_DEFAULT_TYPE> 185 void SetFunctionAtSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 186 const JSHandle<JSTaggedValue> &symbol, const char *name, EcmaEntrypoint func, 187 int length) const; 188 189 void SetStringTagSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, const char *key) const; 190 JSHandle<JSTaggedValue> CreateGetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, const char *name, 191 int length) const; 192 193 void SetConstant(const JSHandle<JSObject> &obj, const char *key, JSTaggedValue value) const; 194 195 void SetGlobalThis(const JSHandle<JSObject> &obj, const char *key, const JSHandle<JSTaggedValue> &globalValue); 196 197 void SetAttribute(const JSHandle<JSObject> &obj, const char *key, const char *value) const; 198 199 void SetNoneAttributeProperty(const JSHandle<JSObject> &obj, const char *key, 200 const JSHandle<JSTaggedValue> &value) const; 201 202 void StrictModeForbiddenAccessCallerArguments(const JSHandle<GlobalEnv> &env, 203 const JSHandle<JSObject> &prototype) const; 204 205 JSHandle<JSTaggedValue> CreateSetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, const char *name, 206 int length); 207 void SetArgumentsSharedAccessor(const JSHandle<GlobalEnv> &env); 208 void SetAccessor(const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 209 const JSHandle<JSTaggedValue> &getter, const JSHandle<JSTaggedValue> &setter) const; 210 void SetGetter(const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 211 const JSHandle<JSTaggedValue> &getter) const; 212 JSHandle<JSObject> InitializeArkTools(const JSHandle<GlobalEnv> &env) const; 213 // Using to initialize jsapi container 214 JSHandle<JSObject> InitializeArkPrivate(const JSHandle<GlobalEnv> &env) const; 215 void SetConstantObject(const JSHandle<JSObject> &obj, const char *key, JSHandle<JSTaggedValue> &value) const; 216 void SetFrozenFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, const char *key, 217 EcmaEntrypoint func, int length) const; 218 }; 219 } // namespace panda::ecmascript 220 #endif // ECMASCRIPT_BUILTINS_H 221