14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci 164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_BUILTIN_ENTRIES_H 174514f5e3Sopenharmony_ci#define ECMASCRIPT_BUILTIN_ENTRIES_H 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include <cstddef> 204514f5e3Sopenharmony_ci#include <cstdint> 214514f5e3Sopenharmony_ci#include <string> 224514f5e3Sopenharmony_ci 234514f5e3Sopenharmony_ci#include "ecmascript/ecma_string.h" 244514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h" 254514f5e3Sopenharmony_ci 264514f5e3Sopenharmony_cinamespace panda::ecmascript { 274514f5e3Sopenharmony_cienum class BuiltinType : int32_t { 284514f5e3Sopenharmony_ci BT_FUNCTION, 294514f5e3Sopenharmony_ci BT_RANGEERROR, 304514f5e3Sopenharmony_ci BT_ERROR, 314514f5e3Sopenharmony_ci BT_OBJECT, 324514f5e3Sopenharmony_ci BT_SYNTAXERROR, 334514f5e3Sopenharmony_ci BT_TYPEERROR, 344514f5e3Sopenharmony_ci BT_REFERENCEERROR, 354514f5e3Sopenharmony_ci BT_URIERROR, 364514f5e3Sopenharmony_ci BT_SYMBOL, 374514f5e3Sopenharmony_ci BT_EVALERROR, 384514f5e3Sopenharmony_ci BT_NUMBER, 394514f5e3Sopenharmony_ci BT_PARSEFLOAT, 404514f5e3Sopenharmony_ci BT_DATE, 414514f5e3Sopenharmony_ci BT_BOOLEAN, 424514f5e3Sopenharmony_ci BT_BIGINT, 434514f5e3Sopenharmony_ci BT_PARSEINT, 444514f5e3Sopenharmony_ci BT_WEAKMAP, 454514f5e3Sopenharmony_ci BT_REGEXP, 464514f5e3Sopenharmony_ci BT_SET, 474514f5e3Sopenharmony_ci BT_MAP, 484514f5e3Sopenharmony_ci BT_WEAKREF, 494514f5e3Sopenharmony_ci BT_WEAKSET, 504514f5e3Sopenharmony_ci BT_FINALIZATIONREGISTRY, 514514f5e3Sopenharmony_ci BT_ARRAY, 524514f5e3Sopenharmony_ci BT_UINT8CLAMPEDARRAY, 534514f5e3Sopenharmony_ci BT_UINT8ARRAY, 544514f5e3Sopenharmony_ci BT_TYPEDARRAY, 554514f5e3Sopenharmony_ci BT_INT8ARRAY, 564514f5e3Sopenharmony_ci BT_UINT16ARRAY, 574514f5e3Sopenharmony_ci BT_UINT32ARRAY, 584514f5e3Sopenharmony_ci BT_INT16ARRAY, 594514f5e3Sopenharmony_ci BT_INT32ARRAY, 604514f5e3Sopenharmony_ci BT_FLOAT32ARRAY, 614514f5e3Sopenharmony_ci BT_FLOAT64ARRAY, 624514f5e3Sopenharmony_ci BT_BIGINT64ARRAY, 634514f5e3Sopenharmony_ci BT_BIGUINT64ARRAY, 644514f5e3Sopenharmony_ci BT_SHAREDARRAYBUFFER, 654514f5e3Sopenharmony_ci BT_DATAVIEW, 664514f5e3Sopenharmony_ci BT_STRING, 674514f5e3Sopenharmony_ci BT_ARRAYBUFFER, 684514f5e3Sopenharmony_ci BT_EVAL, 694514f5e3Sopenharmony_ci BT_ISFINITE, 704514f5e3Sopenharmony_ci BT_ARKPRIVATE, 714514f5e3Sopenharmony_ci BT_PRINT, 724514f5e3Sopenharmony_ci BT_DECODEURI, 734514f5e3Sopenharmony_ci BT_DECODEURICOMPONENT, 744514f5e3Sopenharmony_ci BT_ISNAN, 754514f5e3Sopenharmony_ci BT_ENCODEURI, 764514f5e3Sopenharmony_ci BT_ENCODEURICOMPONENT, 774514f5e3Sopenharmony_ci BT_MATH, 784514f5e3Sopenharmony_ci BT_JSON, 794514f5e3Sopenharmony_ci BT_ATOMICS, 804514f5e3Sopenharmony_ci BT_REFLECT, 814514f5e3Sopenharmony_ci BT_PROMISE, 824514f5e3Sopenharmony_ci BT_PROXY, 834514f5e3Sopenharmony_ci BT_GENERATORFUNCTION, 844514f5e3Sopenharmony_ci BT_INTL, 854514f5e3Sopenharmony_ci NUMBER_OF_BUILTINS 864514f5e3Sopenharmony_ci}; 874514f5e3Sopenharmony_ci 884514f5e3Sopenharmony_cistruct BuiltinEntries { 894514f5e3Sopenharmony_ci static constexpr size_t COUNT = static_cast<size_t>(BuiltinType::NUMBER_OF_BUILTINS); 904514f5e3Sopenharmony_ci struct BuiltinEntry { 914514f5e3Sopenharmony_ci JSTaggedValue box_ {JSTaggedValue::Hole()}; 924514f5e3Sopenharmony_ci JSTaggedValue hClass_ {JSTaggedValue::Hole()}; 934514f5e3Sopenharmony_ci } builtin_[COUNT]; 944514f5e3Sopenharmony_ci 954514f5e3Sopenharmony_ci uintptr_t Begin() 964514f5e3Sopenharmony_ci { 974514f5e3Sopenharmony_ci return reinterpret_cast<uintptr_t>(builtin_); 984514f5e3Sopenharmony_ci } 994514f5e3Sopenharmony_ci 1004514f5e3Sopenharmony_ci uintptr_t End() 1014514f5e3Sopenharmony_ci { 1024514f5e3Sopenharmony_ci return reinterpret_cast<uintptr_t>(builtin_ + COUNT); 1034514f5e3Sopenharmony_ci } 1044514f5e3Sopenharmony_ci 1054514f5e3Sopenharmony_ci void ClearByIndex(size_t index, JSTaggedValue value) 1064514f5e3Sopenharmony_ci { 1074514f5e3Sopenharmony_ci builtin_[index].box_ = value; 1084514f5e3Sopenharmony_ci builtin_[index].hClass_ = JSTaggedValue::Hole(); 1094514f5e3Sopenharmony_ci } 1104514f5e3Sopenharmony_ci 1114514f5e3Sopenharmony_ci static constexpr size_t SizeArch32 = sizeof(uint64_t) * 2 * COUNT; 1124514f5e3Sopenharmony_ci static constexpr size_t SizeArch64 = sizeof(uint64_t) * 2 * COUNT; 1134514f5e3Sopenharmony_ci}; 1144514f5e3Sopenharmony_ciSTATIC_ASSERT_EQ_ARCH(sizeof(BuiltinEntries), BuiltinEntries::SizeArch32, BuiltinEntries::SizeArch64); 1154514f5e3Sopenharmony_ci 1164514f5e3Sopenharmony_ciclass BuiltinIndex { 1174514f5e3Sopenharmony_cipublic: 1184514f5e3Sopenharmony_ci BuiltinIndex(const BuiltinIndex&) = delete; 1194514f5e3Sopenharmony_ci BuiltinIndex& operator=(const BuiltinIndex&) = delete; 1204514f5e3Sopenharmony_ci 1214514f5e3Sopenharmony_ci static const size_t NOT_FOUND = -1; 1224514f5e3Sopenharmony_ci 1234514f5e3Sopenharmony_ci static BuiltinIndex& GetInstance() 1244514f5e3Sopenharmony_ci { 1254514f5e3Sopenharmony_ci static BuiltinIndex instance; 1264514f5e3Sopenharmony_ci return instance; 1274514f5e3Sopenharmony_ci } 1284514f5e3Sopenharmony_ci 1294514f5e3Sopenharmony_ci size_t GetBuiltinBoxOffset(JSTaggedValue key) const 1304514f5e3Sopenharmony_ci { 1314514f5e3Sopenharmony_ci auto index = GetBuiltinIndex(key); 1324514f5e3Sopenharmony_ci ASSERT(index != NOT_FOUND); 1334514f5e3Sopenharmony_ci return sizeof(JSTaggedValue) * (index * 2); // 2 is size of BuiltinEntries 1344514f5e3Sopenharmony_ci } 1354514f5e3Sopenharmony_ci 1364514f5e3Sopenharmony_ci size_t GetBuiltinBoxOffset(size_t index) 1374514f5e3Sopenharmony_ci { 1384514f5e3Sopenharmony_ci return sizeof(JSTaggedValue) * (index * 2); // 2 is size of BuiltinEntries 1394514f5e3Sopenharmony_ci } 1404514f5e3Sopenharmony_ci 1414514f5e3Sopenharmony_ci size_t GetBuiltinIndex(JSTaggedValue key) const 1424514f5e3Sopenharmony_ci { 1434514f5e3Sopenharmony_ci auto ecmaString = EcmaString::Cast(key.GetTaggedObject()); 1444514f5e3Sopenharmony_ci auto str = std::string(ConvertToString(ecmaString)); 1454514f5e3Sopenharmony_ci return GetBuiltinIndex(str); 1464514f5e3Sopenharmony_ci } 1474514f5e3Sopenharmony_ci 1484514f5e3Sopenharmony_ci size_t GetBuiltinIndex(const std::string& key) const 1494514f5e3Sopenharmony_ci { 1504514f5e3Sopenharmony_ci auto it = builtinIndex_.find(key); 1514514f5e3Sopenharmony_ci if (it == builtinIndex_.end()) { 1524514f5e3Sopenharmony_ci return NOT_FOUND; 1534514f5e3Sopenharmony_ci } else { 1544514f5e3Sopenharmony_ci return static_cast<size_t>(it->second); 1554514f5e3Sopenharmony_ci } 1564514f5e3Sopenharmony_ci } 1574514f5e3Sopenharmony_ci 1584514f5e3Sopenharmony_ci auto GetBuiltinKeys() -> std::vector<std::string> const 1594514f5e3Sopenharmony_ci { 1604514f5e3Sopenharmony_ci std::vector<std::string> keys; 1614514f5e3Sopenharmony_ci for (const auto& it: builtinIndex_) { 1624514f5e3Sopenharmony_ci keys.emplace_back(it.first); 1634514f5e3Sopenharmony_ci } 1644514f5e3Sopenharmony_ci return keys; 1654514f5e3Sopenharmony_ci } 1664514f5e3Sopenharmony_ci 1674514f5e3Sopenharmony_ciprivate: 1684514f5e3Sopenharmony_ci std::unordered_map<std::string, BuiltinType> builtinIndex_ = { 1694514f5e3Sopenharmony_ci {"Function", BuiltinType::BT_FUNCTION}, 1704514f5e3Sopenharmony_ci {"RangeError", BuiltinType::BT_RANGEERROR}, 1714514f5e3Sopenharmony_ci {"Error", BuiltinType::BT_ERROR}, 1724514f5e3Sopenharmony_ci {"Object", BuiltinType::BT_OBJECT}, 1734514f5e3Sopenharmony_ci {"SyntaxError", BuiltinType::BT_SYNTAXERROR}, 1744514f5e3Sopenharmony_ci {"TypeError", BuiltinType::BT_TYPEERROR}, 1754514f5e3Sopenharmony_ci {"ReferenceError", BuiltinType::BT_REFERENCEERROR}, 1764514f5e3Sopenharmony_ci {"URIError", BuiltinType::BT_URIERROR}, 1774514f5e3Sopenharmony_ci {"Symbol", BuiltinType::BT_SYMBOL}, 1784514f5e3Sopenharmony_ci {"EvalError", BuiltinType::BT_EVALERROR}, 1794514f5e3Sopenharmony_ci {"Number", BuiltinType::BT_NUMBER}, 1804514f5e3Sopenharmony_ci {"parseFloat", BuiltinType::BT_PARSEFLOAT}, 1814514f5e3Sopenharmony_ci {"Date", BuiltinType::BT_DATE}, 1824514f5e3Sopenharmony_ci {"Boolean", BuiltinType::BT_BOOLEAN}, 1834514f5e3Sopenharmony_ci {"BigInt", BuiltinType::BT_BIGINT}, 1844514f5e3Sopenharmony_ci {"parseInt", BuiltinType::BT_PARSEINT}, 1854514f5e3Sopenharmony_ci {"WeakMap", BuiltinType::BT_WEAKMAP}, 1864514f5e3Sopenharmony_ci {"RegExp", BuiltinType::BT_REGEXP}, 1874514f5e3Sopenharmony_ci {"Set", BuiltinType::BT_SET}, 1884514f5e3Sopenharmony_ci {"Map", BuiltinType::BT_MAP}, 1894514f5e3Sopenharmony_ci {"WeakRef", BuiltinType::BT_WEAKREF}, 1904514f5e3Sopenharmony_ci {"WeakSet", BuiltinType::BT_WEAKSET}, 1914514f5e3Sopenharmony_ci {"FinalizationRegistry", BuiltinType::BT_FINALIZATIONREGISTRY}, 1924514f5e3Sopenharmony_ci {"Array", BuiltinType::BT_ARRAY}, 1934514f5e3Sopenharmony_ci {"Uint8ClampedArray", BuiltinType::BT_UINT8CLAMPEDARRAY}, 1944514f5e3Sopenharmony_ci {"Uint8Array", BuiltinType::BT_UINT8ARRAY}, 1954514f5e3Sopenharmony_ci {"TypedArray", BuiltinType::BT_TYPEDARRAY}, 1964514f5e3Sopenharmony_ci {"Int8Array", BuiltinType::BT_INT8ARRAY}, 1974514f5e3Sopenharmony_ci {"Uint16Array", BuiltinType::BT_UINT16ARRAY}, 1984514f5e3Sopenharmony_ci {"Uint32Array", BuiltinType::BT_UINT32ARRAY}, 1994514f5e3Sopenharmony_ci {"Int16Array", BuiltinType::BT_INT16ARRAY}, 2004514f5e3Sopenharmony_ci {"Int32Array", BuiltinType::BT_INT32ARRAY}, 2014514f5e3Sopenharmony_ci {"Float32Array", BuiltinType::BT_FLOAT32ARRAY}, 2024514f5e3Sopenharmony_ci {"Float64Array", BuiltinType::BT_FLOAT64ARRAY}, 2034514f5e3Sopenharmony_ci {"BigInt64Array", BuiltinType::BT_BIGINT64ARRAY}, 2044514f5e3Sopenharmony_ci {"BigUint64Array", BuiltinType::BT_BIGUINT64ARRAY}, 2054514f5e3Sopenharmony_ci {"SharedArrayBuffer", BuiltinType::BT_SHAREDARRAYBUFFER}, 2064514f5e3Sopenharmony_ci {"DataView", BuiltinType::BT_DATAVIEW}, 2074514f5e3Sopenharmony_ci {"String", BuiltinType::BT_STRING}, 2084514f5e3Sopenharmony_ci {"ArrayBuffer", BuiltinType::BT_ARRAYBUFFER}, 2094514f5e3Sopenharmony_ci {"eval", BuiltinType::BT_EVAL}, 2104514f5e3Sopenharmony_ci {"isFinite", BuiltinType::BT_ISFINITE}, 2114514f5e3Sopenharmony_ci {"ArkPrivate", BuiltinType::BT_ARKPRIVATE}, 2124514f5e3Sopenharmony_ci {"print", BuiltinType::BT_PRINT}, 2134514f5e3Sopenharmony_ci {"decodeURI", BuiltinType::BT_DECODEURI}, 2144514f5e3Sopenharmony_ci {"decodeURIComponent", BuiltinType::BT_DECODEURICOMPONENT}, 2154514f5e3Sopenharmony_ci {"isNaN", BuiltinType::BT_ISNAN}, 2164514f5e3Sopenharmony_ci {"encodeURI", BuiltinType::BT_ENCODEURI}, 2174514f5e3Sopenharmony_ci {"encodeURIComponent", BuiltinType::BT_ENCODEURICOMPONENT}, 2184514f5e3Sopenharmony_ci {"Math", BuiltinType::BT_MATH}, 2194514f5e3Sopenharmony_ci {"JSON", BuiltinType::BT_JSON}, 2204514f5e3Sopenharmony_ci {"Atomics", BuiltinType::BT_ATOMICS}, 2214514f5e3Sopenharmony_ci {"Reflect", BuiltinType::BT_REFLECT}, 2224514f5e3Sopenharmony_ci {"Promise", BuiltinType::BT_PROMISE}, 2234514f5e3Sopenharmony_ci {"Proxy", BuiltinType::BT_PROXY}, 2244514f5e3Sopenharmony_ci {"GeneratorFunction", BuiltinType::BT_GENERATORFUNCTION}, 2254514f5e3Sopenharmony_ci {"Intl", BuiltinType::BT_INTL}, 2264514f5e3Sopenharmony_ci }; 2274514f5e3Sopenharmony_ci 2284514f5e3Sopenharmony_ci BuiltinIndex() {} 2294514f5e3Sopenharmony_ci}; // class BuiltinIndex 2304514f5e3Sopenharmony_ci} // namespace panda::ecmascript 2314514f5e3Sopenharmony_ci#endif // ECMASCRIPT_BUILTIN_ENTRIES_H 232