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