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