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