1 /* 2 * Copyright (c) 2023 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_BUILTIN_ENTRIES_H 17 #define ECMASCRIPT_BUILTIN_ENTRIES_H 18 19 #include <cstddef> 20 #include <cstdint> 21 #include <string> 22 #include <unordered_map> 23 24 #include "ecmascript/js_tagged_value.h" 25 26 namespace panda::ecmascript { 27 enum class BuiltinType : int32_t { 28 BT_FUNCTION, 29 BT_RANGEERROR, 30 BT_ERROR, 31 BT_OBJECT, 32 BT_SYNTAXERROR, 33 BT_TYPEERROR, 34 BT_REFERENCEERROR, 35 BT_URIERROR, 36 BT_SYMBOL, 37 BT_EVALERROR, 38 BT_NUMBER, 39 BT_PARSEFLOAT, 40 BT_DATE, 41 BT_BOOLEAN, 42 BT_BIGINT, 43 BT_PARSEINT, 44 BT_WEAKMAP, 45 BT_REGEXP, 46 BT_SET, 47 BT_MAP, 48 BT_WEAKREF, 49 BT_WEAKSET, 50 BT_FINALIZATIONREGISTRY, 51 BT_ARRAY, 52 BT_UINT8CLAMPEDARRAY, 53 BT_UINT8ARRAY, 54 BT_TYPEDARRAY, 55 BT_INT8ARRAY, 56 BT_UINT16ARRAY, 57 BT_UINT32ARRAY, 58 BT_INT16ARRAY, 59 BT_INT32ARRAY, 60 BT_FLOAT32ARRAY, 61 BT_FLOAT64ARRAY, 62 BT_BIGINT64ARRAY, 63 BT_BIGUINT64ARRAY, 64 BT_SHAREDARRAYBUFFER, 65 BT_DATAVIEW, 66 BT_STRING, 67 BT_ARRAYBUFFER, 68 BT_EVAL, 69 BT_ISFINITE, 70 BT_ARKPRIVATE, 71 BT_PRINT, 72 BT_DECODEURI, 73 BT_DECODEURICOMPONENT, 74 BT_ISNAN, 75 BT_ENCODEURI, 76 BT_ENCODEURICOMPONENT, 77 BT_MATH, 78 BT_JSON, 79 BT_ATOMICS, 80 BT_REFLECT, 81 BT_PROMISE, 82 BT_PROXY, 83 BT_GENERATORFUNCTION, 84 BT_INTL, 85 NUMBER_OF_BUILTINS 86 }; 87 88 struct BuiltinEntries { 89 static constexpr size_t COUNT = static_cast<size_t>(BuiltinType::NUMBER_OF_BUILTINS); 90 struct BuiltinEntry { 91 JSTaggedValue box_ {JSTaggedValue::Hole()}; 92 JSTaggedValue hClass_ {JSTaggedValue::Hole()}; 93 } builtin_[COUNT]; 94 BeginBuiltinEntries95 uintptr_t Begin() 96 { 97 return reinterpret_cast<uintptr_t>(builtin_); 98 } 99 EndBuiltinEntries100 uintptr_t End() 101 { 102 return reinterpret_cast<uintptr_t>(builtin_ + COUNT); 103 } 104 ClearByIndexBuiltinEntries105 void ClearByIndex(size_t index, JSTaggedValue value) 106 { 107 builtin_[index].box_ = value; 108 builtin_[index].hClass_ = JSTaggedValue::Hole(); 109 } 110 111 static constexpr size_t SizeArch32 = sizeof(uint64_t) * 2 * COUNT; 112 static constexpr size_t SizeArch64 = sizeof(uint64_t) * 2 * COUNT; 113 }; 114 STATIC_ASSERT_EQ_ARCH(sizeof(BuiltinEntries), BuiltinEntries::SizeArch32, BuiltinEntries::SizeArch64); 115 116 class BuiltinIndex { 117 public: 118 BuiltinIndex(const BuiltinIndex&) = delete; 119 BuiltinIndex& operator=(const BuiltinIndex&) = delete; 120 121 static const size_t NOT_FOUND = -1; 122 GetInstance()123 static BuiltinIndex& GetInstance() 124 { 125 static BuiltinIndex instance; 126 return instance; 127 } 128 GetBuiltinBoxOffset(const JSThread * thread,JSTaggedValue key)129 size_t GetBuiltinBoxOffset(const JSThread *thread, JSTaggedValue key) const 130 { 131 auto index = GetBuiltinIndex(thread, key); 132 ASSERT(index != NOT_FOUND); 133 return sizeof(JSTaggedValue) * (index * 2); // 2 is size of BuiltinEntries 134 } 135 GetBuiltinBoxOffset(size_t index)136 size_t GetBuiltinBoxOffset(size_t index) 137 { 138 return sizeof(JSTaggedValue) * (index * 2); // 2 is size of BuiltinEntries 139 } 140 141 size_t PUBLIC_API GetBuiltinIndex(const JSThread *thread, JSTaggedValue key) const; 142 size_t PUBLIC_API GetBuiltinIndex(const std::string& key) const; 143 144 auto GetBuiltinKeys() -> std::vector<std::string> const 145 { 146 std::vector<std::string> keys; 147 for (const auto& it: builtinIndex_) { 148 keys.emplace_back(it.first); 149 } 150 return keys; 151 } 152 153 private: 154 std::unordered_map<std::string, BuiltinType> builtinIndex_ = { 155 {"Function", BuiltinType::BT_FUNCTION}, 156 {"RangeError", BuiltinType::BT_RANGEERROR}, 157 {"Error", BuiltinType::BT_ERROR}, 158 {"Object", BuiltinType::BT_OBJECT}, 159 {"SyntaxError", BuiltinType::BT_SYNTAXERROR}, 160 {"TypeError", BuiltinType::BT_TYPEERROR}, 161 {"ReferenceError", BuiltinType::BT_REFERENCEERROR}, 162 {"URIError", BuiltinType::BT_URIERROR}, 163 {"Symbol", BuiltinType::BT_SYMBOL}, 164 {"EvalError", BuiltinType::BT_EVALERROR}, 165 {"Number", BuiltinType::BT_NUMBER}, 166 {"parseFloat", BuiltinType::BT_PARSEFLOAT}, 167 {"Date", BuiltinType::BT_DATE}, 168 {"Boolean", BuiltinType::BT_BOOLEAN}, 169 {"BigInt", BuiltinType::BT_BIGINT}, 170 {"parseInt", BuiltinType::BT_PARSEINT}, 171 {"WeakMap", BuiltinType::BT_WEAKMAP}, 172 {"RegExp", BuiltinType::BT_REGEXP}, 173 {"Set", BuiltinType::BT_SET}, 174 {"Map", BuiltinType::BT_MAP}, 175 {"WeakRef", BuiltinType::BT_WEAKREF}, 176 {"WeakSet", BuiltinType::BT_WEAKSET}, 177 {"FinalizationRegistry", BuiltinType::BT_FINALIZATIONREGISTRY}, 178 {"Array", BuiltinType::BT_ARRAY}, 179 {"Uint8ClampedArray", BuiltinType::BT_UINT8CLAMPEDARRAY}, 180 {"Uint8Array", BuiltinType::BT_UINT8ARRAY}, 181 {"TypedArray", BuiltinType::BT_TYPEDARRAY}, 182 {"Int8Array", BuiltinType::BT_INT8ARRAY}, 183 {"Uint16Array", BuiltinType::BT_UINT16ARRAY}, 184 {"Uint32Array", BuiltinType::BT_UINT32ARRAY}, 185 {"Int16Array", BuiltinType::BT_INT16ARRAY}, 186 {"Int32Array", BuiltinType::BT_INT32ARRAY}, 187 {"Float32Array", BuiltinType::BT_FLOAT32ARRAY}, 188 {"Float64Array", BuiltinType::BT_FLOAT64ARRAY}, 189 {"BigInt64Array", BuiltinType::BT_BIGINT64ARRAY}, 190 {"BigUint64Array", BuiltinType::BT_BIGUINT64ARRAY}, 191 {"SharedArrayBuffer", BuiltinType::BT_SHAREDARRAYBUFFER}, 192 {"DataView", BuiltinType::BT_DATAVIEW}, 193 {"String", BuiltinType::BT_STRING}, 194 {"ArrayBuffer", BuiltinType::BT_ARRAYBUFFER}, 195 {"eval", BuiltinType::BT_EVAL}, 196 {"isFinite", BuiltinType::BT_ISFINITE}, 197 {"ArkPrivate", BuiltinType::BT_ARKPRIVATE}, 198 {"print", BuiltinType::BT_PRINT}, 199 {"decodeURI", BuiltinType::BT_DECODEURI}, 200 {"decodeURIComponent", BuiltinType::BT_DECODEURICOMPONENT}, 201 {"isNaN", BuiltinType::BT_ISNAN}, 202 {"encodeURI", BuiltinType::BT_ENCODEURI}, 203 {"encodeURIComponent", BuiltinType::BT_ENCODEURICOMPONENT}, 204 {"Math", BuiltinType::BT_MATH}, 205 {"JSON", BuiltinType::BT_JSON}, 206 {"Atomics", BuiltinType::BT_ATOMICS}, 207 {"Reflect", BuiltinType::BT_REFLECT}, 208 {"Promise", BuiltinType::BT_PROMISE}, 209 {"Proxy", BuiltinType::BT_PROXY}, 210 {"GeneratorFunction", BuiltinType::BT_GENERATORFUNCTION}, 211 {"Intl", BuiltinType::BT_INTL}, 212 }; 213 BuiltinIndex()214 BuiltinIndex() {} 215 }; // class BuiltinIndex 216 } // namespace panda::ecmascript 217 #endif // ECMASCRIPT_BUILTIN_ENTRIES_H 218