• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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