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 #include "ecmascript/snapshot/mem/snapshot_processor.h"
17 
18 #include "ecmascript/builtins/builtins_ark_tools.h"
19 #include "ecmascript/builtins/builtins_array.h"
20 #include "ecmascript/builtins/builtins_arraybuffer.h"
21 #include "ecmascript/builtins/builtins_async_function.h"
22 #include "ecmascript/builtins/builtins_async_generator.h"
23 #include "ecmascript/builtins/builtins_async_iterator.h"
24 #include "ecmascript/builtins/builtins_atomics.h"
25 #include "ecmascript/builtins/builtins_bigint.h"
26 #include "ecmascript/builtins/builtins_boolean.h"
27 #include "ecmascript/builtins/builtins_cjs_exports.h"
28 #include "ecmascript/builtins/builtins_cjs_module.h"
29 #include "ecmascript/builtins/builtins_cjs_require.h"
30 #include "ecmascript/builtins/builtins_dataview.h"
31 #include "ecmascript/builtins/builtins_date.h"
32 #include "ecmascript/builtins/builtins_errors.h"
33 #include "ecmascript/builtins/builtins_finalization_registry.h"
34 #include "ecmascript/builtins/builtins_function.h"
35 #include "ecmascript/builtins/builtins_generator.h"
36 #include "ecmascript/builtins/builtins_global.h"
37 #include "ecmascript/builtins/builtins_iterator.h"
38 #include "ecmascript/builtins/builtins_json.h"
39 #include "ecmascript/builtins/builtins_map.h"
40 #include "ecmascript/builtins/builtins_math.h"
41 #include "ecmascript/builtins/builtins_number.h"
42 #include "ecmascript/builtins/builtins_object.h"
43 #include "ecmascript/builtins/builtins_promise.h"
44 #include "ecmascript/builtins/builtins_promise_handler.h"
45 #include "ecmascript/builtins/builtins_promise_job.h"
46 #include "ecmascript/builtins/builtins_proxy.h"
47 #include "ecmascript/builtins/builtins_reflect.h"
48 #include "ecmascript/builtins/builtins_regexp.h"
49 #include "ecmascript/builtins/builtins_set.h"
50 #include "ecmascript/builtins/builtins_sharedarraybuffer.h"
51 #include "ecmascript/builtins/builtins_string_iterator.h"
52 #include "ecmascript/builtins/builtins_symbol.h"
53 #include "ecmascript/builtins/builtins_typedarray.h"
54 #include "ecmascript/builtins/builtins_weak_map.h"
55 #include "ecmascript/builtins/builtins_weak_ref.h"
56 #include "ecmascript/builtins/builtins_weak_set.h"
57 #include "ecmascript/containers/containers_arraylist.h"
58 #include "ecmascript/containers/containers_deque.h"
59 #include "ecmascript/containers/containers_hashmap.h"
60 #include "ecmascript/containers/containers_hashset.h"
61 #include "ecmascript/containers/containers_lightweightmap.h"
62 #include "ecmascript/containers/containers_lightweightset.h"
63 #include "ecmascript/containers/containers_linked_list.h"
64 #include "ecmascript/containers/containers_list.h"
65 #include "ecmascript/containers/containers_plainarray.h"
66 #include "ecmascript/containers/containers_private.h"
67 #include "ecmascript/containers/containers_queue.h"
68 #include "ecmascript/containers/containers_stack.h"
69 #include "ecmascript/containers/containers_treemap.h"
70 #include "ecmascript/containers/containers_treeset.h"
71 #include "ecmascript/containers/containers_vector.h"
72 #include "ecmascript/containers/containers_bitvector.h"
73 #include "ecmascript/runtime.h"
74 #include "ecmascript/runtime_lock.h"
75 #ifdef ARK_SUPPORT_INTL
76 #include "ecmascript/builtins/builtins_collator.h"
77 #include "ecmascript/builtins/builtins_date_time_format.h"
78 #include "ecmascript/builtins/builtins_displaynames.h"
79 #include "ecmascript/builtins/builtins_intl.h"
80 #include "ecmascript/builtins/builtins_list_format.h"
81 #include "ecmascript/builtins/builtins_locale.h"
82 #include "ecmascript/builtins/builtins_number_format.h"
83 #include "ecmascript/builtins/builtins_plural_rules.h"
84 #include "ecmascript/builtins/builtins_relative_time_format.h"
85 #include "ecmascript/builtins/builtins_segmenter.h"
86 #include "ecmascript/builtins/builtins_segments.h"
87 #include "ecmascript/builtins/builtins_segment_iterator.h"
88 #endif
89 
90 namespace panda::ecmascript {
91 using Number = builtins::BuiltinsNumber;
92 using BuiltinsBigInt = builtins::BuiltinsBigInt;
93 using Object = builtins::BuiltinsObject;
94 using Date = builtins::BuiltinsDate;
95 using Symbol = builtins::BuiltinsSymbol;
96 using Boolean = builtins::BuiltinsBoolean;
97 using BuiltinsMap = builtins::BuiltinsMap;
98 using BuiltinsSet = builtins::BuiltinsSet;
99 using BuiltinsWeakMap = builtins::BuiltinsWeakMap;
100 using BuiltinsWeakSet = builtins::BuiltinsWeakSet;
101 using BuiltinsWeakRef = builtins::BuiltinsWeakRef;
102 using BuiltinsFinalizationRegistry = builtins::BuiltinsFinalizationRegistry;
103 using BuiltinsArray = builtins::BuiltinsArray;
104 using BuiltinsTypedArray = builtins::BuiltinsTypedArray;
105 using BuiltinsIterator = builtins::BuiltinsIterator;
106 using BuiltinsAsyncIterator = builtins::BuiltinsAsyncIterator;
107 using Error = builtins::BuiltinsError;
108 using RangeError = builtins::BuiltinsRangeError;
109 using ReferenceError = builtins::BuiltinsReferenceError;
110 using TypeError = builtins::BuiltinsTypeError;
111 using AggregateError = builtins::BuiltinsAggregateError;
112 using URIError = builtins::BuiltinsURIError;
113 using SyntaxError = builtins::BuiltinsSyntaxError;
114 using EvalError = builtins::BuiltinsEvalError;
115 using OOMError = builtins::BuiltinsOOMError;
116 using ErrorType = base::ErrorType;
117 using Global = builtins::BuiltinsGlobal;
118 using BuiltinsString = builtins::BuiltinsString;
119 using StringIterator = builtins::BuiltinsStringIterator;
120 using RegExp = builtins::BuiltinsRegExp;
121 using Function = builtins::BuiltinsFunction;
122 using Math = builtins::BuiltinsMath;
123 using Atomics = builtins::BuiltinsAtomics;
124 using ArrayBuffer = builtins::BuiltinsArrayBuffer;
125 using SharedArrayBuffer = builtins::BuiltinsSharedArrayBuffer;
126 using Json = builtins::BuiltinsJson;
127 using Proxy = builtins::BuiltinsProxy;
128 using Reflect = builtins::BuiltinsReflect;
129 using AsyncFunction = builtins::BuiltinsAsyncFunction;
130 using GeneratorObject = builtins::BuiltinsGenerator;
131 using AsyncGeneratorObject = builtins::BuiltinsAsyncGenerator;
132 using Promise = builtins::BuiltinsPromise;
133 using BuiltinsPromiseHandler = builtins::BuiltinsPromiseHandler;
134 using BuiltinsPromiseJob = builtins::BuiltinsPromiseJob;
135 using BuiltinsCjsExports = builtins::BuiltinsCjsExports;
136 using BuiltinsCjsModule = builtins::BuiltinsCjsModule;
137 using BuiltinsCjsRequire = builtins::BuiltinsCjsRequire;
138 using ArkTools = builtins::BuiltinsArkTools;
139 using ErrorType = base::ErrorType;
140 using DataView = builtins::BuiltinsDataView;
141 using ArrayList = containers::ContainersArrayList;
142 using HashMap = containers::ContainersHashMap;
143 using HashSet = containers::ContainersHashSet;
144 using LightWeightMap = containers::ContainersLightWeightMap;
145 using LightWeightSet = containers::ContainersLightWeightSet;
146 using TreeMap = containers::ContainersTreeMap;
147 using TreeSet = containers::ContainersTreeSet;
148 using Vector = containers::ContainersVector;
149 using BitVector = containers::ContainersBitVector;
150 using Queue = containers::ContainersQueue;
151 using List = containers::ContainersList;
152 using LinkedList = containers::ContainersLinkedList;
153 using PlainArray = containers::ContainersPlainArray;
154 using Deque = containers::ContainersDeque;
155 using ContainerStack = panda::ecmascript::containers::ContainersStack;
156 using ContainersPrivate = containers::ContainersPrivate;
157 #ifdef ARK_SUPPORT_INTL
158 using DisplayNames = builtins::BuiltinsDisplayNames;
159 using ListFormat = builtins::BuiltinsListFormat;
160 using Intl = builtins::BuiltinsIntl;
161 using Locale = builtins::BuiltinsLocale;
162 using DateTimeFormat = builtins::BuiltinsDateTimeFormat;
163 using NumberFormat = builtins::BuiltinsNumberFormat;
164 using RelativeTimeFormat = builtins::BuiltinsRelativeTimeFormat;
165 using Collator = builtins::BuiltinsCollator;
166 using PluralRules = builtins::BuiltinsPluralRules;
167 using Segmenter = builtins::BuiltinsSegmenter;
168 using Segments = builtins::BuiltinsSegments;
169 #endif
170 
171 // NOLINTNEXTLINE(modernize-avoid-c-arrays)
172 static uintptr_t g_nativeTable[] = {
173     reinterpret_cast<uintptr_t>(nullptr),
174     reinterpret_cast<uintptr_t>(BuiltinsMap::Species),
175     reinterpret_cast<uintptr_t>(StringIterator::Next),
176     reinterpret_cast<uintptr_t>(Function::FunctionPrototypeInvokeSelf),
177     reinterpret_cast<uintptr_t>(Function::FunctionConstructor),
178     reinterpret_cast<uintptr_t>(JSFunction::AccessCallerArgumentsThrowTypeError),
179     reinterpret_cast<uintptr_t>(Function::FunctionPrototypeApply),
180     reinterpret_cast<uintptr_t>(Function::FunctionPrototypeBind),
181     reinterpret_cast<uintptr_t>(Function::FunctionPrototypeCall),
182     reinterpret_cast<uintptr_t>(Function::FunctionPrototypeToString),
183     reinterpret_cast<uintptr_t>(Object::ObjectConstructor),
184     reinterpret_cast<uintptr_t>(Object::FromEntries),
185     reinterpret_cast<uintptr_t>(Error::ErrorConstructor),
186     reinterpret_cast<uintptr_t>(Error::ToString),
187     reinterpret_cast<uintptr_t>(RangeError::RangeErrorConstructor),
188     reinterpret_cast<uintptr_t>(RangeError::ToString),
189     reinterpret_cast<uintptr_t>(ReferenceError::ReferenceErrorConstructor),
190     reinterpret_cast<uintptr_t>(ReferenceError::ToString),
191     reinterpret_cast<uintptr_t>(TypeError::TypeErrorConstructor),
192     reinterpret_cast<uintptr_t>(TypeError::ToString),
193     reinterpret_cast<uintptr_t>(TypeError::ThrowTypeError),
194     reinterpret_cast<uintptr_t>(AggregateError::AggregateErrorConstructor),
195     reinterpret_cast<uintptr_t>(AggregateError::ToString),
196     reinterpret_cast<uintptr_t>(URIError::URIErrorConstructor),
197     reinterpret_cast<uintptr_t>(URIError::ToString),
198     reinterpret_cast<uintptr_t>(SyntaxError::SyntaxErrorConstructor),
199     reinterpret_cast<uintptr_t>(SyntaxError::ToString),
200     reinterpret_cast<uintptr_t>(EvalError::EvalErrorConstructor),
201     reinterpret_cast<uintptr_t>(EvalError::ToString),
202     reinterpret_cast<uintptr_t>(OOMError::OOMErrorConstructor),
203     reinterpret_cast<uintptr_t>(OOMError::ToString),
204     reinterpret_cast<uintptr_t>(Number::NumberConstructor),
205     reinterpret_cast<uintptr_t>(Number::ToExponential),
206     reinterpret_cast<uintptr_t>(Number::ToFixed),
207     reinterpret_cast<uintptr_t>(Number::ToLocaleString),
208     reinterpret_cast<uintptr_t>(Number::ToPrecision),
209     reinterpret_cast<uintptr_t>(Number::ToString),
210     reinterpret_cast<uintptr_t>(Number::ValueOf),
211     reinterpret_cast<uintptr_t>(Number::IsFinite),
212     reinterpret_cast<uintptr_t>(Number::IsInteger),
213     reinterpret_cast<uintptr_t>(Number::IsNaN),
214     reinterpret_cast<uintptr_t>(Number::IsSafeInteger),
215     reinterpret_cast<uintptr_t>(Number::ParseFloat),
216     reinterpret_cast<uintptr_t>(Number::ParseInt),
217     reinterpret_cast<uintptr_t>(Symbol::SymbolConstructor),
218     reinterpret_cast<uintptr_t>(Symbol::For),
219     reinterpret_cast<uintptr_t>(Symbol::KeyFor),
220     reinterpret_cast<uintptr_t>(Symbol::DescriptionGetter),
221     reinterpret_cast<uintptr_t>(Symbol::ToPrimitive),
222     reinterpret_cast<uintptr_t>(Symbol::ToString),
223     reinterpret_cast<uintptr_t>(Symbol::ValueOf),
224     reinterpret_cast<uintptr_t>(Function::FunctionPrototypeHasInstance),
225     reinterpret_cast<uintptr_t>(Date::DateConstructor),
226     reinterpret_cast<uintptr_t>(Date::GetDate),
227     reinterpret_cast<uintptr_t>(Date::GetDay),
228     reinterpret_cast<uintptr_t>(Date::GetFullYear),
229     reinterpret_cast<uintptr_t>(Date::GetHours),
230     reinterpret_cast<uintptr_t>(Date::GetMilliseconds),
231     reinterpret_cast<uintptr_t>(Date::GetMinutes),
232     reinterpret_cast<uintptr_t>(Date::GetMonth),
233     reinterpret_cast<uintptr_t>(Date::GetSeconds),
234     reinterpret_cast<uintptr_t>(Date::GetTime),
235     reinterpret_cast<uintptr_t>(Date::GetTimezoneOffset),
236     reinterpret_cast<uintptr_t>(Date::GetUTCDate),
237     reinterpret_cast<uintptr_t>(Date::GetUTCDay),
238     reinterpret_cast<uintptr_t>(Date::GetUTCFullYear),
239     reinterpret_cast<uintptr_t>(Date::GetUTCHours),
240     reinterpret_cast<uintptr_t>(Date::GetUTCMilliseconds),
241     reinterpret_cast<uintptr_t>(Date::GetUTCMinutes),
242     reinterpret_cast<uintptr_t>(Date::GetUTCMonth),
243     reinterpret_cast<uintptr_t>(Date::GetUTCSeconds),
244     reinterpret_cast<uintptr_t>(Date::SetDate),
245     reinterpret_cast<uintptr_t>(Date::SetFullYear),
246     reinterpret_cast<uintptr_t>(Date::SetHours),
247     reinterpret_cast<uintptr_t>(Date::SetMilliseconds),
248     reinterpret_cast<uintptr_t>(Date::SetMinutes),
249     reinterpret_cast<uintptr_t>(Date::SetMonth),
250     reinterpret_cast<uintptr_t>(Date::SetSeconds),
251     reinterpret_cast<uintptr_t>(Date::SetTime),
252     reinterpret_cast<uintptr_t>(Date::SetUTCDate),
253     reinterpret_cast<uintptr_t>(Date::SetUTCFullYear),
254     reinterpret_cast<uintptr_t>(Date::SetUTCHours),
255     reinterpret_cast<uintptr_t>(Date::SetUTCMilliseconds),
256     reinterpret_cast<uintptr_t>(Date::SetUTCMinutes),
257     reinterpret_cast<uintptr_t>(Date::SetUTCMonth),
258     reinterpret_cast<uintptr_t>(Date::SetUTCSeconds),
259     reinterpret_cast<uintptr_t>(Date::ToDateString),
260     reinterpret_cast<uintptr_t>(Date::ToISOString),
261     reinterpret_cast<uintptr_t>(Date::ToJSON),
262     reinterpret_cast<uintptr_t>(Date::ToLocaleDateString),
263     reinterpret_cast<uintptr_t>(Date::ToLocaleString),
264     reinterpret_cast<uintptr_t>(Date::ToLocaleTimeString),
265     reinterpret_cast<uintptr_t>(Date::ToString),
266     reinterpret_cast<uintptr_t>(Date::ToTimeString),
267     reinterpret_cast<uintptr_t>(Date::ToUTCString),
268     reinterpret_cast<uintptr_t>(Date::ValueOf),
269     reinterpret_cast<uintptr_t>(Date::ToPrimitive),
270     reinterpret_cast<uintptr_t>(Date::Now),
271     reinterpret_cast<uintptr_t>(Date::Parse),
272     reinterpret_cast<uintptr_t>(Date::UTC),
273     reinterpret_cast<uintptr_t>(Object::Assign),
274     reinterpret_cast<uintptr_t>(Object::Create),
275     reinterpret_cast<uintptr_t>(Object::DefineProperties),
276     reinterpret_cast<uintptr_t>(Object::DefineProperty),
277     reinterpret_cast<uintptr_t>(Object::Freeze),
278     reinterpret_cast<uintptr_t>(Object::GetOwnPropertyDescriptor),
279     reinterpret_cast<uintptr_t>(Object::GetOwnPropertyDescriptors),
280     reinterpret_cast<uintptr_t>(Object::GetOwnPropertyNames),
281     reinterpret_cast<uintptr_t>(Object::GetOwnPropertySymbols),
282     reinterpret_cast<uintptr_t>(Object::GetPrototypeOf),
283     reinterpret_cast<uintptr_t>(Object::Is),
284     reinterpret_cast<uintptr_t>(Object::IsExtensible),
285     reinterpret_cast<uintptr_t>(Object::IsFrozen),
286     reinterpret_cast<uintptr_t>(Object::IsSealed),
287     reinterpret_cast<uintptr_t>(Object::Keys),
288     reinterpret_cast<uintptr_t>(Object::Values),
289     reinterpret_cast<uintptr_t>(Object::PreventExtensions),
290     reinterpret_cast<uintptr_t>(Object::Seal),
291     reinterpret_cast<uintptr_t>(Object::SetPrototypeOf),
292     reinterpret_cast<uintptr_t>(Object::HasOwnProperty),
293     reinterpret_cast<uintptr_t>(Object::IsPrototypeOf),
294     reinterpret_cast<uintptr_t>(Object::PropertyIsEnumerable),
295     reinterpret_cast<uintptr_t>(Object::ToLocaleString),
296     reinterpret_cast<uintptr_t>(Object::ToString),
297     reinterpret_cast<uintptr_t>(Object::ValueOf),
298     reinterpret_cast<uintptr_t>(Object::ProtoGetter),
299     reinterpret_cast<uintptr_t>(Object::ProtoSetter),
300     reinterpret_cast<uintptr_t>(Object::CreateRealm),
301     reinterpret_cast<uintptr_t>(Object::Entries),
302     reinterpret_cast<uintptr_t>(Object::HasOwn),
303     reinterpret_cast<uintptr_t>(Boolean::BooleanConstructor),
304     reinterpret_cast<uintptr_t>(Boolean::BooleanPrototypeToString),
305     reinterpret_cast<uintptr_t>(Boolean::BooleanPrototypeValueOf),
306     reinterpret_cast<uintptr_t>(RegExp::RegExpConstructor),
307     reinterpret_cast<uintptr_t>(RegExp::Exec),
308     reinterpret_cast<uintptr_t>(RegExp::Test),
309     reinterpret_cast<uintptr_t>(RegExp::ToString),
310     reinterpret_cast<uintptr_t>(RegExp::GetFlags),
311     reinterpret_cast<uintptr_t>(RegExp::GetSource),
312     reinterpret_cast<uintptr_t>(RegExp::GetGlobal),
313     reinterpret_cast<uintptr_t>(RegExp::GetHasIndices),
314     reinterpret_cast<uintptr_t>(RegExp::GetIgnoreCase),
315     reinterpret_cast<uintptr_t>(RegExp::GetMultiline),
316     reinterpret_cast<uintptr_t>(RegExp::GetDotAll),
317     reinterpret_cast<uintptr_t>(RegExp::GetSticky),
318     reinterpret_cast<uintptr_t>(RegExp::GetUnicode),
319     reinterpret_cast<uintptr_t>(RegExp::Split),
320     reinterpret_cast<uintptr_t>(RegExp::Search),
321     reinterpret_cast<uintptr_t>(RegExp::Match),
322     reinterpret_cast<uintptr_t>(RegExp::MatchAll),
323     reinterpret_cast<uintptr_t>(RegExp::Replace),
324     reinterpret_cast<uintptr_t>(BuiltinsSet::SetConstructor),
325     reinterpret_cast<uintptr_t>(BuiltinsSet::Add),
326     reinterpret_cast<uintptr_t>(BuiltinsSet::Clear),
327     reinterpret_cast<uintptr_t>(BuiltinsSet::Delete),
328     reinterpret_cast<uintptr_t>(BuiltinsSet::Has),
329     reinterpret_cast<uintptr_t>(BuiltinsSet::ForEach),
330     reinterpret_cast<uintptr_t>(BuiltinsSet::Entries),
331     reinterpret_cast<uintptr_t>(BuiltinsSet::Values),
332     reinterpret_cast<uintptr_t>(BuiltinsSet::GetSize),
333     reinterpret_cast<uintptr_t>(BuiltinsSet::Species),
334     reinterpret_cast<uintptr_t>(BuiltinsMap::MapConstructor),
335     reinterpret_cast<uintptr_t>(BuiltinsMap::Set),
336     reinterpret_cast<uintptr_t>(BuiltinsMap::Clear),
337     reinterpret_cast<uintptr_t>(BuiltinsMap::Delete),
338     reinterpret_cast<uintptr_t>(BuiltinsMap::Has),
339     reinterpret_cast<uintptr_t>(BuiltinsMap::Get),
340     reinterpret_cast<uintptr_t>(BuiltinsMap::ForEach),
341     reinterpret_cast<uintptr_t>(BuiltinsMap::Keys),
342     reinterpret_cast<uintptr_t>(BuiltinsMap::Values),
343     reinterpret_cast<uintptr_t>(BuiltinsMap::Entries),
344     reinterpret_cast<uintptr_t>(BuiltinsMap::GetSize),
345     reinterpret_cast<uintptr_t>(BuiltinsWeakMap::WeakMapConstructor),
346     reinterpret_cast<uintptr_t>(BuiltinsWeakMap::Set),
347     reinterpret_cast<uintptr_t>(BuiltinsWeakMap::Delete),
348     reinterpret_cast<uintptr_t>(BuiltinsWeakMap::Has),
349     reinterpret_cast<uintptr_t>(BuiltinsWeakMap::Get),
350     reinterpret_cast<uintptr_t>(BuiltinsWeakSet::WeakSetConstructor),
351     reinterpret_cast<uintptr_t>(BuiltinsWeakSet::Add),
352     reinterpret_cast<uintptr_t>(BuiltinsWeakSet::Delete),
353     reinterpret_cast<uintptr_t>(BuiltinsWeakSet::Has),
354     reinterpret_cast<uintptr_t>(BuiltinsWeakRef::WeakRefConstructor),
355     reinterpret_cast<uintptr_t>(BuiltinsWeakRef::Deref),
356     reinterpret_cast<uintptr_t>(BuiltinsFinalizationRegistry::FinalizationRegistryConstructor),
357     reinterpret_cast<uintptr_t>(BuiltinsFinalizationRegistry::Register),
358     reinterpret_cast<uintptr_t>(BuiltinsFinalizationRegistry::Unregister),
359     reinterpret_cast<uintptr_t>(BuiltinsArray::ArrayConstructor),
360     reinterpret_cast<uintptr_t>(BuiltinsArray::Concat),
361     reinterpret_cast<uintptr_t>(BuiltinsArray::CopyWithin),
362     reinterpret_cast<uintptr_t>(BuiltinsArray::Entries),
363     reinterpret_cast<uintptr_t>(BuiltinsArray::Every),
364     reinterpret_cast<uintptr_t>(BuiltinsArray::Fill),
365     reinterpret_cast<uintptr_t>(BuiltinsArray::Filter),
366     reinterpret_cast<uintptr_t>(BuiltinsArray::Find),
367     reinterpret_cast<uintptr_t>(BuiltinsArray::FindIndex),
368     reinterpret_cast<uintptr_t>(BuiltinsArray::FindLast),
369     reinterpret_cast<uintptr_t>(BuiltinsArray::FindLastIndex),
370     reinterpret_cast<uintptr_t>(BuiltinsArray::ForEach),
371     reinterpret_cast<uintptr_t>(BuiltinsArray::IndexOf),
372     reinterpret_cast<uintptr_t>(BuiltinsArray::Join),
373     reinterpret_cast<uintptr_t>(BuiltinsArray::Keys),
374     reinterpret_cast<uintptr_t>(BuiltinsArray::LastIndexOf),
375     reinterpret_cast<uintptr_t>(BuiltinsArray::Map),
376     reinterpret_cast<uintptr_t>(BuiltinsArray::Pop),
377     reinterpret_cast<uintptr_t>(BuiltinsArray::Push),
378     reinterpret_cast<uintptr_t>(BuiltinsArray::Reduce),
379     reinterpret_cast<uintptr_t>(BuiltinsArray::ReduceRight),
380     reinterpret_cast<uintptr_t>(BuiltinsArray::Reverse),
381     reinterpret_cast<uintptr_t>(BuiltinsArray::Shift),
382     reinterpret_cast<uintptr_t>(BuiltinsArray::Slice),
383     reinterpret_cast<uintptr_t>(BuiltinsArray::Some),
384     reinterpret_cast<uintptr_t>(BuiltinsArray::Sort),
385     reinterpret_cast<uintptr_t>(BuiltinsArray::Splice),
386     reinterpret_cast<uintptr_t>(BuiltinsArray::ToLocaleString),
387     reinterpret_cast<uintptr_t>(BuiltinsArray::ToString),
388     reinterpret_cast<uintptr_t>(BuiltinsArray::Unshift),
389     reinterpret_cast<uintptr_t>(BuiltinsArray::Values),
390     reinterpret_cast<uintptr_t>(BuiltinsArray::From),
391     reinterpret_cast<uintptr_t>(BuiltinsArray::IsArray),
392     reinterpret_cast<uintptr_t>(BuiltinsArray::Of),
393     reinterpret_cast<uintptr_t>(BuiltinsArray::Species),
394     reinterpret_cast<uintptr_t>(BuiltinsArray::Includes),
395     reinterpret_cast<uintptr_t>(BuiltinsArray::Flat),
396     reinterpret_cast<uintptr_t>(BuiltinsArray::FlatMap),
397     reinterpret_cast<uintptr_t>(BuiltinsArray::At),
398     reinterpret_cast<uintptr_t>(BuiltinsArray::ToReversed),
399     reinterpret_cast<uintptr_t>(BuiltinsArray::With),
400     reinterpret_cast<uintptr_t>(BuiltinsArray::ToSorted),
401     reinterpret_cast<uintptr_t>(BuiltinsArray::ToSpliced),
402     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::TypedArrayBaseConstructor),
403     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::CopyWithin),
404     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Entries),
405     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Every),
406     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Fill),
407     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Filter),
408     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Find),
409     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::FindIndex),
410     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::FindLast),
411     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::FindLastIndex),
412     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::ForEach),
413     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::IndexOf),
414     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Join),
415     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Keys),
416     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::LastIndexOf),
417     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Map),
418     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Reduce),
419     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::ReduceRight),
420     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Reverse),
421     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Set),
422     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Slice),
423     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Some),
424     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Sort),
425     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::ToSorted),
426     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Subarray),
427     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::ToLocaleString),
428     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Values),
429     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::With),
430     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::GetBuffer),
431     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::GetByteLength),
432     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::GetByteOffset),
433     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::GetLength),
434     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::ToStringTag),
435     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::At),
436     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::ToReversed),
437     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::From),
438     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Of),
439     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Species),
440     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Includes),
441     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Int8ArrayConstructor),
442     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Uint8ArrayConstructor),
443     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Uint8ClampedArrayConstructor),
444     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Int16ArrayConstructor),
445     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Uint16ArrayConstructor),
446     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Int32ArrayConstructor),
447     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Uint32ArrayConstructor),
448     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Float32ArrayConstructor),
449     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::Float64ArrayConstructor),
450     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::BigInt64ArrayConstructor),
451     reinterpret_cast<uintptr_t>(BuiltinsTypedArray::BigUint64ArrayConstructor),
452     reinterpret_cast<uintptr_t>(BuiltinsString::StringConstructor),
453     reinterpret_cast<uintptr_t>(BuiltinsString::At),
454     reinterpret_cast<uintptr_t>(BuiltinsString::CharAt),
455     reinterpret_cast<uintptr_t>(BuiltinsString::CharCodeAt),
456     reinterpret_cast<uintptr_t>(BuiltinsString::CodePointAt),
457     reinterpret_cast<uintptr_t>(BuiltinsString::IsWellFormed),
458     reinterpret_cast<uintptr_t>(BuiltinsString::ToWellFormed),
459     reinterpret_cast<uintptr_t>(BuiltinsString::Concat),
460     reinterpret_cast<uintptr_t>(BuiltinsString::EndsWith),
461     reinterpret_cast<uintptr_t>(BuiltinsString::Includes),
462     reinterpret_cast<uintptr_t>(BuiltinsString::IndexOf),
463     reinterpret_cast<uintptr_t>(BuiltinsString::LastIndexOf),
464     reinterpret_cast<uintptr_t>(BuiltinsString::LocaleCompare),
465     reinterpret_cast<uintptr_t>(BuiltinsString::Match),
466     reinterpret_cast<uintptr_t>(BuiltinsString::MatchAll),
467     reinterpret_cast<uintptr_t>(BuiltinsString::Normalize),
468     reinterpret_cast<uintptr_t>(BuiltinsString::PadEnd),
469     reinterpret_cast<uintptr_t>(BuiltinsString::PadStart),
470     reinterpret_cast<uintptr_t>(BuiltinsString::Repeat),
471     reinterpret_cast<uintptr_t>(BuiltinsString::Replace),
472     reinterpret_cast<uintptr_t>(BuiltinsString::ReplaceAll),
473     reinterpret_cast<uintptr_t>(BuiltinsString::Search),
474     reinterpret_cast<uintptr_t>(BuiltinsString::Slice),
475     reinterpret_cast<uintptr_t>(BuiltinsString::Split),
476     reinterpret_cast<uintptr_t>(BuiltinsString::StartsWith),
477     reinterpret_cast<uintptr_t>(BuiltinsString::Substring),
478     reinterpret_cast<uintptr_t>(BuiltinsString::SubStr),
479     reinterpret_cast<uintptr_t>(BuiltinsString::ToLocaleLowerCase),
480     reinterpret_cast<uintptr_t>(BuiltinsString::ToLocaleUpperCase),
481     reinterpret_cast<uintptr_t>(BuiltinsString::ToLowerCase),
482     reinterpret_cast<uintptr_t>(BuiltinsString::ToString),
483     reinterpret_cast<uintptr_t>(BuiltinsString::ToUpperCase),
484     reinterpret_cast<uintptr_t>(BuiltinsString::Trim),
485     reinterpret_cast<uintptr_t>(BuiltinsString::TrimStart),
486     reinterpret_cast<uintptr_t>(BuiltinsString::TrimEnd),
487     reinterpret_cast<uintptr_t>(BuiltinsString::TrimLeft),
488     reinterpret_cast<uintptr_t>(BuiltinsString::TrimRight),
489     reinterpret_cast<uintptr_t>(BuiltinsString::ValueOf),
490     reinterpret_cast<uintptr_t>(BuiltinsString::GetStringIterator),
491     reinterpret_cast<uintptr_t>(BuiltinsString::FromCharCode),
492     reinterpret_cast<uintptr_t>(BuiltinsString::FromCodePoint),
493     reinterpret_cast<uintptr_t>(BuiltinsString::Raw),
494     reinterpret_cast<uintptr_t>(BuiltinsString::GetLength),
495     reinterpret_cast<uintptr_t>(ArrayBuffer::ArrayBufferConstructor),
496     reinterpret_cast<uintptr_t>(ArrayBuffer::Slice),
497     reinterpret_cast<uintptr_t>(ArrayBuffer::IsView),
498     reinterpret_cast<uintptr_t>(ArrayBuffer::Species),
499     reinterpret_cast<uintptr_t>(ArrayBuffer::GetByteLength),
500     reinterpret_cast<uintptr_t>(SharedArrayBuffer::SharedArrayBufferConstructor),
501     reinterpret_cast<uintptr_t>(SharedArrayBuffer::IsSharedArrayBuffer),
502     reinterpret_cast<uintptr_t>(SharedArrayBuffer::Species),
503     reinterpret_cast<uintptr_t>(SharedArrayBuffer::GetByteLength),
504     reinterpret_cast<uintptr_t>(SharedArrayBuffer::Slice),
505     reinterpret_cast<uintptr_t>(DataView::DataViewConstructor),
506     reinterpret_cast<uintptr_t>(DataView::GetFloat32),
507     reinterpret_cast<uintptr_t>(DataView::GetFloat64),
508     reinterpret_cast<uintptr_t>(DataView::GetInt8),
509     reinterpret_cast<uintptr_t>(DataView::GetInt16),
510     reinterpret_cast<uintptr_t>(DataView::GetInt32),
511     reinterpret_cast<uintptr_t>(DataView::GetUint8),
512     reinterpret_cast<uintptr_t>(DataView::GetUint16),
513     reinterpret_cast<uintptr_t>(DataView::GetUint32),
514     reinterpret_cast<uintptr_t>(DataView::SetFloat32),
515     reinterpret_cast<uintptr_t>(DataView::SetFloat64),
516     reinterpret_cast<uintptr_t>(DataView::GetBigInt64),
517     reinterpret_cast<uintptr_t>(DataView::GetBigUint64),
518     reinterpret_cast<uintptr_t>(DataView::SetInt8),
519     reinterpret_cast<uintptr_t>(DataView::SetInt16),
520     reinterpret_cast<uintptr_t>(DataView::SetInt32),
521     reinterpret_cast<uintptr_t>(DataView::SetUint8),
522     reinterpret_cast<uintptr_t>(DataView::SetUint16),
523     reinterpret_cast<uintptr_t>(DataView::SetUint32),
524     reinterpret_cast<uintptr_t>(DataView::GetBuffer),
525     reinterpret_cast<uintptr_t>(DataView::GetByteLength),
526     reinterpret_cast<uintptr_t>(DataView::GetOffset),
527     reinterpret_cast<uintptr_t>(DataView::SetBigInt64),
528     reinterpret_cast<uintptr_t>(DataView::SetBigUint64),
529     reinterpret_cast<uintptr_t>(Global::PrintEntrypoint),
530     reinterpret_cast<uintptr_t>(Global::NotSupportEval),
531     reinterpret_cast<uintptr_t>(Global::IsFinite),
532     reinterpret_cast<uintptr_t>(Global::IsNaN),
533     reinterpret_cast<uintptr_t>(Global::DecodeURI),
534     reinterpret_cast<uintptr_t>(Global::DecodeURIComponent),
535     reinterpret_cast<uintptr_t>(Global::EncodeURI),
536     reinterpret_cast<uintptr_t>(Global::EncodeURIComponent),
537     reinterpret_cast<uintptr_t>(Math::Abs),
538     reinterpret_cast<uintptr_t>(Math::Acos),
539     reinterpret_cast<uintptr_t>(Math::Acosh),
540     reinterpret_cast<uintptr_t>(Math::Asin),
541     reinterpret_cast<uintptr_t>(Math::Asinh),
542     reinterpret_cast<uintptr_t>(Math::Atan),
543     reinterpret_cast<uintptr_t>(Math::Atanh),
544     reinterpret_cast<uintptr_t>(Math::Atan2),
545     reinterpret_cast<uintptr_t>(Math::Cbrt),
546     reinterpret_cast<uintptr_t>(Math::Ceil),
547     reinterpret_cast<uintptr_t>(Math::Clz32),
548     reinterpret_cast<uintptr_t>(Math::Cos),
549     reinterpret_cast<uintptr_t>(Math::Cosh),
550     reinterpret_cast<uintptr_t>(Math::Exp),
551     reinterpret_cast<uintptr_t>(Math::Expm1),
552     reinterpret_cast<uintptr_t>(Math::Floor),
553     reinterpret_cast<uintptr_t>(Math::Fround),
554     reinterpret_cast<uintptr_t>(Math::Hypot),
555     reinterpret_cast<uintptr_t>(Math::Imul),
556     reinterpret_cast<uintptr_t>(Math::Log),
557     reinterpret_cast<uintptr_t>(Math::Log1p),
558     reinterpret_cast<uintptr_t>(Math::Log10),
559     reinterpret_cast<uintptr_t>(Math::Log2),
560     reinterpret_cast<uintptr_t>(Math::Max),
561     reinterpret_cast<uintptr_t>(Math::Min),
562     reinterpret_cast<uintptr_t>(Math::Pow),
563     reinterpret_cast<uintptr_t>(Math::Random),
564     reinterpret_cast<uintptr_t>(Math::Round),
565     reinterpret_cast<uintptr_t>(Math::Sign),
566     reinterpret_cast<uintptr_t>(Math::Sin),
567     reinterpret_cast<uintptr_t>(Math::Sinh),
568     reinterpret_cast<uintptr_t>(Math::Sqrt),
569     reinterpret_cast<uintptr_t>(Math::Tan),
570     reinterpret_cast<uintptr_t>(Math::Tanh),
571     reinterpret_cast<uintptr_t>(Math::Trunc),
572     reinterpret_cast<uintptr_t>(Atomics::Wait),
573     reinterpret_cast<uintptr_t>(Atomics::Exchange),
574     reinterpret_cast<uintptr_t>(Atomics::CompareExchange),
575     reinterpret_cast<uintptr_t>(Atomics::IsLockFree),
576     reinterpret_cast<uintptr_t>(Atomics::Store),
577     reinterpret_cast<uintptr_t>(Atomics::Load),
578     reinterpret_cast<uintptr_t>(Atomics::Notify),
579     reinterpret_cast<uintptr_t>(Atomics::Xor),
580     reinterpret_cast<uintptr_t>(Atomics::Or),
581     reinterpret_cast<uintptr_t>(Atomics::Sub),
582     reinterpret_cast<uintptr_t>(Atomics::And),
583     reinterpret_cast<uintptr_t>(Atomics::Add),
584     reinterpret_cast<uintptr_t>(Json::Parse),
585     reinterpret_cast<uintptr_t>(Json::Stringify),
586     reinterpret_cast<uintptr_t>(BuiltinsIterator::Next),
587     reinterpret_cast<uintptr_t>(BuiltinsIterator::Return),
588     reinterpret_cast<uintptr_t>(BuiltinsIterator::Throw),
589     reinterpret_cast<uintptr_t>(BuiltinsIterator::GetIteratorObj),
590     reinterpret_cast<uintptr_t>(BuiltinsAsyncIterator::Next),
591     reinterpret_cast<uintptr_t>(BuiltinsAsyncIterator::Return),
592     reinterpret_cast<uintptr_t>(BuiltinsAsyncIterator::Throw),
593     reinterpret_cast<uintptr_t>(BuiltinsAsyncIterator::GetAsyncIteratorObj),
594     reinterpret_cast<uintptr_t>(JSForInIterator::Next),
595     reinterpret_cast<uintptr_t>(JSRegExpIterator::Next),
596     reinterpret_cast<uintptr_t>(JSSetIterator::Next),
597     reinterpret_cast<uintptr_t>(JSMapIterator::Next),
598     reinterpret_cast<uintptr_t>(JSArrayIterator::Next),
599     reinterpret_cast<uintptr_t>(Proxy::ProxyConstructor),
600     reinterpret_cast<uintptr_t>(Proxy::Revocable),
601     reinterpret_cast<uintptr_t>(Reflect::ReflectApply),
602     reinterpret_cast<uintptr_t>(Reflect::ReflectConstruct),
603     reinterpret_cast<uintptr_t>(Reflect::ReflectDefineProperty),
604     reinterpret_cast<uintptr_t>(Reflect::ReflectDeleteProperty),
605     reinterpret_cast<uintptr_t>(Reflect::ReflectGet),
606     reinterpret_cast<uintptr_t>(Reflect::ReflectGetOwnPropertyDescriptor),
607     reinterpret_cast<uintptr_t>(Reflect::ReflectGetPrototypeOf),
608     reinterpret_cast<uintptr_t>(Reflect::ReflectHas),
609     reinterpret_cast<uintptr_t>(Reflect::ReflectIsExtensible),
610     reinterpret_cast<uintptr_t>(Reflect::ReflectOwnKeys),
611     reinterpret_cast<uintptr_t>(Reflect::ReflectPreventExtensions),
612     reinterpret_cast<uintptr_t>(Reflect::ReflectSet),
613     reinterpret_cast<uintptr_t>(Reflect::ReflectSetPrototypeOf),
614     reinterpret_cast<uintptr_t>(AsyncFunction::AsyncFunctionConstructor),
615     reinterpret_cast<uintptr_t>(GeneratorObject::GeneratorPrototypeNext),
616     reinterpret_cast<uintptr_t>(GeneratorObject::GeneratorPrototypeReturn),
617     reinterpret_cast<uintptr_t>(GeneratorObject::GeneratorPrototypeThrow),
618     reinterpret_cast<uintptr_t>(GeneratorObject::GeneratorFunctionConstructor),
619     reinterpret_cast<uintptr_t>(AsyncGeneratorObject::AsyncGeneratorPrototypeNext),
620     reinterpret_cast<uintptr_t>(AsyncGeneratorObject::AsyncGeneratorPrototypeReturn),
621     reinterpret_cast<uintptr_t>(AsyncGeneratorObject::AsyncGeneratorPrototypeThrow),
622     reinterpret_cast<uintptr_t>(AsyncGeneratorObject::AsyncGeneratorFunctionConstructor),
623     reinterpret_cast<uintptr_t>(Promise::PromiseConstructor),
624     reinterpret_cast<uintptr_t>(Promise::All),
625     reinterpret_cast<uintptr_t>(Promise::Race),
626     reinterpret_cast<uintptr_t>(Promise::Resolve),
627     reinterpret_cast<uintptr_t>(Promise::Reject),
628     reinterpret_cast<uintptr_t>(Promise::Catch),
629     reinterpret_cast<uintptr_t>(Promise::Then),
630     reinterpret_cast<uintptr_t>(Promise::Finally),
631     reinterpret_cast<uintptr_t>(Promise::Any),
632     reinterpret_cast<uintptr_t>(Promise::AllSettled),
633     reinterpret_cast<uintptr_t>(Promise::GetSpecies),
634     reinterpret_cast<uintptr_t>(BuiltinsPromiseJob::PromiseReactionJob),
635     reinterpret_cast<uintptr_t>(BuiltinsPromiseJob::PromiseResolveThenableJob),
636     reinterpret_cast<uintptr_t>(BuiltinsPromiseJob::DynamicImportJob),
637     reinterpret_cast<uintptr_t>(BuiltinsCjsExports::CjsExportsConstructor),
638     reinterpret_cast<uintptr_t>(BuiltinsCjsModule::CjsModuleConstructor),
639     reinterpret_cast<uintptr_t>(BuiltinsCjsModule::Compiler),
640     reinterpret_cast<uintptr_t>(BuiltinsCjsModule::Load),
641     reinterpret_cast<uintptr_t>(BuiltinsCjsModule::Require),
642     reinterpret_cast<uintptr_t>(BuiltinsCjsModule::GetExportsForCircularRequire),
643     reinterpret_cast<uintptr_t>(BuiltinsCjsModule::UpdateChildren),
644     reinterpret_cast<uintptr_t>(BuiltinsCjsModule::ResolveFilename),
645     reinterpret_cast<uintptr_t>(BuiltinsCjsRequire::CjsRequireConstructor),
646     reinterpret_cast<uintptr_t>(BuiltinsCjsRequire::Main),
647     reinterpret_cast<uintptr_t>(BuiltinsCjsRequire::Resolve),
648     reinterpret_cast<uintptr_t>(ArkTools::ObjectDump),
649     reinterpret_cast<uintptr_t>(ArkTools::CompareHClass),
650     reinterpret_cast<uintptr_t>(ArkTools::DumpHClass),
651     reinterpret_cast<uintptr_t>(BuiltinsBigInt::BigIntConstructor),
652     reinterpret_cast<uintptr_t>(BuiltinsBigInt::AsUintN),
653     reinterpret_cast<uintptr_t>(BuiltinsBigInt::AsIntN),
654     reinterpret_cast<uintptr_t>(BuiltinsBigInt::ToLocaleString),
655     reinterpret_cast<uintptr_t>(BuiltinsBigInt::ToString),
656     reinterpret_cast<uintptr_t>(BuiltinsBigInt::ValueOf),
657 #ifdef ARK_SUPPORT_INTL
658     reinterpret_cast<uintptr_t>(DisplayNames::DisplayNamesConstructor),
659     reinterpret_cast<uintptr_t>(DisplayNames::SupportedLocalesOf),
660     reinterpret_cast<uintptr_t>(DisplayNames::Of),
661     reinterpret_cast<uintptr_t>(DisplayNames::ResolvedOptions),
662     reinterpret_cast<uintptr_t>(Intl::GetCanonicalLocales),
663     reinterpret_cast<uintptr_t>(Locale::LocaleConstructor),
664     reinterpret_cast<uintptr_t>(Locale::Maximize),
665     reinterpret_cast<uintptr_t>(Locale::Minimize),
666     reinterpret_cast<uintptr_t>(Locale::ToString),
667     reinterpret_cast<uintptr_t>(Locale::GetBaseName),
668     reinterpret_cast<uintptr_t>(Locale::GetCalendar),
669     reinterpret_cast<uintptr_t>(Locale::GetCaseFirst),
670     reinterpret_cast<uintptr_t>(Locale::GetCollation),
671     reinterpret_cast<uintptr_t>(Locale::GetHourCycle),
672     reinterpret_cast<uintptr_t>(Locale::GetNumeric),
673     reinterpret_cast<uintptr_t>(Locale::GetNumberingSystem),
674     reinterpret_cast<uintptr_t>(Locale::GetLanguage),
675     reinterpret_cast<uintptr_t>(Locale::GetScript),
676     reinterpret_cast<uintptr_t>(Locale::GetRegion),
677     reinterpret_cast<uintptr_t>(DateTimeFormat::DateTimeFormatConstructor),
678     reinterpret_cast<uintptr_t>(DateTimeFormat::SupportedLocalesOf),
679     reinterpret_cast<uintptr_t>(DateTimeFormat::Format),
680     reinterpret_cast<uintptr_t>(DateTimeFormat::FormatToParts),
681     reinterpret_cast<uintptr_t>(DateTimeFormat::ResolvedOptions),
682     reinterpret_cast<uintptr_t>(DateTimeFormat::FormatRange),
683     reinterpret_cast<uintptr_t>(DateTimeFormat::FormatRangeToParts),
684     reinterpret_cast<uintptr_t>(NumberFormat::NumberFormatConstructor),
685     reinterpret_cast<uintptr_t>(NumberFormat::SupportedLocalesOf),
686     reinterpret_cast<uintptr_t>(NumberFormat::Format),
687     reinterpret_cast<uintptr_t>(NumberFormat::FormatToParts),
688     reinterpret_cast<uintptr_t>(NumberFormat::ResolvedOptions),
689     reinterpret_cast<uintptr_t>(RelativeTimeFormat::RelativeTimeFormatConstructor),
690     reinterpret_cast<uintptr_t>(RelativeTimeFormat::SupportedLocalesOf),
691     reinterpret_cast<uintptr_t>(RelativeTimeFormat::Format),
692     reinterpret_cast<uintptr_t>(RelativeTimeFormat::FormatToParts),
693     reinterpret_cast<uintptr_t>(RelativeTimeFormat::ResolvedOptions),
694     reinterpret_cast<uintptr_t>(Collator::CollatorConstructor),
695     reinterpret_cast<uintptr_t>(Collator::SupportedLocalesOf),
696     reinterpret_cast<uintptr_t>(Collator::Compare),
697     reinterpret_cast<uintptr_t>(Collator::ResolvedOptions),
698     reinterpret_cast<uintptr_t>(PluralRules::PluralRulesConstructor),
699     reinterpret_cast<uintptr_t>(PluralRules::SupportedLocalesOf),
700     reinterpret_cast<uintptr_t>(PluralRules::Select),
701     reinterpret_cast<uintptr_t>(PluralRules::ResolvedOptions),
702     reinterpret_cast<uintptr_t>(ListFormat::ListFormatConstructor),
703     reinterpret_cast<uintptr_t>(ListFormat::SupportedLocalesOf),
704     reinterpret_cast<uintptr_t>(ListFormat::Format),
705     reinterpret_cast<uintptr_t>(ListFormat::FormatToParts),
706     reinterpret_cast<uintptr_t>(ListFormat::ResolvedOptions),
707     reinterpret_cast<uintptr_t>(Segmenter::SegmenterConstructor),
708     reinterpret_cast<uintptr_t>(Segmenter::SupportedLocalesOf),
709     reinterpret_cast<uintptr_t>(Segmenter::ResolvedOptions),
710     reinterpret_cast<uintptr_t>(Segmenter::Segment),
711     reinterpret_cast<uintptr_t>(Segments::Containing),
712 #endif
713 
714     // non ECMA standard jsapi containers.
715     reinterpret_cast<uintptr_t>(ContainersPrivate::Load),
716     reinterpret_cast<uintptr_t>(ArrayList::ArrayListConstructor),
717     reinterpret_cast<uintptr_t>(ArrayList::Add),
718     reinterpret_cast<uintptr_t>(ArrayList::Insert),
719     reinterpret_cast<uintptr_t>(ArrayList::Clear),
720     reinterpret_cast<uintptr_t>(ArrayList::Clone),
721     reinterpret_cast<uintptr_t>(ArrayList::Has),
722     reinterpret_cast<uintptr_t>(ArrayList::GetCapacity),
723     reinterpret_cast<uintptr_t>(ArrayList::IncreaseCapacityTo),
724     reinterpret_cast<uintptr_t>(ArrayList::TrimToCurrentLength),
725     reinterpret_cast<uintptr_t>(ArrayList::GetIndexOf),
726     reinterpret_cast<uintptr_t>(ArrayList::IsEmpty),
727     reinterpret_cast<uintptr_t>(ArrayList::GetLastIndexOf),
728     reinterpret_cast<uintptr_t>(ArrayList::RemoveByIndex),
729     reinterpret_cast<uintptr_t>(ArrayList::Remove),
730     reinterpret_cast<uintptr_t>(ArrayList::RemoveByRange),
731     reinterpret_cast<uintptr_t>(ArrayList::ReplaceAllElements),
732     reinterpret_cast<uintptr_t>(ArrayList::SubArrayList),
733     reinterpret_cast<uintptr_t>(ArrayList::ConvertToArray),
734     reinterpret_cast<uintptr_t>(ArrayList::ForEach),
735     reinterpret_cast<uintptr_t>(ArrayList::GetIteratorObj),
736     reinterpret_cast<uintptr_t>(ArrayList::Get),
737     reinterpret_cast<uintptr_t>(ArrayList::Set),
738     reinterpret_cast<uintptr_t>(ArrayList::GetSize),
739     reinterpret_cast<uintptr_t>(JSAPIArrayListIterator::Next),
740     reinterpret_cast<uintptr_t>(HashMap::HashMapConstructor),
741     reinterpret_cast<uintptr_t>(HashMap::HasKey),
742     reinterpret_cast<uintptr_t>(HashMap::HasValue),
743     reinterpret_cast<uintptr_t>(HashMap::Replace),
744     reinterpret_cast<uintptr_t>(HashMap::Keys),
745     reinterpret_cast<uintptr_t>(HashMap::Values),
746     reinterpret_cast<uintptr_t>(HashMap::Entries),
747     reinterpret_cast<uintptr_t>(HashMap::ForEach),
748     reinterpret_cast<uintptr_t>(HashMap::Set),
749     reinterpret_cast<uintptr_t>(HashMap::SetAll),
750     reinterpret_cast<uintptr_t>(HashMap::Remove),
751     reinterpret_cast<uintptr_t>(HashMap::Get),
752     reinterpret_cast<uintptr_t>(HashMap::Clear),
753     reinterpret_cast<uintptr_t>(HashMap::GetLength),
754     reinterpret_cast<uintptr_t>(HashMap::IsEmpty),
755     reinterpret_cast<uintptr_t>(HashSet::HashSetConstructor),
756     reinterpret_cast<uintptr_t>(HashSet::IsEmpty),
757     reinterpret_cast<uintptr_t>(HashSet::Has),
758     reinterpret_cast<uintptr_t>(HashSet::Add),
759     reinterpret_cast<uintptr_t>(HashSet::Remove),
760     reinterpret_cast<uintptr_t>(HashSet::Clear),
761     reinterpret_cast<uintptr_t>(HashSet::GetLength),
762     reinterpret_cast<uintptr_t>(HashSet::Values),
763     reinterpret_cast<uintptr_t>(HashSet::Entries),
764     reinterpret_cast<uintptr_t>(JSAPIHashMapIterator::Next),
765     reinterpret_cast<uintptr_t>(JSAPIHashSetIterator::Next),
766     reinterpret_cast<uintptr_t>(LightWeightMap::HasAll),
767     reinterpret_cast<uintptr_t>(LightWeightMap::HasKey),
768     reinterpret_cast<uintptr_t>(LightWeightMap::HasValue),
769     reinterpret_cast<uintptr_t>(LightWeightMap::IncreaseCapacityTo),
770     reinterpret_cast<uintptr_t>(LightWeightMap::Entries),
771     reinterpret_cast<uintptr_t>(LightWeightMap::Get),
772     reinterpret_cast<uintptr_t>(LightWeightMap::GetIndexOfKey),
773     reinterpret_cast<uintptr_t>(LightWeightMap::GetIndexOfValue),
774     reinterpret_cast<uintptr_t>(LightWeightMap::IsEmpty),
775     reinterpret_cast<uintptr_t>(LightWeightMap::GetKeyAt),
776     reinterpret_cast<uintptr_t>(LightWeightMap::Keys),
777     reinterpret_cast<uintptr_t>(LightWeightMap::SetAll),
778     reinterpret_cast<uintptr_t>(LightWeightMap::Set),
779     reinterpret_cast<uintptr_t>(LightWeightMap::Remove),
780     reinterpret_cast<uintptr_t>(LightWeightMap::RemoveAt),
781     reinterpret_cast<uintptr_t>(LightWeightMap::Clear),
782     reinterpret_cast<uintptr_t>(LightWeightMap::SetValueAt),
783     reinterpret_cast<uintptr_t>(LightWeightMap::ForEach),
784     reinterpret_cast<uintptr_t>(LightWeightMap::ToString),
785     reinterpret_cast<uintptr_t>(LightWeightMap::GetValueAt),
786     reinterpret_cast<uintptr_t>(LightWeightMap::Values),
787     reinterpret_cast<uintptr_t>(JSAPILightWeightMapIterator::Next),
788     reinterpret_cast<uintptr_t>(LightWeightSet::LightWeightSetConstructor),
789     reinterpret_cast<uintptr_t>(LightWeightSet::Add),
790     reinterpret_cast<uintptr_t>(LightWeightSet::AddAll),
791     reinterpret_cast<uintptr_t>(LightWeightSet::IsEmpty),
792     reinterpret_cast<uintptr_t>(LightWeightSet::GetValueAt),
793     reinterpret_cast<uintptr_t>(LightWeightSet::HasAll),
794     reinterpret_cast<uintptr_t>(LightWeightSet::Has),
795     reinterpret_cast<uintptr_t>(LightWeightSet::HasHash),
796     reinterpret_cast<uintptr_t>(LightWeightSet::Equal),
797     reinterpret_cast<uintptr_t>(LightWeightSet::IncreaseCapacityTo),
798     reinterpret_cast<uintptr_t>(LightWeightSet::GetIteratorObj),
799     reinterpret_cast<uintptr_t>(LightWeightSet::Values),
800     reinterpret_cast<uintptr_t>(LightWeightSet::Entries),
801     reinterpret_cast<uintptr_t>(LightWeightSet::ForEach),
802     reinterpret_cast<uintptr_t>(LightWeightSet::GetIndexOf),
803     reinterpret_cast<uintptr_t>(LightWeightSet::Remove),
804     reinterpret_cast<uintptr_t>(LightWeightSet::RemoveAt),
805     reinterpret_cast<uintptr_t>(LightWeightSet::Clear),
806     reinterpret_cast<uintptr_t>(LightWeightSet::ToString),
807     reinterpret_cast<uintptr_t>(LightWeightSet::ToArray),
808     reinterpret_cast<uintptr_t>(LightWeightSet::GetSize),
809     reinterpret_cast<uintptr_t>(JSAPILightWeightSetIterator::Next),
810     reinterpret_cast<uintptr_t>(TreeMap::TreeMapConstructor),
811     reinterpret_cast<uintptr_t>(TreeMap::Set),
812     reinterpret_cast<uintptr_t>(TreeMap::Get),
813     reinterpret_cast<uintptr_t>(TreeMap::Remove),
814     reinterpret_cast<uintptr_t>(TreeMap::GetFirstKey),
815     reinterpret_cast<uintptr_t>(TreeMap::GetLastKey),
816     reinterpret_cast<uintptr_t>(TreeMap::GetLowerKey),
817     reinterpret_cast<uintptr_t>(TreeMap::GetHigherKey),
818     reinterpret_cast<uintptr_t>(TreeMap::HasKey),
819     reinterpret_cast<uintptr_t>(TreeMap::HasValue),
820     reinterpret_cast<uintptr_t>(TreeMap::SetAll),
821     reinterpret_cast<uintptr_t>(TreeMap::Replace),
822     reinterpret_cast<uintptr_t>(TreeMap::Keys),
823     reinterpret_cast<uintptr_t>(TreeMap::Values),
824     reinterpret_cast<uintptr_t>(TreeMap::Entries),
825     reinterpret_cast<uintptr_t>(TreeMap::ForEach),
826     reinterpret_cast<uintptr_t>(TreeMap::Clear),
827     reinterpret_cast<uintptr_t>(TreeMap::IsEmpty),
828     reinterpret_cast<uintptr_t>(TreeMap::GetLength),
829     reinterpret_cast<uintptr_t>(TreeSet::TreeSetConstructor),
830     reinterpret_cast<uintptr_t>(TreeSet::Add),
831     reinterpret_cast<uintptr_t>(TreeSet::Has),
832     reinterpret_cast<uintptr_t>(TreeSet::Remove),
833     reinterpret_cast<uintptr_t>(TreeSet::GetFirstValue),
834     reinterpret_cast<uintptr_t>(TreeSet::GetLastValue),
835     reinterpret_cast<uintptr_t>(TreeSet::GetLowerValue),
836     reinterpret_cast<uintptr_t>(TreeSet::GetHigherValue),
837     reinterpret_cast<uintptr_t>(TreeSet::PopFirst),
838     reinterpret_cast<uintptr_t>(TreeSet::PopLast),
839     reinterpret_cast<uintptr_t>(TreeSet::IsEmpty),
840     reinterpret_cast<uintptr_t>(TreeSet::Values),
841     reinterpret_cast<uintptr_t>(TreeSet::Entries),
842     reinterpret_cast<uintptr_t>(TreeSet::ForEach),
843     reinterpret_cast<uintptr_t>(TreeSet::Clear),
844     reinterpret_cast<uintptr_t>(TreeSet::GetLength),
845     reinterpret_cast<uintptr_t>(JSAPITreeMapIterator::Next),
846     reinterpret_cast<uintptr_t>(JSAPITreeSetIterator::Next),
847     reinterpret_cast<uintptr_t>(Deque::DequeConstructor),
848     reinterpret_cast<uintptr_t>(Deque::InsertFront),
849     reinterpret_cast<uintptr_t>(Deque::InsertEnd),
850     reinterpret_cast<uintptr_t>(Deque::GetFirst),
851     reinterpret_cast<uintptr_t>(Deque::GetLast),
852     reinterpret_cast<uintptr_t>(Deque::Has),
853     reinterpret_cast<uintptr_t>(Deque::PopFirst),
854     reinterpret_cast<uintptr_t>(Deque::PopLast),
855     reinterpret_cast<uintptr_t>(Deque::ForEach),
856     reinterpret_cast<uintptr_t>(Deque::GetIteratorObj),
857     reinterpret_cast<uintptr_t>(Deque::GetSize),
858     reinterpret_cast<uintptr_t>(JSAPIDequeIterator::Next),
859     reinterpret_cast<uintptr_t>(Vector::VectorConstructor),
860     reinterpret_cast<uintptr_t>(Vector::Add),
861     reinterpret_cast<uintptr_t>(Vector::Insert),
862     reinterpret_cast<uintptr_t>(Vector::SetLength),
863     reinterpret_cast<uintptr_t>(Vector::GetCapacity),
864     reinterpret_cast<uintptr_t>(Vector::IncreaseCapacityTo),
865     reinterpret_cast<uintptr_t>(Vector::Get),
866     reinterpret_cast<uintptr_t>(Vector::GetIndexOf),
867     reinterpret_cast<uintptr_t>(Vector::GetIndexFrom),
868     reinterpret_cast<uintptr_t>(Vector::IsEmpty),
869     reinterpret_cast<uintptr_t>(Vector::GetLastElement),
870     reinterpret_cast<uintptr_t>(Vector::GetLastIndexOf),
871     reinterpret_cast<uintptr_t>(Vector::GetLastIndexFrom),
872     reinterpret_cast<uintptr_t>(Vector::Remove),
873     reinterpret_cast<uintptr_t>(Vector::RemoveByIndex),
874     reinterpret_cast<uintptr_t>(Vector::RemoveByRange),
875     reinterpret_cast<uintptr_t>(Vector::Set),
876     reinterpret_cast<uintptr_t>(Vector::SubVector),
877     reinterpret_cast<uintptr_t>(Vector::ToString),
878     reinterpret_cast<uintptr_t>(Vector::GetSize),
879     reinterpret_cast<uintptr_t>(Vector::ForEach),
880     reinterpret_cast<uintptr_t>(Vector::ReplaceAllElements),
881     reinterpret_cast<uintptr_t>(Vector::TrimToCurrentLength),
882     reinterpret_cast<uintptr_t>(Vector::Clear),
883     reinterpret_cast<uintptr_t>(Vector::Clone),
884     reinterpret_cast<uintptr_t>(Vector::Has),
885     reinterpret_cast<uintptr_t>(Vector::GetFirstElement),
886     reinterpret_cast<uintptr_t>(Vector::CopyToArray),
887     reinterpret_cast<uintptr_t>(Vector::ConvertToArray),
888     reinterpret_cast<uintptr_t>(Vector::Sort),
889     reinterpret_cast<uintptr_t>(Vector::GetIteratorObj),
890     reinterpret_cast<uintptr_t>(JSAPIVectorIterator::Next),
891     reinterpret_cast<uintptr_t>(BitVector::BitVectorConstructor),
892     reinterpret_cast<uintptr_t>(BitVector::Push),
893     reinterpret_cast<uintptr_t>(BitVector::Pop),
894     reinterpret_cast<uintptr_t>(BitVector::Has),
895     reinterpret_cast<uintptr_t>(BitVector::SetBitsByRange),
896     reinterpret_cast<uintptr_t>(BitVector::GetBitsByRange),
897     reinterpret_cast<uintptr_t>(BitVector::Resize),
898     reinterpret_cast<uintptr_t>(BitVector::SetAllBits),
899     reinterpret_cast<uintptr_t>(BitVector::GetBitCountByRange),
900     reinterpret_cast<uintptr_t>(BitVector::GetIndexOf),
901     reinterpret_cast<uintptr_t>(BitVector::GetLastIndexOf),
902     reinterpret_cast<uintptr_t>(BitVector::FlipBitByIndex),
903     reinterpret_cast<uintptr_t>(BitVector::FlipBitsByRange),
904     reinterpret_cast<uintptr_t>(BitVector::GetSize),
905     reinterpret_cast<uintptr_t>(BitVector::GetIteratorObj),
906     reinterpret_cast<uintptr_t>(JSAPIBitVectorIterator::Next),
907     reinterpret_cast<uintptr_t>(Queue::QueueConstructor),
908     reinterpret_cast<uintptr_t>(Queue::Add),
909     reinterpret_cast<uintptr_t>(Queue::GetFirst),
910     reinterpret_cast<uintptr_t>(Queue::Pop),
911     reinterpret_cast<uintptr_t>(Queue::ForEach),
912     reinterpret_cast<uintptr_t>(Queue::GetIteratorObj),
913     reinterpret_cast<uintptr_t>(Queue::GetSize),
914     reinterpret_cast<uintptr_t>(JSAPIQueueIterator::Next),
915     reinterpret_cast<uintptr_t>(PlainArray::PlainArrayConstructor),
916     reinterpret_cast<uintptr_t>(PlainArray::Add),
917     reinterpret_cast<uintptr_t>(PlainArray::Clear),
918     reinterpret_cast<uintptr_t>(PlainArray::Clone),
919     reinterpret_cast<uintptr_t>(PlainArray::Has),
920     reinterpret_cast<uintptr_t>(PlainArray::Get),
921     reinterpret_cast<uintptr_t>(PlainArray::GetIteratorObj),
922     reinterpret_cast<uintptr_t>(PlainArray::ForEach),
923     reinterpret_cast<uintptr_t>(PlainArray::ToString),
924     reinterpret_cast<uintptr_t>(PlainArray::GetIndexOfKey),
925     reinterpret_cast<uintptr_t>(PlainArray::GetIndexOfValue),
926     reinterpret_cast<uintptr_t>(PlainArray::IsEmpty),
927     reinterpret_cast<uintptr_t>(PlainArray::GetKeyAt),
928     reinterpret_cast<uintptr_t>(PlainArray::Remove),
929     reinterpret_cast<uintptr_t>(PlainArray::RemoveAt),
930     reinterpret_cast<uintptr_t>(PlainArray::RemoveRangeFrom),
931     reinterpret_cast<uintptr_t>(PlainArray::SetValueAt),
932     reinterpret_cast<uintptr_t>(PlainArray::GetValueAt),
933     reinterpret_cast<uintptr_t>(PlainArray::GetSize),
934     reinterpret_cast<uintptr_t>(JSAPIPlainArrayIterator::Next),
935     reinterpret_cast<uintptr_t>(ContainerStack::StackConstructor),
936     reinterpret_cast<uintptr_t>(ContainerStack::Iterator),
937     reinterpret_cast<uintptr_t>(ContainerStack::IsEmpty),
938     reinterpret_cast<uintptr_t>(ContainerStack::Push),
939     reinterpret_cast<uintptr_t>(ContainerStack::Peek),
940     reinterpret_cast<uintptr_t>(ContainerStack::Pop),
941     reinterpret_cast<uintptr_t>(ContainerStack::Locate),
942     reinterpret_cast<uintptr_t>(ContainerStack::ForEach),
943     reinterpret_cast<uintptr_t>(ContainerStack::GetLength),
944     reinterpret_cast<uintptr_t>(JSAPIStackIterator::Next),
945     reinterpret_cast<uintptr_t>(List::ListConstructor),
946     reinterpret_cast<uintptr_t>(List::Add),
947     reinterpret_cast<uintptr_t>(List::GetFirst),
948     reinterpret_cast<uintptr_t>(List::GetLast),
949     reinterpret_cast<uintptr_t>(List::Insert),
950     reinterpret_cast<uintptr_t>(List::Clear),
951     reinterpret_cast<uintptr_t>(List::RemoveByIndex),
952     reinterpret_cast<uintptr_t>(List::Remove),
953     reinterpret_cast<uintptr_t>(List::Has),
954     reinterpret_cast<uintptr_t>(List::IsEmpty),
955     reinterpret_cast<uintptr_t>(List::Get),
956     reinterpret_cast<uintptr_t>(List::GetIndexOf),
957     reinterpret_cast<uintptr_t>(List::GetLastIndexOf),
958     reinterpret_cast<uintptr_t>(List::Set),
959     reinterpret_cast<uintptr_t>(List::ForEach),
960     reinterpret_cast<uintptr_t>(List::ReplaceAllElements),
961     reinterpret_cast<uintptr_t>(List::GetIteratorObj),
962     reinterpret_cast<uintptr_t>(List::Equal),
963     reinterpret_cast<uintptr_t>(List::Sort),
964     reinterpret_cast<uintptr_t>(List::ConvertToArray),
965     reinterpret_cast<uintptr_t>(List::GetSubList),
966     reinterpret_cast<uintptr_t>(List::Length),
967     reinterpret_cast<uintptr_t>(JSAPIListIterator::Next),
968     reinterpret_cast<uintptr_t>(LinkedList::LinkedListConstructor),
969     reinterpret_cast<uintptr_t>(LinkedList::Add),
970     reinterpret_cast<uintptr_t>(LinkedList::GetFirst),
971     reinterpret_cast<uintptr_t>(LinkedList::GetLast),
972     reinterpret_cast<uintptr_t>(LinkedList::Insert),
973     reinterpret_cast<uintptr_t>(LinkedList::AddFirst),
974     reinterpret_cast<uintptr_t>(LinkedList::Clear),
975     reinterpret_cast<uintptr_t>(LinkedList::Clone),
976     reinterpret_cast<uintptr_t>(LinkedList::Has),
977     reinterpret_cast<uintptr_t>(LinkedList::Get),
978     reinterpret_cast<uintptr_t>(LinkedList::GetIndexOf),
979     reinterpret_cast<uintptr_t>(LinkedList::GetLastIndexOf),
980     reinterpret_cast<uintptr_t>(LinkedList::RemoveByIndex),
981     reinterpret_cast<uintptr_t>(LinkedList::Remove),
982     reinterpret_cast<uintptr_t>(LinkedList::RemoveFirst),
983     reinterpret_cast<uintptr_t>(LinkedList::RemoveLast),
984     reinterpret_cast<uintptr_t>(LinkedList::RemoveFirstFound),
985     reinterpret_cast<uintptr_t>(LinkedList::RemoveLastFound),
986     reinterpret_cast<uintptr_t>(LinkedList::Set),
987     reinterpret_cast<uintptr_t>(LinkedList::ConvertToArray),
988     reinterpret_cast<uintptr_t>(LinkedList::ForEach),
989     reinterpret_cast<uintptr_t>(JSAPILinkedListIterator::Next),
990 
991     // not builtins method
992     reinterpret_cast<uintptr_t>(JSFunction::PrototypeSetter),
993     reinterpret_cast<uintptr_t>(JSFunction::PrototypeGetter),
994     reinterpret_cast<uintptr_t>(JSFunction::NameGetter),
995     reinterpret_cast<uintptr_t>(JSFunction::LengthGetter),
996     reinterpret_cast<uintptr_t>(JSArray::LengthSetter),
997     reinterpret_cast<uintptr_t>(JSArray::LengthGetter),
998     reinterpret_cast<uintptr_t>(JSPandaFileManager::GetInstance)
999 };
1000 
Initialize()1001 void SnapshotProcessor::Initialize()
1002 {
1003     auto heap = const_cast<Heap *>(vm_->GetHeap());
1004     size_t oldSpaceCapacity = heap->GetOldSpace()->GetInitialCapacity();
1005     oldLocalSpace_ = new LocalSpace(heap, oldSpaceCapacity, oldSpaceCapacity);
1006     size_t nonMovableCapacity = heap->GetNonMovableSpace()->GetInitialCapacity();
1007     nonMovableLocalSpace_ = new LocalSpace(heap, nonMovableCapacity, nonMovableCapacity);
1008     size_t machineCodeCapacity = heap->GetMachineCodeSpace()->GetInitialCapacity();
1009     machineCodeLocalSpace_ = new LocalSpace(heap, machineCodeCapacity, machineCodeCapacity);
1010     size_t snapshotSpaceCapacity = heap->GetSnapshotSpace()->GetMaximumCapacity();
1011     snapshotLocalSpace_ = new SnapshotSpace(heap, snapshotSpaceCapacity, snapshotSpaceCapacity);
1012     hugeObjectLocalSpace_ = new HugeObjectSpace(heap, heap->GetHeapRegionAllocator(),
1013                                                 oldSpaceCapacity, oldSpaceCapacity);
1014 }
1015 
~SnapshotProcessor()1016 SnapshotProcessor::~SnapshotProcessor()
1017 {
1018     pandaMethod_.clear();
1019     stringVector_.clear();
1020     deserializeStringVector_.clear();
1021     regionIndexMap_.clear();
1022     if (oldLocalSpace_ != nullptr) {
1023         oldLocalSpace_->Reset();
1024         delete oldLocalSpace_;
1025         oldLocalSpace_ = nullptr;
1026     }
1027     if (nonMovableLocalSpace_ != nullptr) {
1028         nonMovableLocalSpace_->Reset();
1029         delete nonMovableLocalSpace_;
1030         nonMovableLocalSpace_ = nullptr;
1031     }
1032     if (machineCodeLocalSpace_ != nullptr) {
1033         machineCodeLocalSpace_->Reset();
1034         delete machineCodeLocalSpace_;
1035         machineCodeLocalSpace_ = nullptr;
1036     }
1037     if (snapshotLocalSpace_ != nullptr) {
1038         snapshotLocalSpace_->Destroy();
1039         delete snapshotLocalSpace_;
1040         snapshotLocalSpace_ = nullptr;
1041     }
1042     if (hugeObjectLocalSpace_ != nullptr) {
1043         hugeObjectLocalSpace_->Destroy();
1044         delete hugeObjectLocalSpace_;
1045         hugeObjectLocalSpace_ = nullptr;
1046     }
1047 }
1048 
StopAllocate()1049 void SnapshotProcessor::StopAllocate()
1050 {
1051     oldLocalSpace_->Stop();
1052     nonMovableLocalSpace_->Stop();
1053     machineCodeLocalSpace_->Stop();
1054     snapshotLocalSpace_->Stop();
1055 }
1056 
WriteObjectToFile(std::fstream &writer)1057 void SnapshotProcessor::WriteObjectToFile(std::fstream &writer)
1058 {
1059     WriteSpaceObjectToFile(oldLocalSpace_, writer);
1060     WriteSpaceObjectToFile(nonMovableLocalSpace_, writer);
1061     WriteSpaceObjectToFile(machineCodeLocalSpace_, writer);
1062     WriteSpaceObjectToFile(snapshotLocalSpace_, writer);
1063     WriteHugeObjectToFile(hugeObjectLocalSpace_, writer);
1064 }
1065 
WriteSpaceObjectToFile(Space* space, std::fstream &writer)1066 void SnapshotProcessor::WriteSpaceObjectToFile(Space* space, std::fstream &writer)
1067 {
1068     size_t regionCount = space->GetRegionCount();
1069     if (regionCount > 0) {
1070         auto lastRegion = space->GetCurrentRegion();
1071         space->EnumerateRegions([this, &writer, lastRegion](Region *current) {
1072             if (current != lastRegion) {
1073                 ASAN_UNPOISON_MEMORY_REGION(reinterpret_cast<void *>(ToUintPtr(current)), DEFAULT_REGION_SIZE);
1074                 ResetRegionUnusedRange(current);
1075                 SnapshotRegionHeadInfo info = GenerateRegionHeadInfo(current);
1076                 // Firstly, serialize the region head information into the file;
1077                 writer.write(reinterpret_cast<char *>(&info), SnapshotRegionHeadInfo::RegionHeadInfoSize());
1078                 // Secondly, write the valid region memory (exclude region head and GC bit set).
1079                 writer.write(reinterpret_cast<char *>(current->packedData_.begin_),
1080                              ToUintPtr(current) + DEFAULT_REGION_SIZE - current->packedData_.begin_);
1081                 writer.flush();
1082             }
1083         });
1084 
1085         SnapshotRegionHeadInfo info = GenerateRegionHeadInfo(lastRegion);
1086         // Firstly, serialize the region object into the file;
1087         writer.write(reinterpret_cast<char *>(&info), SnapshotRegionHeadInfo::RegionHeadInfoSize());
1088         // Secondly, write the valid region memory (exclude region head and GC bit set).
1089         writer.write(reinterpret_cast<char *>(lastRegion->packedData_.begin_),
1090                      lastRegion->highWaterMark_ - lastRegion->packedData_.begin_);
1091         writer.flush();
1092     }
1093 }
1094 
WriteHugeObjectToFile(HugeObjectSpace* space, std::fstream &writer)1095 void SnapshotProcessor::WriteHugeObjectToFile(HugeObjectSpace* space, std::fstream &writer)
1096 {
1097     space->EnumerateRegions([&writer](Region *region) {
1098         SnapshotRegionHeadInfo info;
1099         info.regionIndex_ = SnapshotHelper::GetHugeObjectRegionIndex(region->GetSnapshotData());
1100         size_t objSize = SnapshotHelper::GetHugeObjectSize(region->GetSnapshotData());
1101         info.aliveObjectSize_ = objSize;
1102         // Firstly, serialize the region head information into the file;
1103         writer.write(reinterpret_cast<char *>(&info), SnapshotRegionHeadInfo::RegionHeadInfoSize());
1104         // Secondly, write the valid region memory (exclude region head and GC bit set).
1105         writer.write(reinterpret_cast<char *>(region->packedData_.begin_), objSize);
1106         writer.flush();
1107     });
1108 }
1109 
StatisticsObjectSize()1110 std::vector<uint32_t> SnapshotProcessor::StatisticsObjectSize()
1111 {
1112     std::vector<uint32_t> objSizeVector;
1113     objSizeVector.emplace_back(StatisticsSpaceObjectSize(oldLocalSpace_));
1114     objSizeVector.emplace_back(StatisticsSpaceObjectSize(nonMovableLocalSpace_));
1115     objSizeVector.emplace_back(StatisticsSpaceObjectSize(machineCodeLocalSpace_));
1116     objSizeVector.emplace_back(StatisticsSpaceObjectSize(snapshotLocalSpace_));
1117     objSizeVector.emplace_back(StatisticsHugeObjectSize(hugeObjectLocalSpace_));
1118     return objSizeVector;
1119 }
1120 
StatisticsSpaceObjectSize(Space* space)1121 uint32_t SnapshotProcessor::StatisticsSpaceObjectSize(Space* space)
1122 {
1123     size_t regionCount = space->GetRegionCount();
1124     size_t objSize = 0U;
1125     if (regionCount > 0) {
1126         auto lastRegion = space->GetCurrentRegion();
1127         size_t lastRegionSize = lastRegion->highWaterMark_ - lastRegion->packedData_.begin_;
1128         objSize = (regionCount - 1) * (SnapshotRegionHeadInfo::RegionHeadInfoSize() +
1129             Region::GetRegionAvailableSize()) + SnapshotRegionHeadInfo::RegionHeadInfoSize() + lastRegionSize;
1130     }
1131     ASSERT(objSize <= Constants::MAX_UINT_32);
1132     return static_cast<uint32_t>(objSize);
1133 }
1134 
StatisticsHugeObjectSize(HugeObjectSpace* space)1135 uint32_t SnapshotProcessor::StatisticsHugeObjectSize(HugeObjectSpace* space)
1136 {
1137     size_t objSize = 0U;
1138     space->EnumerateRegions([&objSize](Region *region) {
1139         objSize += SnapshotRegionHeadInfo::RegionHeadInfoSize();
1140         uint64_t snapshotData = region->GetSnapshotData();
1141         // huge object size is storaged in region param snapshotData_ high 32 bits
1142         objSize += SnapshotHelper::GetHugeObjectSize(snapshotData);
1143     });
1144     return static_cast<uint32_t>(objSize);
1145 }
1146 
ProcessObjectQueue(CQueue<TaggedObject *> *queue, std::unordered_map<uint64_t, ObjectEncode> *data)1147 void SnapshotProcessor::ProcessObjectQueue(CQueue<TaggedObject *> *queue,
1148                                            std::unordered_map<uint64_t, ObjectEncode> *data)
1149 {
1150     while (!queue->empty()) {
1151         auto taggedObject = queue->front();
1152         if (taggedObject == nullptr) {
1153             break;
1154         }
1155         queue->pop();
1156         SerializeObject(taggedObject, queue, data);
1157     }
1158 
1159     StopAllocate();
1160 }
1161 
AllocateObjectToLocalSpace(Space *space, size_t objectSize)1162 uintptr_t SnapshotProcessor::AllocateObjectToLocalSpace(Space *space, size_t objectSize)
1163 {
1164     uintptr_t newObj = 0;
1165     if (space->GetSpaceType() == MemSpaceType::HUGE_OBJECT_SPACE) {
1166         newObj = reinterpret_cast<HugeObjectSpace *>(space)->Allocate(objectSize, vm_->GetAssociatedJSThread());
1167     } else if (space->GetSpaceType() == MemSpaceType::SNAPSHOT_SPACE) {
1168         newObj = reinterpret_cast<SnapshotSpace *>(space)->Allocate(objectSize);
1169     } else {
1170         newObj = reinterpret_cast<LocalSpace *>(space)->Allocate(objectSize);
1171     }
1172     auto current = space->GetCurrentRegion();
1173     if (newObj == current->GetBegin()) {
1174         // region param snapshotData_ low 32 bits is reused to record regionIndex
1175         uint64_t snapshotData = regionIndex_;
1176         if (current->InHugeObjectSpace()) {
1177             // region param snapshotData_ high 32 bits is reused to record huge object size
1178             snapshotData += SnapshotHelper::EncodeHugeObjectSize(objectSize);
1179         }
1180         current->SetSnapshotData(snapshotData);
1181         regionIndex_++;
1182     }
1183     return newObj;
1184 }
1185 
SetObjectEncodeField(uintptr_t obj, size_t offset, uint64_t value)1186 void SnapshotProcessor::SetObjectEncodeField(uintptr_t obj, size_t offset, uint64_t value)
1187 {
1188     *reinterpret_cast<uint64_t *>(obj + offset) = value;
1189 }
1190 
DeserializeObjectExcludeString(uintptr_t oldSpaceBegin, size_t oldSpaceObjSize, size_t nonMovableObjSize, size_t machineCodeObjSize, size_t snapshotObjSize, size_t hugeSpaceObjSize)1191 void SnapshotProcessor::DeserializeObjectExcludeString(uintptr_t oldSpaceBegin, size_t oldSpaceObjSize,
1192                                                        size_t nonMovableObjSize, size_t machineCodeObjSize,
1193                                                        size_t snapshotObjSize, size_t hugeSpaceObjSize)
1194 {
1195     uintptr_t nonMovableBegin = oldSpaceBegin + oldSpaceObjSize;
1196     uintptr_t machineCodeBegin = nonMovableBegin + nonMovableObjSize;
1197     uintptr_t snapshotBegin = machineCodeBegin + machineCodeObjSize;
1198     uintptr_t hugeObjBegin = snapshotBegin + snapshotObjSize;
1199     auto heap = vm_->GetHeap();
1200     auto oldSpace = heap->GetOldSpace();
1201     auto nonMovableSpace = heap->GetNonMovableSpace();
1202     auto machineCodeSpace = heap->GetMachineCodeSpace();
1203     auto snapshotSpace = heap->GetSnapshotSpace();
1204     auto hugeObjectSpace = heap->GetHugeObjectSpace();
1205 
1206     DeserializeSpaceObject(oldSpaceBegin, oldSpace, oldSpaceObjSize);
1207     DeserializeSpaceObject(nonMovableBegin, nonMovableSpace, nonMovableObjSize);
1208     DeserializeSpaceObject(machineCodeBegin, machineCodeSpace, machineCodeObjSize);
1209     DeserializeSpaceObject(snapshotBegin, snapshotSpace, snapshotObjSize);
1210     DeserializeHugeSpaceObject(hugeObjBegin, hugeObjectSpace, hugeSpaceObjSize);
1211     snapshotSpace->ResetAllocator();
1212 }
1213 
DeserializeSpaceObject(uintptr_t beginAddr, Space* space, size_t spaceObjSize)1214 void SnapshotProcessor::DeserializeSpaceObject(uintptr_t beginAddr, Space* space, size_t spaceObjSize)
1215 {
1216     size_t numberOfRegions = 0U;
1217     if (spaceObjSize != 0) {
1218         numberOfRegions = (spaceObjSize - 1) / (Region::GetRegionAvailableSize() +
1219             SnapshotRegionHeadInfo::RegionHeadInfoSize()) + 1;
1220     }
1221     for (size_t i = 0; i < numberOfRegions; i++) {
1222         Region *region = vm_->GetHeapRegionAllocator()->AllocateAlignedRegion(
1223             space, DEFAULT_REGION_SIZE, vm_->GetAssociatedJSThread(), const_cast<Heap *>(vm_->GetHeap()));
1224         auto info = ToNativePtr<SnapshotRegionHeadInfo>(beginAddr +
1225             i * (Region::GetRegionAvailableSize() + SnapshotRegionHeadInfo::RegionHeadInfoSize()));
1226         uintptr_t objectBeginAddr = ToUintPtr(info) + SnapshotRegionHeadInfo::RegionHeadInfoSize();
1227         size_t regionIndex = info->regionIndex_;
1228         size_t liveObjectSize = info->aliveObjectSize_;
1229         regionIndexMap_.emplace(regionIndex, region);
1230 
1231         ASAN_UNPOISON_MEMORY_REGION(reinterpret_cast<void *>(region->packedData_.begin_), liveObjectSize);
1232         if (memcpy_s(ToVoidPtr(region->packedData_.begin_),
1233                      liveObjectSize,
1234                      ToVoidPtr(objectBeginAddr),
1235                      liveObjectSize) != EOK) {
1236             LOG_FULL(FATAL) << "memcpy_s failed";
1237             UNREACHABLE();
1238         }
1239 
1240         // Other information like aliveObject size, highWaterMark etc. in the region object to restore.
1241         region->aliveObject_ = liveObjectSize;
1242         region->highWaterMark_ = region->packedData_.begin_ + liveObjectSize;
1243         region->SetGCFlag(RegionGCFlags::NEED_RELOCATE);
1244 
1245         if (space->GetSpaceType() != MemSpaceType::SNAPSHOT_SPACE) {
1246             auto sparseSpace = reinterpret_cast<SparseSpace *>(space);
1247             sparseSpace->FreeLiveRange(region, region->GetHighWaterMark(), region->GetEnd(), true);
1248             sparseSpace->IncreaseLiveObjectSize(liveObjectSize);
1249             sparseSpace->IncreaseAllocatedSize(liveObjectSize);
1250             sparseSpace->AddRegion(region);
1251         } else {
1252             auto snapshotSpace = reinterpret_cast<SnapshotSpace *>(space);
1253             snapshotSpace->IncreaseLiveObjectSize(liveObjectSize);
1254             snapshotSpace->AddRegion(region);
1255         }
1256     }
1257 }
1258 
DeserializeHugeSpaceObject(uintptr_t beginAddr, HugeObjectSpace* space, size_t hugeSpaceObjSize)1259 void SnapshotProcessor::DeserializeHugeSpaceObject(uintptr_t beginAddr, HugeObjectSpace* space, size_t hugeSpaceObjSize)
1260 {
1261     uintptr_t currentAddr = beginAddr;
1262     uintptr_t endAddr = beginAddr + hugeSpaceObjSize;
1263     while (currentAddr < endAddr) {
1264         auto info = ToNativePtr<SnapshotRegionHeadInfo>(currentAddr);
1265         // Retrieve the data beginning address based on the serialized data format.
1266         uintptr_t copyFrom = ToUintPtr(info) + SnapshotRegionHeadInfo::RegionHeadInfoSize();
1267         size_t objSize = info->aliveObjectSize_;
1268         size_t alignedRegionObjSize = AlignUp(sizeof(Region), static_cast<size_t>(MemAlignment::MEM_ALIGN_REGION));
1269         size_t hugeRegionHeadSize = AlignUp(alignedRegionObjSize + GCBitset::BYTE_PER_WORD,
1270                                             static_cast<size_t>(MemAlignment::MEM_ALIGN_OBJECT));
1271 
1272         ASSERT(objSize > MAX_REGULAR_HEAP_OBJECT_SIZE);
1273         size_t alignedHugeRegionSize = AlignUp(objSize + hugeRegionHeadSize, PANDA_POOL_ALIGNMENT_IN_BYTES);
1274         Region *region = vm_->GetHeapRegionAllocator()->AllocateAlignedRegion(
1275             space, alignedHugeRegionSize, vm_->GetAssociatedJSThread(), const_cast<Heap *>(vm_->GetHeap()));
1276         size_t regionIndex = info->regionIndex_;
1277         regionIndexMap_.emplace(regionIndex, region);
1278 
1279         ASAN_UNPOISON_MEMORY_REGION(reinterpret_cast<void *>(region->packedData_.begin_), objSize);
1280         if (memcpy_s(ToVoidPtr(region->packedData_.begin_),
1281                      objSize,
1282                      ToVoidPtr(copyFrom),
1283                      objSize) != EOK) {
1284             LOG_FULL(FATAL) << "memcpy_s failed";
1285             UNREACHABLE();
1286         }
1287 
1288         // Other information like aliveObject size, highWaterMark etc. in the region object to restore.
1289         region->aliveObject_ = objSize;
1290         region->highWaterMark_ = region->packedData_.begin_ + objSize;
1291         region->SetGCFlag(RegionGCFlags::NEED_RELOCATE);
1292         space->AddRegion(region);
1293 
1294         currentAddr += SnapshotRegionHeadInfo::RegionHeadInfoSize();
1295         currentAddr += objSize;
1296     }
1297 }
1298 
DeserializeString(uintptr_t stringBegin, uintptr_t stringEnd)1299 void SnapshotProcessor::DeserializeString(uintptr_t stringBegin, uintptr_t stringEnd)
1300 {
1301     EcmaStringTable *stringTable = vm_->GetEcmaStringTable();
1302     JSThread *thread = vm_->GetJSThread();
1303     ASSERT(deserializeStringVector_.empty());
1304     auto hugeSpace = sHeap_->GetHugeObjectSpace();
1305     auto globalConst = const_cast<GlobalEnvConstants *>(thread->GlobalConstants());
1306     auto lineStringClass = globalConst->GetLineStringClass();
1307     auto constantStringClass = globalConst->GetConstantStringClass();
1308     while (stringBegin < stringEnd) {
1309         // str is from snapshot file, which is in native heap.
1310         EcmaString *str = reinterpret_cast<EcmaString *>(stringBegin);
1311         int index = JSTaggedValue(*(reinterpret_cast<JSTaggedType *>(str))).GetInt();
1312         if (index == 1) {
1313             str->SetClassWithoutBarrier(reinterpret_cast<JSHClass *>(constantStringClass.GetTaggedObject()));
1314             std::shared_ptr<JSPandaFile> jsPandaFile = JSPandaFileManager::GetInstance()->FindMergedJSPandaFile();
1315             if (jsPandaFile != nullptr) {
1316                 auto constantStr = ConstantString::Cast(str);
1317                 uint32_t id = constantStr->GetEntityIdU32();
1318                 auto stringData = jsPandaFile->GetStringData(EntityId(id)).data;
1319                 constantStr->SetConstantData(const_cast<uint8_t *>(stringData));
1320                 constantStr->SetRelocatedData(thread, JSTaggedValue::Undefined(), BarrierMode::SKIP_BARRIER);
1321             } else {
1322                 LOG_ECMA_MEM(FATAL) << "JSPandaFile is nullptr";
1323             }
1324         } else {
1325             ASSERT(index == 0);
1326             str->SetClassWithoutBarrier(reinterpret_cast<JSHClass *>(lineStringClass.GetTaggedObject()));
1327         }
1328         size_t strSize = EcmaStringAccessor(str).ObjectSize();
1329         strSize = AlignUp(strSize, static_cast<size_t>(MemAlignment::MEM_ALIGN_OBJECT));
1330         {
1331             auto hashcode = EcmaStringAccessor(str).GetHashcode();
1332             RuntimeLockHolder locker(thread,
1333                 stringTable->stringTable_[EcmaStringTable::GetTableId(hashcode)].mutex_);
1334             auto strFromTable = stringTable->GetStringWithHashThreadUnsafe(str, hashcode);
1335             if (strFromTable) {
1336                 deserializeStringVector_.emplace_back(thread, strFromTable);
1337             } else {
1338                 uintptr_t newObj = 0;
1339                 if (UNLIKELY(strSize > MAX_REGULAR_HEAP_OBJECT_SIZE)) {
1340                     newObj = hugeSpace->Allocate(thread, strSize);
1341                 } else {
1342                     newObj = sHeap_->GetOldSpace()->TryAllocateAndExpand(thread, strSize, true);
1343                 }
1344                 if (newObj == 0) {
1345                     LOG_ECMA_MEM(FATAL) << "Snapshot Allocate OldSharedSpace OOM";
1346                     UNREACHABLE();
1347                 }
1348                 if (memcpy_s(ToVoidPtr(newObj), strSize, str, strSize) != EOK) {
1349                     LOG_FULL(FATAL) << "memcpy_s failed";
1350                     UNREACHABLE();
1351                 }
1352                 str = reinterpret_cast<EcmaString *>(newObj);
1353                 stringTable->InsertStringToTableWithHashThreadUnsafe(str, hashcode);
1354                 deserializeStringVector_.emplace_back(thread, str);
1355             }
1356         }
1357         stringBegin += strSize;
1358     }
1359 }
1360 
DeserializePandaMethod(uintptr_t begin, uintptr_t end, MethodLiteral *methods, size_t &methodNums, size_t &others)1361 void SnapshotProcessor::DeserializePandaMethod(uintptr_t begin, uintptr_t end, MethodLiteral *methods,
1362                                                size_t &methodNums, size_t &others)
1363 {
1364     for (size_t i = 0; i < others; i++) {
1365         pandaMethod_.emplace_back(begin);
1366         auto method = reinterpret_cast<Method *>(begin);
1367         if (memcpy_s(methods + (--methodNums), Method::Size(), method, Method::Size()) != EOK) {
1368             LOG_FULL(FATAL) << "memcpy_s failed";
1369             UNREACHABLE();
1370         }
1371         begin += Method::Size();
1372         if (begin >= end) {
1373             others = others - i - 1;
1374         }
1375     }
1376 }
1377 
HandleRootObject(SnapshotType type, uintptr_t rootObjectAddr, size_t objType, size_t &constSpecialIndex)1378 void SnapshotProcessor::HandleRootObject(SnapshotType type, uintptr_t rootObjectAddr,
1379                                          size_t objType, size_t &constSpecialIndex)
1380 {
1381     switch (type) {
1382         case SnapshotType::VM_ROOT: {
1383             if (JSType(objType) == JSType::GLOBAL_ENV) {
1384                 vm_->GetJSThread()->GetCurrentEcmaContext()->SetGlobalEnv(
1385                     reinterpret_cast<GlobalEnv *>(rootObjectAddr));
1386             } else if (JSType(objType) == JSType::MICRO_JOB_QUEUE) {
1387                 vm_->GetJSThread()->GetCurrentEcmaContext()->SetMicroJobQueue(
1388                     reinterpret_cast<job::MicroJobQueue *>(rootObjectAddr));
1389             }
1390             break;
1391         }
1392         case SnapshotType::BUILTINS: {
1393             JSTaggedValue result(static_cast<JSTaggedType>(rootObjectAddr));
1394             auto constants = const_cast<GlobalEnvConstants *>(vm_->GetJSThread()->GlobalConstants());
1395             size_t constCount = constants->GetConstantCount();
1396             while (constants->IsSpecialOrUndefined(constSpecialIndex)) {
1397                 constSpecialIndex++; // Skip special or undefined value
1398             }
1399             if (constSpecialIndex < constCount) {
1400                 constants->SetConstant(ConstantIndex(constSpecialIndex), result);
1401             } else {
1402                 vm_->GetJSThread()->GetCurrentEcmaContext()->SetGlobalEnv(
1403                     reinterpret_cast<GlobalEnv *>(rootObjectAddr));
1404             }
1405             constSpecialIndex++;
1406             break;
1407         }
1408         case SnapshotType::AI: {
1409             JSTaggedValue item = JSTaggedValue(static_cast<JSTaggedType>(rootObjectAddr));
1410             if (!isRootObjRelocate_ && item.IsTaggedArray()) {
1411                 root_ = item;
1412                 isRootObjRelocate_ = true;
1413             }
1414             break;
1415         }
1416         default:
1417             break;
1418     }
1419 }
1420 
AddRootObjectToAOTFileManager(SnapshotType type, const CString &fileName)1421 void SnapshotProcessor::AddRootObjectToAOTFileManager(SnapshotType type, const CString &fileName)
1422 {
1423     if (type == SnapshotType::AI) {
1424         ASSERT(!root_.IsHole());
1425         AOTFileManager *aotFileManager = vm_->GetAOTFileManager();
1426         aotFileManager->ParseDeserializedData(fileName, root_);
1427     }
1428 }
1429 
SerializeObject(TaggedObject *objectHeader, CQueue<TaggedObject *> *queue, std::unordered_map<uint64_t, ObjectEncode> *data)1430 void SnapshotProcessor::SerializeObject(TaggedObject *objectHeader, CQueue<TaggedObject *> *queue,
1431                                         std::unordered_map<uint64_t, ObjectEncode> *data)
1432 {
1433     auto hclass = objectHeader->GetClass();
1434     JSType objectType = hclass->GetObjectType();
1435     uintptr_t snapshotObj = 0;
1436     if (UNLIKELY(data->find(ToUintPtr(objectHeader)) == data->end())) {
1437         LOG_FULL(FATAL) << "Data map can not find object";
1438         UNREACHABLE();
1439     } else {
1440         snapshotObj = data->find(ToUintPtr(objectHeader))->second.first;
1441     }
1442 
1443     // header
1444     EncodeBit encodeBit = SerializeObjectHeader(objectHeader, static_cast<size_t>(objectType), queue, data);
1445     SetObjectEncodeField(snapshotObj, 0, encodeBit.GetValue());
1446 
1447     auto visitor = [this, snapshotObj, queue, data](TaggedObject *root, ObjectSlot start, ObjectSlot end,
1448                                                     VisitObjectArea area) {
1449         int index = 0;
1450         for (ObjectSlot slot = start; slot < end; slot++) {
1451             if (area == VisitObjectArea::NATIVE_POINTER) {
1452                 auto nativePointer = *reinterpret_cast<void **>(slot.SlotAddress());
1453                 SetObjectEncodeField(snapshotObj, slot.SlotAddress() - ToUintPtr(root),
1454                                      NativePointerToEncodeBit(nativePointer).GetValue());
1455             } else {
1456                 if (VisitObjectBodyWithRep(root, slot, snapshotObj, index, area)) {
1457                     continue;
1458                 }
1459                 auto fieldAddr = reinterpret_cast<JSTaggedType *>(slot.SlotAddress());
1460                 SetObjectEncodeField(snapshotObj, slot.SlotAddress() - ToUintPtr(root),
1461                                      SerializeTaggedField(fieldAddr, queue, data));
1462             }
1463         }
1464     };
1465 
1466     ObjectXRay::VisitObjectBody<VisitType::SNAPSHOT_VISIT>(objectHeader, objectHeader->GetClass(), visitor);
1467 }
1468 
VisitObjectBodyWithRep(TaggedObject *root, ObjectSlot slot, uintptr_t obj, int index, VisitObjectArea area)1469 bool SnapshotProcessor::VisitObjectBodyWithRep(TaggedObject *root, ObjectSlot slot, uintptr_t obj, int index,
1470     VisitObjectArea area)
1471 {
1472     if (area != VisitObjectArea::IN_OBJECT) {
1473         return false;
1474     }
1475     auto hclass = root->GetClass();
1476     ASSERT(!hclass->IsAllTaggedProp());
1477     auto layout = LayoutInfo::Cast(hclass->GetLayout().GetTaggedObject());
1478     auto attr = layout->GetAttr(index++);
1479     if (attr.GetRepresentation() == Representation::DOUBLE) {
1480         auto fieldAddr = reinterpret_cast<double *>(slot.SlotAddress());
1481         SetObjectEncodeField(obj, slot.SlotAddress() - ToUintPtr(root),
1482                              JSTaggedValue(*fieldAddr).GetRawData());
1483         return true;
1484     } else if (attr.GetRepresentation() == Representation::INT) {
1485         auto fieldAddr = reinterpret_cast<JSTaggedType *>(slot.SlotAddress());
1486         SetObjectEncodeField(obj, slot.SlotAddress() - ToUintPtr(root),
1487                              JSTaggedValue(static_cast<int32_t>(*fieldAddr)).GetRawData());
1488         return true;
1489     }
1490     return false;
1491 }
1492 
Relocate(SnapshotType type, const JSPandaFile *jsPandaFile, uint64_t rootObjSize)1493 void SnapshotProcessor::Relocate(SnapshotType type, const JSPandaFile *jsPandaFile, uint64_t rootObjSize)
1494 {
1495     size_t methodNums = 0;
1496     MethodLiteral *methods = nullptr;
1497     if (jsPandaFile) {
1498         methodNums = jsPandaFile->GetNumMethods();
1499         methods = jsPandaFile->GetMethodLiterals();
1500     }
1501 
1502     auto heap = vm_->GetHeap();
1503     auto oldSpace = heap->GetOldSpace();
1504     auto nonMovableSpace = heap->GetNonMovableSpace();
1505     auto machineCodeSpace = heap->GetMachineCodeSpace();
1506     auto snapshotSpace = heap->GetSnapshotSpace();
1507     auto hugeObjectSpace = heap->GetHugeObjectSpace();
1508 
1509     RelocateSpaceObject(jsPandaFile, oldSpace, type, methods, methodNums, rootObjSize);
1510     RelocateSpaceObject(jsPandaFile, nonMovableSpace, type, methods, methodNums, rootObjSize);
1511     RelocateSpaceObject(jsPandaFile, machineCodeSpace, type, methods, methodNums, rootObjSize);
1512     RelocateSpaceObject(jsPandaFile, snapshotSpace, type, methods, methodNums, rootObjSize);
1513     RelocateSpaceObject(jsPandaFile, hugeObjectSpace, type, methods, methodNums, rootObjSize);
1514 }
1515 
RelocateSpaceObject(const JSPandaFile *jsPandaFile, Space* space, SnapshotType type, MethodLiteral* methods, size_t methodNums, size_t rootObjSize)1516 void SnapshotProcessor::RelocateSpaceObject(const JSPandaFile *jsPandaFile, Space* space, SnapshotType type,
1517                                             MethodLiteral* methods, size_t methodNums, size_t rootObjSize)
1518 {
1519     size_t others = 0;
1520     size_t objIndex = 0;
1521     size_t constSpecialIndex = 0;
1522     EcmaStringTable *stringTable = vm_->GetEcmaStringTable();
1523     space->EnumerateRegions([jsPandaFile, stringTable, &others, &objIndex, &rootObjSize, &constSpecialIndex,
1524                             &type, this, methods, &methodNums](Region *current) {
1525         if (!current->NeedRelocate()) {
1526             return;
1527         }
1528         current->ClearGCFlag(RegionGCFlags::NEED_RELOCATE);
1529         size_t allocated = current->GetAllocatedBytes();
1530         uintptr_t begin = current->GetBegin();
1531         uintptr_t end = begin + allocated;
1532         while (begin < end) {
1533             if (others != 0) {
1534                 DeserializePandaMethod(begin, end, methods, methodNums, others);
1535                 break;
1536             }
1537             EncodeBit encodeBit(*reinterpret_cast<uint64_t *>(begin));
1538             auto objType = encodeBit.GetObjectType();
1539             if (objType == Constants::MASK_METHOD_SPACE_BEGIN) {
1540                 begin += sizeof(uint64_t);
1541                 others = encodeBit.GetNativePointerOrObjectIndex();
1542                 DeserializePandaMethod(begin, end, methods, methodNums, others);
1543                 break;
1544             }
1545             TaggedObject *objectHeader = reinterpret_cast<TaggedObject *>(begin);
1546             DeserializeClassWord(objectHeader);
1547             DeserializeField(objectHeader);
1548             if (builtinsDeserialize_ &&
1549                 (JSType(objType) >= JSType::STRING_FIRST && JSType(objType) <= JSType::STRING_LAST)) {
1550                 auto str = reinterpret_cast<EcmaString *>(begin);
1551                 EcmaStringAccessor(str).ClearInternString();
1552                 stringTable->InsertStringIfNotExistThreadUnsafe(str);
1553                 if (JSType(objType) == JSType::CONSTANT_STRING) {
1554                     auto constantStr = ConstantString::Cast(str);
1555                     uint32_t id = constantStr->GetEntityIdU32();
1556                     auto stringData = jsPandaFile->GetStringData(EntityId(id)).data;
1557                     constantStr->SetConstantData(const_cast<uint8_t *>(stringData));
1558                 }
1559             }
1560             if (objIndex < rootObjSize) {
1561                 HandleRootObject(type, begin, objType, constSpecialIndex);
1562             }
1563             begin = begin + AlignUp(objectHeader->GetClass()->SizeFromJSHClass(objectHeader),
1564                                     static_cast<size_t>(MemAlignment::MEM_ALIGN_OBJECT));
1565             objIndex++;
1566         }
1567     });
1568 }
1569 
SerializeObjectHeader(TaggedObject *objectHeader, size_t objectType, CQueue<TaggedObject *> *queue, std::unordered_map<uint64_t, ObjectEncode> *data)1570 EncodeBit SnapshotProcessor::SerializeObjectHeader(TaggedObject *objectHeader, size_t objectType,
1571                                                    CQueue<TaggedObject *> *queue,
1572                                                    std::unordered_map<uint64_t, ObjectEncode> *data)
1573 {
1574     auto hclass = objectHeader->GetClass();
1575     ASSERT(hclass != nullptr);
1576     EncodeBit encodeBit(0);
1577     if (data->find(ToUintPtr(hclass)) == data->end()) {
1578         encodeBit = EncodeTaggedObject(hclass, queue, data);
1579     } else {
1580         ObjectEncode objectEncodePair = data->find(ToUintPtr(hclass))->second;
1581         encodeBit = objectEncodePair.second;
1582     }
1583     encodeBit.SetObjectType(objectType);
1584     return encodeBit;
1585 }
1586 
SerializeTaggedField(JSTaggedType *tagged, CQueue<TaggedObject *> *queue, std::unordered_map<uint64_t, ObjectEncode> *data)1587 uint64_t SnapshotProcessor::SerializeTaggedField(JSTaggedType *tagged, CQueue<TaggedObject *> *queue,
1588                                                  std::unordered_map<uint64_t, ObjectEncode> *data)
1589 {
1590     JSTaggedValue taggedValue(*tagged);
1591     if (taggedValue.IsWeak()) {
1592         taggedValue.RemoveWeakTag();
1593         if (taggedValue.IsJSHClass()) {
1594             EncodeBit encodeBit = GetObjectEncode(taggedValue, queue, data);
1595             encodeBit.SetTSWeakObject();
1596             return encodeBit.GetValue();
1597         }
1598         EncodeBit special(JSTaggedValue::Undefined().GetRawData());
1599         special.SetObjectSpecial();
1600         return special.GetValue();
1601     }
1602 
1603     if (taggedValue.IsSpecial()) {
1604         EncodeBit special(taggedValue.GetRawData());
1605         special.SetObjectSpecial();
1606         return special.GetValue();  // special encode bit
1607     }
1608 
1609     if (!taggedValue.IsHeapObject()) {
1610         return taggedValue.GetRawData();  // not object
1611     }
1612 
1613     EncodeBit encodeBit = GetObjectEncode(taggedValue, queue, data);
1614 
1615     if (taggedValue.IsString()) {
1616         encodeBit.SetReferenceToString(true);
1617     }
1618     return encodeBit.GetValue();  // object
1619 }
1620 
DeserializeTaggedField(uint64_t *value, TaggedObject *root)1621 void SnapshotProcessor::DeserializeTaggedField(uint64_t *value, TaggedObject *root)
1622 {
1623     EncodeBit encodeBit(*value);
1624     if (!builtinsDeserialize_ && encodeBit.IsReference() && encodeBit.IsGlobalConstOrBuiltins()) {
1625         size_t index = encodeBit.GetNativePointerOrObjectIndex();
1626         auto object = vm_->GetSnapshotEnv()->RelocateRootObjectAddr(index);
1627         *value = object;
1628         WriteBarrier<WriteBarrierType::DESERIALIZE>(vm_->GetJSThread(), reinterpret_cast<void *>(value), 0, object);
1629         return;
1630     }
1631 
1632     if (!encodeBit.IsReference()) {
1633         return;
1634     }
1635 
1636     if (encodeBit.IsReference() && !encodeBit.IsSpecial()) {
1637         Region *rootRegion = Region::ObjectAddressToRange(ToUintPtr(root));
1638         uintptr_t taggedObjectAddr = TaggedObjectEncodeBitToAddr(encodeBit);
1639         Region *valueRegion = Region::ObjectAddressToRange(taggedObjectAddr);
1640         if (rootRegion->InGeneralOldSpace() && valueRegion->InGeneralNewSpace()) {
1641             // Should align with '8' in 64 and 32 bit platform
1642             ASSERT((ToUintPtr(value) % static_cast<uint8_t>(MemAlignment::MEM_ALIGN_OBJECT)) == 0);
1643             rootRegion->InsertOldToNewRSet((uintptr_t)value);
1644         }
1645         if (valueRegion->InSharedSweepableSpace()) {
1646             if (!rootRegion->InSharedHeap()) {
1647                 rootRegion->InsertLocalToShareRSet((uintptr_t)value);
1648             }
1649             // In deserializing can not use barriers, only mark the shared value to prevent markingbit being lost
1650             if (vm_->GetJSThread()->IsSharedConcurrentMarkingOrFinished()) {
1651                 ASSERT(DaemonThread::GetInstance()->IsConcurrentMarkingOrFinished());
1652                 valueRegion->AtomicMark(reinterpret_cast<void*>(taggedObjectAddr));
1653             }
1654         }
1655         *value = taggedObjectAddr;
1656         return;
1657     }
1658 
1659     if (encodeBit.IsSpecial()) {
1660         encodeBit.ClearObjectSpecialFlag();
1661         *value = encodeBit.GetValue();
1662     }
1663 }
1664 
DeserializeClassWord(TaggedObject *object)1665 void SnapshotProcessor::DeserializeClassWord(TaggedObject *object)
1666 {
1667     EncodeBit encodeBit(*reinterpret_cast<uint64_t *>(object));
1668     if (!builtinsDeserialize_ && encodeBit.IsGlobalConstOrBuiltins()) {
1669         size_t hclassIndex = encodeBit.GetNativePointerOrObjectIndex();
1670         auto globalConst = const_cast<GlobalEnvConstants *>(vm_->GetJSThread()->GlobalConstants());
1671         JSTaggedValue hclassValue = globalConst->GetGlobalConstantObject(hclassIndex);
1672         ASSERT(hclassValue.IsJSHClass());
1673         object->SynchronizedSetClass(vm_->GetJSThread(), JSHClass::Cast(hclassValue.GetTaggedObject()));
1674         return;
1675     }
1676     uintptr_t hclassAddr = TaggedObjectEncodeBitToAddr(encodeBit);
1677     object->SynchronizedSetClass(vm_->GetJSThread(), reinterpret_cast<JSHClass *>(hclassAddr));
1678 }
1679 
DeserializeField(TaggedObject *objectHeader)1680 void SnapshotProcessor::DeserializeField(TaggedObject *objectHeader)
1681 {
1682     auto visitor = [this]([[maybe_unused]] TaggedObject *root, ObjectSlot start, ObjectSlot end, VisitObjectArea area) {
1683         for (ObjectSlot slot = start; slot < end; slot++) {
1684             auto encodeBitAddr = reinterpret_cast<uint64_t *>(slot.SlotAddress());
1685             if (area == VisitObjectArea::NATIVE_POINTER) {
1686                 DeserializeNativePointer(encodeBitAddr);
1687             } else {
1688                 DeserializeTaggedField(encodeBitAddr, root);
1689             }
1690         }
1691     };
1692 
1693     ObjectXRay::VisitObjectBody<VisitType::SNAPSHOT_VISIT>(objectHeader, objectHeader->GetClass(), visitor);
1694 }
1695 
NativePointerToEncodeBit(void *nativePointer)1696 EncodeBit SnapshotProcessor::NativePointerToEncodeBit(void *nativePointer)
1697 {
1698     EncodeBit native(0);
1699     if (nativePointer != nullptr) {  // nativePointer
1700         size_t index = Constants::MAX_C_POINTER_INDEX;
1701 
1702         if (programSerialize_) {
1703             pandaMethod_.emplace_back(ToUintPtr(nativePointer));
1704             ASSERT(pandaMethod_.size() + GetNativeTableSize() <= Constants::MAX_UINT_16);
1705             ASSERT(pandaMethod_.size() + GetNativeTableSize() > 0);
1706             // NOLINTNEXTLINE(bugprone-narrowing-conversions, cppcoreguidelines-narrowing-conversions)
1707             index = pandaMethod_.size() + GetNativeTableSize() - 1;
1708         } else {
1709             index = SearchNativeMethodIndex(nativePointer);
1710         }
1711 
1712         LOG_ECMA_IF(index > Constants::MAX_C_POINTER_INDEX, FATAL) << "MAX_C_POINTER_INDEX: " << index;
1713         native.SetNativePointerOrObjectIndex(index);
1714     }
1715     return native;
1716 }
1717 
SearchNativeMethodIndex(void *nativePointer)1718 size_t SnapshotProcessor::SearchNativeMethodIndex(void *nativePointer)
1719 {
1720     for (size_t i = 0; i < GetNativeTableSize(); i++) {
1721         if (nativePointer == reinterpret_cast<void *>(g_nativeTable[i])) {
1722             return i;
1723         }
1724     }
1725 
1726     // not found
1727     LOG_FULL(FATAL) << "native method did not register in g_table, please register it first";
1728     UNREACHABLE();
1729 }
1730 
TaggedObjectEncodeBitToAddr(EncodeBit taggedBit)1731 uintptr_t SnapshotProcessor::TaggedObjectEncodeBitToAddr(EncodeBit taggedBit)
1732 {
1733     ASSERT(taggedBit.IsReference());
1734     if (!builtinsDeserialize_ && taggedBit.IsReferenceToString()) {
1735         size_t stringIndex = taggedBit.GetNativePointerOrObjectIndex();
1736         return reinterpret_cast<uintptr_t>(*deserializeStringVector_.at(stringIndex));
1737     }
1738     size_t regionIndex = taggedBit.GetRegionIndex();
1739     if (UNLIKELY(regionIndexMap_.find(regionIndex) == regionIndexMap_.end())) {
1740         LOG_FULL(FATAL) << "Snapshot deserialize can not find region by index";
1741     }
1742     Region *region = regionIndexMap_.find(regionIndex)->second;
1743     size_t objectOffset = taggedBit.GetObjectOffsetInRegion();
1744 
1745     uintptr_t addr = ToUintPtr(region) + objectOffset;
1746     if (taggedBit.IsTSWeakObject()) {
1747         JSTaggedValue object(static_cast<JSTaggedType>(addr));
1748         object.CreateWeakRef();
1749         addr = object.GetRawData();
1750     }
1751     return addr;
1752 }
1753 
DeserializeNativePointer(uint64_t *value)1754 void SnapshotProcessor::DeserializeNativePointer(uint64_t *value)
1755 {
1756     EncodeBit native(*value);
1757     size_t index = native.GetNativePointerOrObjectIndex();
1758     uintptr_t addr = 0U;
1759     size_t nativeTableSize = GetNativeTableSize();
1760     if (index < nativeTableSize) {
1761         addr = g_nativeTable[index];
1762     } else {
1763         addr = pandaMethod_.at(index - nativeTableSize);
1764     }
1765     *value = addr;
1766 }
1767 
SerializePandaFileMethod()1768 void SnapshotProcessor::SerializePandaFileMethod()
1769 {
1770     EncodeBit encodeBit(pandaMethod_.size());
1771     encodeBit.SetObjectType(Constants::MASK_METHOD_SPACE_BEGIN);
1772 
1773     ObjectFactory *factory = vm_->GetFactory();
1774     // panda method space begin
1775     uintptr_t snapshotObj = factory->NewSpaceBySnapshotAllocator(sizeof(uint64_t));
1776     if (snapshotObj == 0) {
1777         LOG_ECMA(ERROR) << "SnapshotAllocator OOM";
1778         return;
1779     }
1780     SetObjectEncodeField(snapshotObj, 0, encodeBit.GetValue());  // methods
1781 
1782     // panda methods
1783     for (auto &it : pandaMethod_) {
1784         // write method
1785         size_t methodObjSize = Method::Size();
1786         uintptr_t methodObj = factory->NewSpaceBySnapshotAllocator(methodObjSize);
1787         if (methodObj == 0) {
1788             LOG_ECMA(ERROR) << "SnapshotAllocator OOM";
1789             return;
1790         }
1791         if (memcpy_s(ToVoidPtr(methodObj), methodObjSize, ToVoidPtr(it), Method::Size()) != EOK) {
1792             LOG_FULL(FATAL) << "memcpy_s failed";
1793             UNREACHABLE();
1794         }
1795     }
1796 }
1797 
GetNewObj(size_t objectSize, TaggedObject *objectHeader)1798 uintptr_t SnapshotProcessor::GetNewObj(size_t objectSize, TaggedObject *objectHeader)
1799 {
1800     if (builtinsSerialize_) {
1801         return AllocateObjectToLocalSpace(snapshotLocalSpace_, objectSize);
1802     }
1803     auto region = Region::ObjectAddressToRange(objectHeader);
1804     if (region->InYoungOrOldSpace() || region->InSharedOldSpace()) {
1805         return AllocateObjectToLocalSpace(oldLocalSpace_, objectSize);
1806     }
1807     if (region->InMachineCodeSpace()) {
1808         return AllocateObjectToLocalSpace(machineCodeLocalSpace_, objectSize);
1809     }
1810     if (region->InNonMovableSpace() || region->InReadOnlySpace() ||
1811         region->InSharedNonMovableSpace() || region->InSharedReadOnlySpace()) {
1812         return AllocateObjectToLocalSpace(nonMovableLocalSpace_, objectSize);
1813     }
1814     if (region->InHugeObjectSpace() || region->InSharedHugeObjectSpace()) {
1815         return AllocateObjectToLocalSpace(hugeObjectLocalSpace_, objectSize);
1816     }
1817     return AllocateObjectToLocalSpace(snapshotLocalSpace_, objectSize);
1818 }
1819 
EncodeTaggedObject(TaggedObject *objectHeader, CQueue<TaggedObject *> *queue, std::unordered_map<uint64_t, ObjectEncode> *data)1820 EncodeBit SnapshotProcessor::EncodeTaggedObject(TaggedObject *objectHeader, CQueue<TaggedObject *> *queue,
1821                                                 std::unordered_map<uint64_t, ObjectEncode> *data)
1822 {
1823     if (!builtinsSerialize_) {
1824         // String duplicate
1825         if (objectHeader->GetClass()->IsString()) {
1826             ASSERT(stringVector_.size() < Constants::MAX_OBJECT_INDEX);
1827             EncodeBit encodeBit(stringVector_.size());
1828             if (EcmaStringAccessor(objectHeader).IsTreeString()) {
1829                 data->emplace(ToUintPtr(objectHeader), std::make_pair(0U, encodeBit));
1830                 objectHeader = EcmaStringAccessor::FlattenNoGCForSnapshot(vm_, EcmaString::Cast(objectHeader));
1831             }
1832             stringVector_.emplace_back(ToUintPtr(objectHeader));
1833             data->emplace(ToUintPtr(objectHeader), std::make_pair(0U, encodeBit));
1834             return encodeBit;
1835         }
1836 
1837         // builtins object reuse
1838         size_t index = vm_->GetSnapshotEnv()->FindEnvObjectIndex(ToUintPtr(objectHeader));
1839         if (index != SnapshotEnv::MAX_UINT_32) {
1840             EncodeBit encodeBit(index);
1841             encodeBit.SetGlobalConstOrBuiltins();
1842             data->emplace(ToUintPtr(objectHeader), std::make_pair(0U, encodeBit));
1843             return encodeBit;
1844         }
1845     }
1846     auto oldObjHeader = objectHeader;
1847     if (objectHeader->GetClass()->IsString()) {
1848         if (EcmaStringAccessor(objectHeader).IsTreeString()) {
1849             objectHeader = EcmaStringAccessor::FlattenNoGCForSnapshot(vm_, EcmaString::Cast(objectHeader));
1850         }
1851     }
1852     queue->emplace(objectHeader);
1853     size_t objectSize = objectHeader->GetClass()->SizeFromJSHClass(objectHeader);
1854     if (objectSize == 0) {
1855         LOG_ECMA_MEM(FATAL) << "It is a zero object. Not Support.";
1856     }
1857     uintptr_t newObj = GetNewObj(objectSize, objectHeader);
1858     if (newObj == 0) {
1859         LOG_ECMA_MEM(FATAL) << "Snapshot Allocate OOM";
1860     }
1861     if (memcpy_s(ToVoidPtr(newObj), objectSize, objectHeader, objectSize) != EOK) {
1862         LOG_FULL(FATAL) << "memcpy_s failed";
1863         UNREACHABLE();
1864     }
1865     auto currentRegion = Region::ObjectAddressToRange(newObj);
1866     // region snapshotData_ low 32 bits is used to record region index for snapshot
1867     uint64_t snapshotData = currentRegion->GetSnapshotData();
1868     size_t regionIndex = SnapshotHelper::GetHugeObjectRegionIndex(snapshotData);
1869     size_t objOffset = newObj - ToUintPtr(currentRegion);
1870     EncodeBit encodeBit(static_cast<uint64_t>(regionIndex));
1871     encodeBit.SetObjectOffsetInRegion(objOffset);
1872     if (oldObjHeader->GetClass()->IsString()) {
1873         if (EcmaStringAccessor(oldObjHeader).IsTreeString()) {
1874             data->emplace(ToUintPtr(oldObjHeader), std::make_pair(0U, encodeBit));
1875         }
1876     }
1877     data->emplace(ToUintPtr(objectHeader), std::make_pair(newObj, encodeBit));
1878     return encodeBit;
1879 }
1880 
GetObjectEncode(JSTaggedValue object, CQueue<TaggedObject *> *queue, std::unordered_map<uint64_t, ObjectEncode> *data)1881 EncodeBit SnapshotProcessor::GetObjectEncode(JSTaggedValue object, CQueue<TaggedObject *> *queue,
1882                                              std::unordered_map<uint64_t, ObjectEncode> *data)
1883 {
1884     JSTaggedType addr = object.GetRawData();
1885     EncodeBit encodeBit(0);
1886 
1887     if (data->find(addr) == data->end()) {
1888         encodeBit = EncodeTaggedObject(object.GetTaggedObject(), queue, data);
1889     } else {
1890         ObjectEncode objectEncodePair = data->find(object.GetRawData())->second;
1891         encodeBit = objectEncodePair.second;
1892     }
1893     return encodeBit;
1894 }
1895 
EncodeTaggedObjectRange(ObjectSlot start, ObjectSlot end, CQueue<TaggedObject *> *queue, std::unordered_map<uint64_t, ObjectEncode> *data)1896 void SnapshotProcessor::EncodeTaggedObjectRange(ObjectSlot start, ObjectSlot end, CQueue<TaggedObject *> *queue,
1897                                                 std::unordered_map<uint64_t, ObjectEncode> *data)
1898 {
1899     while (start < end) {
1900         JSTaggedValue object(start.GetTaggedType());
1901         start++;
1902         if (object.IsHeapObject()) {
1903             EncodeBit encodeBit(0);
1904             if (data->find(object.GetRawData()) == data->end()) {
1905                 encodeBit = EncodeTaggedObject(object.GetTaggedObject(), queue, data);
1906             }
1907         }
1908     }
1909 }
1910 
GetNativeTableSize() const1911 size_t SnapshotProcessor::GetNativeTableSize() const
1912 {
1913     return sizeof(g_nativeTable) / sizeof(g_nativeTable[0]);
1914 }
1915 
GenerateRegionHeadInfo(Region *region)1916 SnapshotRegionHeadInfo SnapshotProcessor::GenerateRegionHeadInfo(Region *region)
1917 {
1918     // Record region head information for deserialize
1919     SnapshotRegionHeadInfo info;
1920     info.regionIndex_ = region->GetSnapshotData();
1921     if (region->InSnapshotSpace()) {
1922         info.aliveObjectSize_ = region->highWaterMark_ - region->packedData_.begin_;
1923     } else {
1924         info.aliveObjectSize_ = region->AliveObject();
1925     }
1926     return info;
1927 }
1928 
ResetRegionUnusedRange(Region *region)1929 void SnapshotProcessor::ResetRegionUnusedRange(Region *region)
1930 {
1931     // memset unused memory to 0
1932     if (region->AliveObject() < region->end_ - region->packedData_.begin_) {
1933         uintptr_t unusedAddrBegin = region->packedData_.begin_ + region->AliveObject();
1934         size_t unusedSize = region->end_ - region->packedData_.begin_ - region->AliveObject();
1935         if (memset_s(reinterpret_cast<void *>(unusedAddrBegin), unusedSize, 0, unusedSize)) {
1936             LOG_FULL(FATAL) << "memset_s failed";
1937             UNREACHABLE();
1938         }
1939     }
1940 }
1941 }  // namespace panda::ecmascript
1942