• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_GLOBAL_ENV_H
17 #define ECMASCRIPT_GLOBAL_ENV_H
18 
19 #include "ecmascript/js_global_object.h"
20 #include "ecmascript/js_function.h"
21 #include "ecmascript/lexical_env.h"
22 #include "ecmascript/js_handle.h"
23 #include "ecmascript/global_env_constants-inl.h"
24 
25 namespace panda::ecmascript {
26 class JSThread;
27 
28 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
29 #define GLOBAL_ENV_FIELDS(V)                                                                        \
30     /* Function */                                                                                  \
31     V(JSTaggedValue, ObjectFunction, OBJECT_FUNCTION_INDEX)                                         \
32     V(JSTaggedValue, ObjectFunctionPrototype, OBJECT_FUNCTION_PROTOTYPE_INDEX)                      \
33     V(JSTaggedValue, ObjectFunctionPrototypeClass, OBJECT_FUNCTION_PROTOTYPE_CLASS_INDEX)           \
34     V(JSTaggedValue, FunctionFunction, FUNCTION_FUNCTION_INDEX)                                     \
35     V(JSTaggedValue, FunctionPrototype, FUNCTION_PROTOTYPE_INDEX)                                   \
36     V(JSTaggedValue, NumberFunction, NUMBER_FUNCTION_INDEX)                                         \
37     V(JSTaggedValue, BigIntFunction, BIGINT_FUNCTION_INDEX)                                         \
38     V(JSTaggedValue, DateFunction, DATE_FUNCTION_INDEX)                                             \
39     V(JSTaggedValue, BooleanFunction, BOOLEAN_FUNCTION_INDEX)                                       \
40     V(JSTaggedValue, ErrorFunction, ERROR_FUNCTION_INDEX)                                           \
41     V(JSTaggedValue, ArrayFunction, ARRAY_FUNCTION_INDEX)                                           \
42     V(JSTaggedValue, ArrayPrototype, ARRAY_PROTOTYPE_INDEX)                                         \
43     V(JSTaggedValue, TypedArrayFunction, TYPED_ARRAY_FUNCTION_INDEX)                                \
44     V(JSTaggedValue, TypedArrayPrototype, TYPED_ARRAY_PROTOTYPE_INDEX)                              \
45     V(JSTaggedValue, Int8ArrayFunction, INT8_ARRAY_FUNCTION_INDEX)                                  \
46     V(JSTaggedValue, Uint8ArrayFunction, UINT8_ARRAY_FUNCTION_INDEX)                                \
47     V(JSTaggedValue, Uint8ClampedArrayFunction, UINT8_CLAMPED_ARRAY_FUNCTION_INDEX)                 \
48     V(JSTaggedValue, Int16ArrayFunction, INT16_ARRAY_FUNCTION_INDEX)                                \
49     V(JSTaggedValue, Uint16ArrayFunction, UINT16_ARRAY_FUNCTION_INDEX)                              \
50     V(JSTaggedValue, Int32ArrayFunction, INT32_ARRAY_FUNCTION_INDEX)                                \
51     V(JSTaggedValue, Uint32ArrayFunction, UINT32_ARRAY_FUNCTION_INDEX)                              \
52     V(JSTaggedValue, Float32ArrayFunction, FLOAT32_ARRAY_FUNCTION_INDEX)                            \
53     V(JSTaggedValue, Float64ArrayFunction, FLOAT64_ARRAY_FUNCTION_INDEX)                            \
54     V(JSTaggedValue, BigInt64ArrayFunction, BIGINT64_ARRAY_FUNCTION_INDEX)                          \
55     V(JSTaggedValue, BigUint64ArrayFunction, BIGUINT64_ARRAY_FUNCTION_INDEX)                        \
56     V(JSTaggedValue, ArrayBufferFunction, ARRAY_BUFFER_FUNCTION_INDEX)                              \
57     V(JSTaggedValue, SharedArrayBufferFunction, SHAREDARRAY_BUFFER_FUNCTION_INDEX)                  \
58     V(JSTaggedValue, ArrayProtoValuesFunction, ARRAY_PROTO_VALUES_FUNCTION_INDEX)                   \
59     V(JSTaggedValue, DataViewFunction, DATA_VIEW_FUNCTION_INDEX)                                    \
60     V(JSTaggedValue, SymbolFunction, SYMBOL_FUNCTION_INDEX)                                         \
61     V(JSTaggedValue, RangeErrorFunction, RANGE_ERROR_FUNCTION_INDEX)                                \
62     V(JSTaggedValue, ReferenceErrorFunction, REFERENCE_ERROR_FUNCTION_INDEX)                        \
63     V(JSTaggedValue, TypeErrorFunction, TYPE_ERROR_FUNCTION_INDEX)                                  \
64     V(JSTaggedValue, AggregateErrorFunction, AGGREGATE_ERROR_FUNCTION_INDEX)                        \
65     V(JSTaggedValue, URIErrorFunction, URI_ERROR_FUNCTION_INDEX)                                    \
66     V(JSTaggedValue, SyntaxErrorFunction, SYNTAX_ERROR_FUNCTION_INDEX)                              \
67     V(JSTaggedValue, EvalErrorFunction, EVAL_ERROR_FUNCTION_INDEX)                                  \
68     V(JSTaggedValue, OOMErrorFunction, OOM_ERROR_FUNCTION_INDEX)                                    \
69     V(JSTaggedValue, IntlFunction, INTL_FUNCTION_INDEX)                                             \
70     V(JSTaggedValue, LocaleFunction, LOCALE_FUNCTION_INDEX)                                         \
71     V(JSTaggedValue, DateTimeFormatFunction, DATE_TIME_FORMAT_FUNCTION_INDEX)                       \
72     V(JSTaggedValue, RelativeTimeFormatFunction, RELATIVE_TIME_FORMAT_FUNCTION_INDEX)               \
73     V(JSTaggedValue, NumberFormatFunction, NUMBER_FORMAT_FUNCTION_INDEX)                            \
74     V(JSTaggedValue, CollatorFunction, COLLATOR_FUNCTION_INDEX)                                     \
75     V(JSTaggedValue, PluralRulesFunction, PLURAL_RULES_FUNCTION_INDEX)                              \
76     V(JSTaggedValue, DisplayNamesFunction, DISPLAY_NAMES_FUNCTION_INDEX)                            \
77     V(JSTaggedValue, ListFormatFunction, LIST_FORMAT_FUNCTION_INDEX)                                \
78     V(JSTaggedValue, RegExpFunction, REGEXP_FUNCTION_INDEX)                                         \
79     V(JSTaggedValue, BuiltinsSetFunction, BUILTINS_SET_FUNCTION_INDEX)                              \
80     V(JSTaggedValue, SetPrototype, SET_PROTOTYPE_INDEX)                                             \
81     V(JSTaggedValue, BuiltinsMapFunction, BUILTINS_MAP_FUNCTION_INDEX)                              \
82     V(JSTaggedValue, BuiltinsWeakMapFunction, BUILTINS_WEAK_MAP_FUNCTION_INDEX)                     \
83     V(JSTaggedValue, BuiltinsWeakSetFunction, BUILTINS_WEAK_SET_FUNCTION_INDEX)                     \
84     V(JSTaggedValue, BuiltinsWeakRefFunction, BUILTINS_WEAK_REF_FUNCTION_INDEX)                     \
85     V(JSTaggedValue, BuiltinsFinalizationRegistryFunction, BUILTINS_FINALIZATION_REGISTRY_FUNCTION_INDEX) \
86     V(JSTaggedValue, MapPrototype, MAP_PROTOTYPE_INDEX)                                             \
87     V(JSTaggedValue, MathFunction, MATH_FUNCTION_INDEX)                                             \
88     V(JSTaggedValue, AtomicsFunction, ATOMICS_FUNCTION_INDEX)                                       \
89     V(JSTaggedValue, JsonFunction, JSON_FUNCTION_INDEX)                                             \
90     V(JSTaggedValue, StringFunction, STRING_FUNCTION_INDEX)                                         \
91     V(JSTaggedValue, ProxyFunction, PROXY_FUNCTION_INDEX)                                           \
92     V(JSTaggedValue, GeneratorFunctionFunction, GENERATOR_FUNCTION_OFFSET)                          \
93     V(JSTaggedValue, GeneratorFunctionPrototype, GENERATOR_FUNCTION_PROTOTYPE_OFFSET)               \
94     V(JSTaggedValue, AsyncGeneratorFunctionFunction, ASYNC_GENERATOR_FUNCTION_OFFSET)               \
95     V(JSTaggedValue, AsyncGeneratorFunctionPrototype, ASYNC_GENERATOR_FUNCTION_PROTOTYPE_OFFSET)    \
96     V(JSTaggedValue, InitialGenerator, INITIAL_GENERATOR_OFFSET)                                    \
97     V(JSTaggedValue, InitialAsyncGenerator, INITIAL_ASYNC_GENERATOR_OFFSET)                         \
98     V(JSTaggedValue, GeneratorPrototype, GENERATOR_PROTOTYPE_OFFSET)                                \
99     V(JSTaggedValue, AsyncGeneratorPrototype, ASYNC_GENERATOR_PROTOTYPE_OFFSET)                     \
100     V(JSTaggedValue, ReflectFunction, REFLECT_FUNCTION_INDEX)                                       \
101     V(JSTaggedValue, AsyncFunction, ASYNC_FUNCTION_INDEX)                                           \
102     V(JSTaggedValue, AsyncFunctionPrototype, ASYNC_FUNCTION_PROTOTYPE_INDEX)                        \
103     V(JSTaggedValue, JSGlobalObject, JS_GLOBAL_OBJECT_INDEX)                                        \
104     V(JSTaggedValue, HasInstanceSymbol, HASINSTANCE_SYMBOL_INDEX)                                   \
105     V(JSTaggedValue, IsConcatSpreadableSymbol, ISCONCAT_SYMBOL_INDEX)                               \
106     V(JSTaggedValue, ToStringTagSymbol, TOSTRINGTAG_SYMBOL_INDEX)                                   \
107     V(JSTaggedValue, IteratorSymbol, ITERATOR_SYMBOL_INDEX)                                         \
108     V(JSTaggedValue, AsyncIteratorSymbol, ASYNC_ITERATOR_SYMBOL_INDEX)                              \
109     V(JSTaggedValue, MatchSymbol, MATCH_SYMBOL_INDEX)                                               \
110     V(JSTaggedValue, MatchAllSymbol, MATCH_All_SYMBOL_INDEX)                                        \
111     V(JSTaggedValue, ReplaceSymbol, REPLACE_SYMBOL_INDEX)                                           \
112     V(JSTaggedValue, SearchSymbol, SEARCH_SYMBOL_INDEX)                                             \
113     V(JSTaggedValue, SpeciesSymbol, SPECIES_SYMBOL_INDEX)                                           \
114     V(JSTaggedValue, SplitSymbol, SPLIT_SYMBOL_INDEX)                                               \
115     V(JSTaggedValue, ToPrimitiveSymbol, TOPRIMITIVE_SYMBOL_INDEX)                                   \
116     V(JSTaggedValue, UnscopablesSymbol, UNSCOPABLES_SYMBOL_INDEX)                                   \
117     V(JSTaggedValue, HoleySymbol, HOLEY_SYMBOL_OFFSET)                                              \
118     V(JSTaggedValue, ElementICSymbol, ELEMENT_IC_SYMBOL_OFFSET)                                     \
119     V(JSTaggedValue, IteratorPrototype, ITERATOR_PROTOTYPE_INDEX)                                   \
120     V(JSTaggedValue, AsyncIteratorPrototype, ASYNC_ITERATOR_PROTOTYPE_INDEX)                        \
121     V(JSTaggedValue, ForinIteratorPrototype, FORIN_ITERATOR_PROTOTYPE_INDEX)                        \
122     V(JSTaggedValue, ForinIteratorClass, FOR_IN_ITERATOR_CLASS_INDEX)                               \
123     V(JSTaggedValue, StringIterator, STRING_ITERATOR_INDEX)                                         \
124     V(JSTaggedValue, AsyncFromSyncIterator, ASYNC_FROM_SYNC_ITERATOR_INDEX)                         \
125     V(JSTaggedValue, MapIteratorPrototype, MAP_ITERATOR_PROTOTYPE_INDEX)                            \
126     V(JSTaggedValue, SetIteratorPrototype, SET_ITERATOR_PROTOTYPE_INDEX)                            \
127     V(JSTaggedValue, RegExpIteratorPrototype, REGEXP_ITERATOR_PROTOTYPE_INDEX)                      \
128     V(JSTaggedValue, ArrayIteratorPrototype, ARRAY_ITERATOR_PROTOTYPE_INDEX)                        \
129     V(JSTaggedValue, StringIteratorPrototype, STRING_ITERATOR_PROTOTYPE_INDEX)                      \
130     V(JSTaggedValue, AsyncFromSyncIteratorPrototype, ASYNC_FROM_SYNC_ITERATOR_PROTOTYPE_INDEX)      \
131     /* SymbolTable *RegisterSymbols */                                                              \
132     V(JSTaggedValue, RegisterSymbols, SYMBOLS_INDEX)                                                \
133     V(JSTaggedValue, ThrowTypeError, THROW_TYPE_ERROR_INDEX)                                        \
134     V(JSTaggedValue, PromiseFunction, PROMISE_FUNCTION_INDEX)                                       \
135     V(JSTaggedValue, PromiseReactionJob, PROMISE_REACTION_JOB_INDEX)                                \
136     V(JSTaggedValue, PromiseResolveThenableJob, PROMISE_REACTION_THENABLE_JOB_INDEX)                \
137     V(JSTaggedValue, DynamicImportJob, DYNAMIC_IMPORT_JOB_INDEX)                                    \
138     V(JSTaggedValue, TemplateMap, TEMPLATE_MAP_INDEX)                                               \
139     V(JSTaggedValue, FunctionClassWithProto, FUNCTION_CLASS_WITH_PROTO)                             \
140     V(JSTaggedValue, FunctionClassWithoutProto, FUNCTION_CLASS_WITHOUT_PROTO)                       \
141     V(JSTaggedValue, FunctionClassWithoutName, FUNCTION_CLASS_WITHOUT_NAME)                         \
142     V(JSTaggedValue, ArgumentsClass, ARGUMENTS_CLASS)                                               \
143     V(JSTaggedValue, ArgumentsCallerAccessor, ARGUMENTS_CALLER_ACCESSOR)                            \
144     V(JSTaggedValue, ArgumentsCalleeAccessor, ARGUMENTS_CALLEE_ACCESSOR)                            \
145     V(JSTaggedValue, AsyncFunctionClass, ASYNC_FUNCTION_CLASS)                                      \
146     V(JSTaggedValue, AsyncAwaitStatusFunctionClass, ASYNC_AWAIT_STATUS_FUNCTION_CLASS)              \
147     V(JSTaggedValue, PromiseReactionFunctionClass, PROMISE_REACTION_FUNCTION_CLASS)                 \
148     V(JSTaggedValue, PromiseExecutorFunctionClass, PROMISE_EXECUTOR_FUNCTION_CLASS)                 \
149     V(JSTaggedValue, GeneratorFunctionClass, GENERATOR_FUNCTION_CLASS)                              \
150     V(JSTaggedValue, AsyncGeneratorFunctionClass, ASYNC_GENERATOR_FUNCTION_CLASS)                   \
151     V(JSTaggedValue, PromiseAllResolveElementFunctionClass, PROMISE_ALL_RESOLVE_ELEMENT_FUNC_CLASS) \
152     V(JSTaggedValue, PromiseAnyRejectElementFunctionClass, PROMISE_ANY_REJECT_ELEMENT_FUNC_CLASS)   \
153     V(JSTaggedValue, PromiseAllSettledElementFunctionClass, PROMISE_ALL_SETTLED_ELEMENT_FUNC_CLASS) \
154     V(JSTaggedValue, PromiseFinallyFunctionClass, PROMISE_FINALLY_FUNC_CLASS)                       \
155     V(JSTaggedValue, PromiseValueThunkOrThrowerFunctionClass, PROMISE_VALUE_THUNK_OR_THROWER_FUNCTION_CLASS) \
156     V(JSTaggedValue, AsyncGeneratorResNextRetProRstFtnClass,                                        \
157       ASYNC_GENERATOR_RESUME_NEXT_RETURN_PROCESSOR_RST_FTN_CLASS)                                   \
158     V(JSTaggedValue, AsyncFromSyncIterUnwarpClass, ASYNC_FROM_SYNC_ITER_UNWARP_CLASS)                   \
159     V(JSTaggedValue, ProxyRevocFunctionClass, PROXY_REVOC_FUNCTION_CLASS)                           \
160     V(JSTaggedValue, NativeErrorFunctionClass, NATIVE_ERROR_FUNCTION_CLASS)                         \
161     V(JSTaggedValue, SpecificTypedArrayFunctionClass, SPERCIFIC_TYPED_ARRAY_FUNCTION_CLASS)         \
162     V(JSTaggedValue, ConstructorFunctionClass, CONSTRUCTOR_FUNCTION_CLASS)                          \
163     V(JSTaggedValue, NormalFunctionClass, NORMAL_FUNCTION_CLASS)                                    \
164     V(JSTaggedValue, JSIntlBoundFunctionClass, JS_INTL_BOUND_FUNCTION_CLASS)                        \
165     V(JSTaggedValue, NumberFormatLocales, NUMBER_FORMAT_LOCALES_INDEX)                              \
166     V(JSTaggedValue, DateTimeFormatLocales, DATE_TIMEFORMAT_LOCALES_INDEX)                          \
167     V(JSTaggedValue, ListFormatLocales, LIST_FORMAT_LOCALES_INDEX)                                  \
168     V(JSTaggedValue, GlobalRecord, GLOBAL_RECORD)                                                   \
169     V(JSTaggedValue, ModuleNamespaceClass, MODULENAMESPACE_CLASS)                                   \
170     V(JSTaggedValue, ObjectLiteralHClassCache, OBJECT_LITERAL_HCLASS_CACHE)                         \
171     V(JSTaggedValue, WeakRefKeepObjects, WEAK_REF_KEEP_OBJECTS)                                     \
172     V(JSTaggedValue, FinRegLists, FIN_REG_LISTS)                                                    \
173     V(JSTaggedValue, AttachSymbol, ATTACH_SYMBOL_INDEX)                                             \
174     V(JSTaggedValue, DetachSymbol, DETACH_SYMBOL_INDEX)                                             \
175     V(JSTaggedValue, CjsModuleFunction, CJS_MODULE_FUNCTION_INDEX)                                  \
176     V(JSTaggedValue, CjsExportsFunction, CJS_EXPORTS_FUNCTION_INDEX)                                \
177     V(JSTaggedValue, CjsRequireFunction, CJS_REQUIRE_FUNCTION_INDEX)                                \
178     V(JSTaggedValue, GlobalPatch, GLOBAL_PATCH)                                                     \
179     V(JSTaggedValue, ExportOfScript, DEFAULT_EXPORT_OF_SCRIPT)
180 
181 class GlobalEnv : public TaggedObject {
182 public:
GetGlobalObject()183     JSTaggedValue GetGlobalObject() const
184     {
185         return GetJSGlobalObject().GetTaggedValue();
186     }
187 
ComputeObjectAddress(size_t index)188     uintptr_t ComputeObjectAddress(size_t index) const
189     {
190         return reinterpret_cast<uintptr_t>(this) + HEADER_SIZE + index * JSTaggedValue::TaggedTypeSize();
191     }
192 
GetGlobalEnvObjectByIndex(size_t index)193     JSHandle<JSTaggedValue> GetGlobalEnvObjectByIndex(size_t index) const
194     {
195         ASSERT(index < FINAL_INDEX);
196         uintptr_t address = ComputeObjectAddress(index);
197         JSHandle<JSTaggedValue> result(address);
198         return result;
199     }
200 
GetGlobalEnvFieldSize()201     size_t GetGlobalEnvFieldSize() const
202     {
203         return FINAL_INDEX;
204     }
205 
206     void Init(JSThread *thread);
207 
Cast(TaggedObject * object)208     static GlobalEnv *Cast(TaggedObject *object)
209     {
210         ASSERT(JSTaggedValue(object).IsJSGlobalEnv());
211         return reinterpret_cast<GlobalEnv *>(object);
212     }
213 
214     JSHandle<JSTaggedValue> GetSymbol(JSThread *thread, const JSHandle<JSTaggedValue> &string);
215     JSHandle<JSTaggedValue> GetStringFunctionByName(JSThread *thread, const char *name);
216     JSHandle<JSTaggedValue> GetStringPrototypeFunctionByName(JSThread *thread, const char *name);
217 
218     enum Field {
219 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
220 #define GLOBAL_ENV_SLOT(type, name, index) index,
221         GLOBAL_ENV_FIELDS(GLOBAL_ENV_SLOT)
222 #undef GLOBAL_ENV_SLOT
223         FINAL_INDEX
224     };
225 
226 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
227 #define GLOBAL_ENV_FIELD_ACCESSORS(type, name, index)                                                   \
228     inline JSHandle<type> Get##name() const                                                             \
229     {                                                                                                   \
230         const uintptr_t address =                                                                       \
231             reinterpret_cast<uintptr_t>(this) + HEADER_SIZE + index * JSTaggedValue::TaggedTypeSize();  \
232         JSHandle<type> result(address);                                                                 \
233         return result;                                                                                  \
234     }                                                                                                   \
235     template<typename T>                                                                                \
236     inline void Set##name(const JSThread *thread, JSHandle<T> value, BarrierMode mode = WRITE_BARRIER)  \
237     {                                                                                                   \
238         uint32_t offset = HEADER_SIZE + index * JSTaggedValue::TaggedTypeSize();                        \
239         if (mode == WRITE_BARRIER && value.GetTaggedValue().IsHeapObject()) {                           \
240             Barriers::SetObject<true>(thread, this, offset, value.GetTaggedValue().GetRawData());    \
241         } else {                                                                                        \
242             Barriers::SetPrimitive<JSTaggedType>(this, offset, value.GetTaggedValue().GetRawData()); \
243         }                                                                                               \
244     }                                                                                                   \
245     inline void Set##name(const JSThread *thread, type value, BarrierMode mode = WRITE_BARRIER)         \
246     {                                                                                                   \
247         uint32_t offset = HEADER_SIZE + index * JSTaggedValue::TaggedTypeSize();                        \
248         if (mode == WRITE_BARRIER && value.IsHeapObject()) {                                            \
249             Barriers::SetObject<true>(thread, this, offset, value.GetRawData());                     \
250         } else {                                                                                        \
251             Barriers::SetPrimitive<JSTaggedType>(this, offset, value.GetRawData());                  \
252         }                                                                                               \
253     }
254     GLOBAL_ENV_FIELDS(GLOBAL_ENV_FIELD_ACCESSORS)
255 #undef GLOBAL_ENV_FIELD_ACCESSORS
256 
257     static constexpr size_t HEADER_SIZE = TaggedObjectSize();
258     static constexpr size_t SIZE = HEADER_SIZE + FINAL_INDEX * JSTaggedValue::TaggedTypeSize();
259 
260     DECL_VISIT_OBJECT(HEADER_SIZE, SIZE);
261 
262     DECL_DUMP()
263 };
264 }  // namespace panda::ecmascript
265 
266 #endif  // ECMASCRIPT_GLOBAL_ENV_H
267