Line data Source code
1 : // Copyright 2014 the V8 project authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file.
4 :
5 : #ifndef V8_HEAP_FACTORY_H_
6 : #define V8_HEAP_FACTORY_H_
7 :
8 : // Clients of this interface shouldn't depend on lots of heap internals.
9 : // Do not include anything from src/heap here!
10 : #include "src/builtins/builtins.h"
11 : #include "src/function-kind.h"
12 : #include "src/globals.h"
13 : #include "src/handles.h"
14 : #include "src/heap/heap.h"
15 : #include "src/maybe-handles.h"
16 : #include "src/messages.h"
17 : #include "src/objects/code.h"
18 : #include "src/objects/dictionary.h"
19 : #include "src/objects/js-array.h"
20 : #include "src/objects/js-regexp.h"
21 : #include "src/objects/string.h"
22 :
23 : namespace v8 {
24 : namespace internal {
25 :
26 : // Forward declarations.
27 : class AliasedArgumentsEntry;
28 : class ObjectBoilerplateDescription;
29 : class BreakPoint;
30 : class BreakPointInfo;
31 : class CallableTask;
32 : class CallbackTask;
33 : class CallHandlerInfo;
34 : class Expression;
35 : class EmbedderDataArray;
36 : class ArrayBoilerplateDescription;
37 : class CoverageInfo;
38 : class DebugInfo;
39 : class EnumCache;
40 : class FinalizationGroupCleanupJobTask;
41 : class FreshlyAllocatedBigInt;
42 : class Isolate;
43 : class JSDataView;
44 : class JSGeneratorObject;
45 : class JSMap;
46 : class JSMapIterator;
47 : class JSModuleNamespace;
48 : class JSPromise;
49 : class JSProxy;
50 : class JSSet;
51 : class JSSetIterator;
52 : class JSTypedArray;
53 : class JSWeakMap;
54 : class LoadHandler;
55 : class ModuleInfo;
56 : class NativeContext;
57 : class NewFunctionArgs;
58 : class PreparseData;
59 : class PromiseResolveThenableJobTask;
60 : class RegExpMatchInfo;
61 : class ScriptContextTable;
62 : class StackFrameInfo;
63 : class StackTraceFrame;
64 : class StoreHandler;
65 : class TemplateObjectDescription;
66 : class UncompiledDataWithoutPreparseData;
67 : class UncompiledDataWithPreparseData;
68 : class WasmExportedFunctionData;
69 : class WeakCell;
70 : struct SourceRange;
71 : template <typename T>
72 : class ZoneVector;
73 : enum class SharedFlag : uint32_t;
74 :
75 : enum FunctionMode {
76 : kWithNameBit = 1 << 0,
77 : kWithHomeObjectBit = 1 << 1,
78 : kWithWritablePrototypeBit = 1 << 2,
79 : kWithReadonlyPrototypeBit = 1 << 3,
80 : kWithPrototypeBits = kWithWritablePrototypeBit | kWithReadonlyPrototypeBit,
81 :
82 : // Without prototype.
83 : FUNCTION_WITHOUT_PROTOTYPE = 0,
84 : METHOD_WITH_NAME = kWithNameBit,
85 : METHOD_WITH_HOME_OBJECT = kWithHomeObjectBit,
86 : METHOD_WITH_NAME_AND_HOME_OBJECT = kWithNameBit | kWithHomeObjectBit,
87 :
88 : // With writable prototype.
89 : FUNCTION_WITH_WRITEABLE_PROTOTYPE = kWithWritablePrototypeBit,
90 : FUNCTION_WITH_NAME_AND_WRITEABLE_PROTOTYPE =
91 : kWithWritablePrototypeBit | kWithNameBit,
92 : FUNCTION_WITH_HOME_OBJECT_AND_WRITEABLE_PROTOTYPE =
93 : kWithWritablePrototypeBit | kWithHomeObjectBit,
94 : FUNCTION_WITH_NAME_AND_HOME_OBJECT_AND_WRITEABLE_PROTOTYPE =
95 : kWithWritablePrototypeBit | kWithNameBit | kWithHomeObjectBit,
96 :
97 : // With readonly prototype.
98 : FUNCTION_WITH_READONLY_PROTOTYPE = kWithReadonlyPrototypeBit,
99 : FUNCTION_WITH_NAME_AND_READONLY_PROTOTYPE =
100 : kWithReadonlyPrototypeBit | kWithNameBit,
101 : };
102 :
103 : // Interface for handle based allocation.
104 : class V8_EXPORT_PRIVATE Factory {
105 : public:
106 : Handle<Oddball> NewOddball(
107 : Handle<Map> map, const char* to_string, Handle<Object> to_number,
108 : const char* type_of, byte kind,
109 : AllocationType allocation = AllocationType::kReadOnly);
110 :
111 : // Marks self references within code generation.
112 : Handle<Oddball> NewSelfReferenceMarker(
113 : AllocationType allocation = AllocationType::kOld);
114 :
115 : // Allocates a fixed array-like object with given map and initialized with
116 : // undefined values.
117 : template <typename T = FixedArray>
118 : Handle<T> NewFixedArrayWithMap(
119 : RootIndex map_root_index, int length,
120 : AllocationType allocation = AllocationType::kYoung);
121 :
122 : // Allocates a weak fixed array-like object with given map and initialized
123 : // with undefined values.
124 : template <typename T = WeakFixedArray>
125 : Handle<T> NewWeakFixedArrayWithMap(
126 : RootIndex map_root_index, int length,
127 : AllocationType allocation = AllocationType::kYoung);
128 :
129 : // Allocates a fixed array initialized with undefined values.
130 : Handle<FixedArray> NewFixedArray(
131 : int length, AllocationType allocation = AllocationType::kYoung);
132 :
133 : // Allocates a fixed array which may contain in-place weak references. The
134 : // array is initialized with undefined values
135 : Handle<WeakFixedArray> NewWeakFixedArray(
136 : int length, AllocationType allocation = AllocationType::kYoung);
137 :
138 : // Allocates a property array initialized with undefined values.
139 : Handle<PropertyArray> NewPropertyArray(
140 : int length, AllocationType allocation = AllocationType::kYoung);
141 : // Tries allocating a fixed array initialized with undefined values.
142 : // In case of an allocation failure (OOM) an empty handle is returned.
143 : // The caller has to manually signal an
144 : // v8::internal::Heap::FatalProcessOutOfMemory typically by calling
145 : // NewFixedArray as a fallback.
146 : V8_WARN_UNUSED_RESULT
147 : MaybeHandle<FixedArray> TryNewFixedArray(
148 : int length, AllocationType allocation = AllocationType::kYoung);
149 :
150 : // Allocate a new fixed array with non-existing entries (the hole).
151 : Handle<FixedArray> NewFixedArrayWithHoles(
152 : int length, AllocationType allocation = AllocationType::kYoung);
153 :
154 : // Allocates an uninitialized fixed array. It must be filled by the caller.
155 : Handle<FixedArray> NewUninitializedFixedArray(
156 : int length, AllocationType allocation = AllocationType::kYoung);
157 :
158 : // Allocates a closure feedback cell array whose feedback cells are
159 : // initialized with undefined values.
160 : Handle<ClosureFeedbackCellArray> NewClosureFeedbackCellArray(
161 : int num_slots, AllocationType allocation = AllocationType::kYoung);
162 :
163 : // Allocates a feedback vector whose slots are initialized with undefined
164 : // values.
165 : Handle<FeedbackVector> NewFeedbackVector(
166 : Handle<SharedFunctionInfo> shared,
167 : Handle<ClosureFeedbackCellArray> closure_feedback_cell_array,
168 : AllocationType allocation = AllocationType::kYoung);
169 :
170 : // Allocates a clean embedder data array with given capacity.
171 : Handle<EmbedderDataArray> NewEmbedderDataArray(
172 : int length, AllocationType allocation = AllocationType::kYoung);
173 :
174 : // Allocates a fixed array for name-value pairs of boilerplate properties and
175 : // calculates the number of properties we need to store in the backing store.
176 : Handle<ObjectBoilerplateDescription> NewObjectBoilerplateDescription(
177 : int boilerplate, int all_properties, int index_keys, bool has_seen_proto);
178 :
179 : // Allocate a new uninitialized fixed double array.
180 : // The function returns a pre-allocated empty fixed array for length = 0,
181 : // so the return type must be the general fixed array class.
182 : Handle<FixedArrayBase> NewFixedDoubleArray(
183 : int length, AllocationType allocation = AllocationType::kYoung);
184 :
185 : // Allocate a new fixed double array with hole values.
186 : Handle<FixedArrayBase> NewFixedDoubleArrayWithHoles(
187 : int size, AllocationType allocation = AllocationType::kYoung);
188 :
189 : // Allocates a FeedbackMedata object and zeroes the data section.
190 : Handle<FeedbackMetadata> NewFeedbackMetadata(
191 : int slot_count, int feedback_cell_count,
192 : AllocationType allocation = AllocationType::kOld);
193 :
194 : Handle<FrameArray> NewFrameArray(
195 : int number_of_frames, AllocationType allocation = AllocationType::kYoung);
196 :
197 : Handle<OrderedHashSet> NewOrderedHashSet();
198 : Handle<OrderedHashMap> NewOrderedHashMap();
199 : Handle<OrderedNameDictionary> NewOrderedNameDictionary();
200 :
201 : Handle<SmallOrderedHashSet> NewSmallOrderedHashSet(
202 : int capacity = kSmallOrderedHashSetMinCapacity,
203 : AllocationType allocation = AllocationType::kYoung);
204 : Handle<SmallOrderedHashMap> NewSmallOrderedHashMap(
205 : int capacity = kSmallOrderedHashMapMinCapacity,
206 : AllocationType allocation = AllocationType::kYoung);
207 : Handle<SmallOrderedNameDictionary> NewSmallOrderedNameDictionary(
208 : int capacity = kSmallOrderedHashMapMinCapacity,
209 : AllocationType allocation = AllocationType::kYoung);
210 :
211 : // Create a new PrototypeInfo struct.
212 : Handle<PrototypeInfo> NewPrototypeInfo();
213 :
214 : // Create a new EnumCache struct.
215 : Handle<EnumCache> NewEnumCache(Handle<FixedArray> keys,
216 : Handle<FixedArray> indices);
217 :
218 : // Create a new Tuple2 struct.
219 : Handle<Tuple2> NewTuple2(Handle<Object> value1, Handle<Object> value2,
220 : AllocationType allocation);
221 :
222 : // Create a new Tuple3 struct.
223 : Handle<Tuple3> NewTuple3(Handle<Object> value1, Handle<Object> value2,
224 : Handle<Object> value3, AllocationType allocation);
225 :
226 : // Create a new ArrayBoilerplateDescription struct.
227 : Handle<ArrayBoilerplateDescription> NewArrayBoilerplateDescription(
228 : ElementsKind elements_kind, Handle<FixedArrayBase> constant_values);
229 :
230 : // Create a new TemplateObjectDescription struct.
231 : Handle<TemplateObjectDescription> NewTemplateObjectDescription(
232 : Handle<FixedArray> raw_strings, Handle<FixedArray> cooked_strings);
233 :
234 : // Create a pre-tenured empty AccessorPair.
235 : Handle<AccessorPair> NewAccessorPair();
236 :
237 : // Finds the internalized copy for string in the string table.
238 : // If not found, a new string is added to the table and returned.
239 : Handle<String> InternalizeUtf8String(Vector<const char> str);
240 13427105 : Handle<String> InternalizeUtf8String(const char* str) {
241 13427105 : return InternalizeUtf8String(CStrVector(str));
242 : }
243 :
244 : Handle<String> InternalizeOneByteString(Vector<const uint8_t> str);
245 : Handle<String> InternalizeOneByteString(Handle<SeqOneByteString>, int from,
246 : int length);
247 :
248 : Handle<String> InternalizeTwoByteString(Vector<const uc16> str);
249 :
250 : template <class StringTableKey>
251 : Handle<String> InternalizeStringWithKey(StringTableKey* key);
252 :
253 : // Internalized strings are created in the old generation (data space).
254 : inline Handle<String> InternalizeString(Handle<String> string);
255 :
256 : inline Handle<Name> InternalizeName(Handle<Name> name);
257 :
258 : // String creation functions. Most of the string creation functions take
259 : // an AllocationType argument to optionally request that they be
260 : // allocated in the old generation. Otherwise the default is
261 : // AllocationType::kYoung.
262 : //
263 : // Creates a new String object. There are two String encodings: one-byte and
264 : // two-byte. One should choose between the three string factory functions
265 : // based on the encoding of the string buffer that the string is
266 : // initialized from.
267 : // - ...FromOneByte initializes the string from a buffer that is Latin1
268 : // encoded (it does not check that the buffer is Latin1 encoded) and
269 : // the result will be Latin1 encoded.
270 : // - ...FromUtf8 initializes the string from a buffer that is UTF-8
271 : // encoded. If the characters are all ASCII characters, the result
272 : // will be Latin1 encoded, otherwise it will converted to two-byte.
273 : // - ...FromTwoByte initializes the string from a buffer that is two-byte
274 : // encoded. If the characters are all Latin1 characters, the result
275 : // will be converted to Latin1, otherwise it will be left as two-byte.
276 : //
277 : // One-byte strings are pretenured when used as keys in the SourceCodeCache.
278 : V8_WARN_UNUSED_RESULT MaybeHandle<String> NewStringFromOneByte(
279 : Vector<const uint8_t> str,
280 : AllocationType allocation = AllocationType::kYoung);
281 :
282 : template <size_t N>
283 3167 : inline Handle<String> NewStringFromStaticChars(
284 : const char (&str)[N],
285 : AllocationType allocation = AllocationType::kYoung) {
286 : DCHECK(N == StrLength(str) + 1);
287 : return NewStringFromOneByte(StaticCharVector(str), allocation)
288 6334 : .ToHandleChecked();
289 : }
290 :
291 36881435 : inline Handle<String> NewStringFromAsciiChecked(
292 : const char* str, AllocationType allocation = AllocationType::kYoung) {
293 73762871 : return NewStringFromOneByte(OneByteVector(str), allocation)
294 36881436 : .ToHandleChecked();
295 : }
296 :
297 : // UTF8 strings are pretenured when used for regexp literal patterns and
298 : // flags in the parser.
299 : V8_WARN_UNUSED_RESULT MaybeHandle<String> NewStringFromUtf8(
300 : Vector<const char> str,
301 : AllocationType allocation = AllocationType::kYoung);
302 :
303 : V8_WARN_UNUSED_RESULT MaybeHandle<String> NewStringFromUtf8SubString(
304 : Handle<SeqOneByteString> str, int begin, int end,
305 : AllocationType allocation = AllocationType::kYoung);
306 :
307 : V8_WARN_UNUSED_RESULT MaybeHandle<String> NewStringFromTwoByte(
308 : Vector<const uc16> str,
309 : AllocationType allocation = AllocationType::kYoung);
310 :
311 : V8_WARN_UNUSED_RESULT MaybeHandle<String> NewStringFromTwoByte(
312 : const ZoneVector<uc16>* str,
313 : AllocationType allocation = AllocationType::kYoung);
314 :
315 : Handle<JSStringIterator> NewJSStringIterator(Handle<String> string);
316 :
317 : // Allocates an internalized string in old space based on the character
318 : // stream.
319 : Handle<String> NewInternalizedStringFromUtf8(Vector<const char> str,
320 : int chars, uint32_t hash_field);
321 :
322 : Handle<String> NewOneByteInternalizedString(Vector<const uint8_t> str,
323 : uint32_t hash_field);
324 :
325 : Handle<String> NewOneByteInternalizedSubString(
326 : Handle<SeqOneByteString> string, int offset, int length,
327 : uint32_t hash_field);
328 :
329 : Handle<String> NewTwoByteInternalizedString(Vector<const uc16> str,
330 : uint32_t hash_field);
331 :
332 : Handle<String> NewInternalizedStringImpl(Handle<String> string, int chars,
333 : uint32_t hash_field);
334 :
335 : // Compute the matching internalized string map for a string if possible.
336 : // Empty handle is returned if string is in new space or not flattened.
337 : V8_WARN_UNUSED_RESULT MaybeHandle<Map> InternalizedStringMapForString(
338 : Handle<String> string);
339 :
340 : // Creates an internalized copy of an external string. |string| must be
341 : // of type StringClass.
342 : template <class StringClass>
343 : Handle<StringClass> InternalizeExternalString(Handle<String> string);
344 :
345 : // Allocates and partially initializes an one-byte or two-byte String. The
346 : // characters of the string are uninitialized. Currently used in regexp code
347 : // only, where they are pretenured.
348 : V8_WARN_UNUSED_RESULT MaybeHandle<SeqOneByteString> NewRawOneByteString(
349 : int length, AllocationType allocation = AllocationType::kYoung);
350 : V8_WARN_UNUSED_RESULT MaybeHandle<SeqTwoByteString> NewRawTwoByteString(
351 : int length, AllocationType allocation = AllocationType::kYoung);
352 :
353 : // Creates a single character string where the character has given code.
354 : // A cache is used for Latin1 codes.
355 : Handle<String> LookupSingleCharacterStringFromCode(uint32_t code);
356 :
357 : // Create a new cons string object which consists of a pair of strings.
358 : V8_WARN_UNUSED_RESULT MaybeHandle<String> NewConsString(Handle<String> left,
359 : Handle<String> right);
360 :
361 : V8_WARN_UNUSED_RESULT Handle<String> NewConsString(Handle<String> left,
362 : Handle<String> right,
363 : int length, bool one_byte);
364 :
365 : // Create or lookup a single characters tring made up of a utf16 surrogate
366 : // pair.
367 : Handle<String> NewSurrogatePairString(uint16_t lead, uint16_t trail);
368 :
369 : // Create a new string object which holds a proper substring of a string.
370 : Handle<String> NewProperSubString(Handle<String> str, int begin, int end);
371 :
372 : // Create a new string object which holds a substring of a string.
373 : inline Handle<String> NewSubString(Handle<String> str, int begin, int end);
374 :
375 : // Creates a new external String object. There are two String encodings
376 : // in the system: one-byte and two-byte. Unlike other String types, it does
377 : // not make sense to have a UTF-8 factory function for external strings,
378 : // because we cannot change the underlying buffer. Note that these strings
379 : // are backed by a string resource that resides outside the V8 heap.
380 : V8_WARN_UNUSED_RESULT MaybeHandle<String> NewExternalStringFromOneByte(
381 : const ExternalOneByteString::Resource* resource);
382 : V8_WARN_UNUSED_RESULT MaybeHandle<String> NewExternalStringFromTwoByte(
383 : const ExternalTwoByteString::Resource* resource);
384 : // Create a new external string object for one-byte encoded native script.
385 : // It does not cache the resource data pointer.
386 : Handle<ExternalOneByteString> NewNativeSourceString(
387 : const ExternalOneByteString::Resource* resource);
388 :
389 : // Create a symbol in old or read-only space.
390 : Handle<Symbol> NewSymbol(AllocationType allocation = AllocationType::kOld);
391 : Handle<Symbol> NewPrivateSymbol(
392 : AllocationType allocation = AllocationType::kOld);
393 : Handle<Symbol> NewPrivateNameSymbol(Handle<String> name);
394 :
395 : // Create a global (but otherwise uninitialized) context.
396 : Handle<NativeContext> NewNativeContext();
397 :
398 : // Create a script context.
399 : Handle<Context> NewScriptContext(Handle<NativeContext> outer,
400 : Handle<ScopeInfo> scope_info);
401 :
402 : // Create an empty script context table.
403 : Handle<ScriptContextTable> NewScriptContextTable();
404 :
405 : // Create a module context.
406 : Handle<Context> NewModuleContext(Handle<Module> module,
407 : Handle<NativeContext> outer,
408 : Handle<ScopeInfo> scope_info);
409 :
410 : // Create a function or eval context.
411 : Handle<Context> NewFunctionContext(Handle<Context> outer,
412 : Handle<ScopeInfo> scope_info);
413 :
414 : // Create a catch context.
415 : Handle<Context> NewCatchContext(Handle<Context> previous,
416 : Handle<ScopeInfo> scope_info,
417 : Handle<Object> thrown_object);
418 :
419 : // Create a 'with' context.
420 : Handle<Context> NewWithContext(Handle<Context> previous,
421 : Handle<ScopeInfo> scope_info,
422 : Handle<JSReceiver> extension);
423 :
424 : Handle<Context> NewDebugEvaluateContext(Handle<Context> previous,
425 : Handle<ScopeInfo> scope_info,
426 : Handle<JSReceiver> extension,
427 : Handle<Context> wrapped,
428 : Handle<StringSet> whitelist);
429 :
430 : // Create a block context.
431 : Handle<Context> NewBlockContext(Handle<Context> previous,
432 : Handle<ScopeInfo> scope_info);
433 :
434 : // Create a context that's used by builtin functions.
435 : //
436 : // These are similar to function context but don't have a previous
437 : // context or any scope info. These are used to store spec defined
438 : // context values.
439 : Handle<Context> NewBuiltinContext(Handle<NativeContext> native_context,
440 : int length);
441 :
442 : Handle<Struct> NewStruct(InstanceType type,
443 : AllocationType allocation = AllocationType::kYoung);
444 :
445 : Handle<AliasedArgumentsEntry> NewAliasedArgumentsEntry(
446 : int aliased_context_slot);
447 :
448 : Handle<AccessorInfo> NewAccessorInfo();
449 :
450 : Handle<Script> NewScript(Handle<String> source,
451 : AllocationType allocation = AllocationType::kOld);
452 : Handle<Script> NewScriptWithId(
453 : Handle<String> source, int script_id,
454 : AllocationType allocation = AllocationType::kOld);
455 : Handle<Script> CloneScript(Handle<Script> script);
456 :
457 : Handle<BreakPointInfo> NewBreakPointInfo(int source_position);
458 : Handle<BreakPoint> NewBreakPoint(int id, Handle<String> condition);
459 : Handle<StackTraceFrame> NewStackTraceFrame(Handle<FrameArray> frame_array,
460 : int index);
461 : Handle<StackFrameInfo> NewStackFrameInfo();
462 : Handle<StackFrameInfo> NewStackFrameInfo(Handle<FrameArray> frame_array,
463 : int index);
464 : Handle<SourcePositionTableWithFrameCache>
465 : NewSourcePositionTableWithFrameCache(
466 : Handle<ByteArray> source_position_table,
467 : Handle<SimpleNumberDictionary> stack_frame_cache);
468 :
469 : // Allocate various microtasks.
470 : Handle<CallableTask> NewCallableTask(Handle<JSReceiver> callable,
471 : Handle<Context> context);
472 : Handle<CallbackTask> NewCallbackTask(Handle<Foreign> callback,
473 : Handle<Foreign> data);
474 : Handle<PromiseResolveThenableJobTask> NewPromiseResolveThenableJobTask(
475 : Handle<JSPromise> promise_to_resolve, Handle<JSReceiver> then,
476 : Handle<JSReceiver> thenable, Handle<Context> context);
477 : Handle<FinalizationGroupCleanupJobTask> NewFinalizationGroupCleanupJobTask(
478 : Handle<JSFinalizationGroup> finalization_group);
479 :
480 : // Foreign objects are pretenured when allocated by the bootstrapper.
481 : Handle<Foreign> NewForeign(
482 : Address addr, AllocationType allocation = AllocationType::kYoung);
483 :
484 : Handle<ByteArray> NewByteArray(
485 : int length, AllocationType allocation = AllocationType::kYoung);
486 :
487 : Handle<BytecodeArray> NewBytecodeArray(int length, const byte* raw_bytecodes,
488 : int frame_size, int parameter_count,
489 : Handle<FixedArray> constant_pool);
490 :
491 : Handle<FixedTypedArrayBase> NewFixedTypedArrayWithExternalPointer(
492 : ExternalArrayType array_type, void* external_pointer,
493 : AllocationType allocation = AllocationType::kYoung);
494 :
495 : Handle<FixedTypedArrayBase> NewFixedTypedArray(
496 : size_t length, size_t byte_length, ExternalArrayType array_type,
497 : bool initialize, AllocationType allocation = AllocationType::kYoung);
498 :
499 : Handle<Cell> NewCell(Handle<Object> value);
500 :
501 : Handle<PropertyCell> NewPropertyCell(
502 : Handle<Name> name, AllocationType allocation = AllocationType::kOld);
503 :
504 : Handle<FeedbackCell> NewNoClosuresCell(Handle<HeapObject> value);
505 : Handle<FeedbackCell> NewOneClosureCell(Handle<HeapObject> value);
506 : Handle<FeedbackCell> NewManyClosuresCell(Handle<HeapObject> value);
507 :
508 : Handle<DescriptorArray> NewDescriptorArray(
509 : int number_of_entries, int slack = 0,
510 : AllocationType allocation = AllocationType::kYoung);
511 : Handle<TransitionArray> NewTransitionArray(int number_of_transitions,
512 : int slack = 0);
513 :
514 : // Allocate a tenured AllocationSite. Its payload is null.
515 : Handle<AllocationSite> NewAllocationSite(bool with_weak_next);
516 :
517 : // Allocates and initializes a new Map.
518 : Handle<Map> NewMap(InstanceType type, int instance_size,
519 : ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND,
520 : int inobject_properties = 0);
521 : // Initializes the fields of a newly created Map. Exposed for tests and
522 : // heap setup; other code should just call NewMap which takes care of it.
523 : Map InitializeMap(Map map, InstanceType type, int instance_size,
524 : ElementsKind elements_kind, int inobject_properties);
525 :
526 : // Allocate a block of memory of the given AllocationType (filled with a
527 : // filler). Used as a fall-back for generated code when the space is full.
528 : Handle<HeapObject> NewFillerObject(int size, bool double_align,
529 : AllocationType allocation);
530 :
531 : Handle<JSObject> NewFunctionPrototype(Handle<JSFunction> function);
532 :
533 : Handle<WeakCell> NewWeakCell();
534 :
535 : // Returns a deep copy of the JavaScript object.
536 : // Properties and elements are copied too.
537 : Handle<JSObject> CopyJSObject(Handle<JSObject> object);
538 : // Same as above, but also takes an AllocationSite to be appended in an
539 : // AllocationMemento.
540 : Handle<JSObject> CopyJSObjectWithAllocationSite(Handle<JSObject> object,
541 : Handle<AllocationSite> site);
542 :
543 : Handle<FixedArray> CopyFixedArrayWithMap(Handle<FixedArray> array,
544 : Handle<Map> map);
545 :
546 : Handle<FixedArray> CopyFixedArrayAndGrow(
547 : Handle<FixedArray> array, int grow_by,
548 : AllocationType allocation = AllocationType::kYoung);
549 :
550 : Handle<WeakFixedArray> CopyWeakFixedArrayAndGrow(
551 : Handle<WeakFixedArray> array, int grow_by,
552 : AllocationType allocation = AllocationType::kYoung);
553 :
554 : Handle<WeakArrayList> CopyWeakArrayListAndGrow(
555 : Handle<WeakArrayList> array, int grow_by,
556 : AllocationType allocation = AllocationType::kYoung);
557 :
558 : Handle<PropertyArray> CopyPropertyArrayAndGrow(
559 : Handle<PropertyArray> array, int grow_by,
560 : AllocationType allocation = AllocationType::kYoung);
561 :
562 : Handle<FixedArray> CopyFixedArrayUpTo(
563 : Handle<FixedArray> array, int new_len,
564 : AllocationType allocation = AllocationType::kYoung);
565 :
566 : Handle<FixedArray> CopyFixedArray(Handle<FixedArray> array);
567 :
568 : // This method expects a COW array in new space, and creates a copy
569 : // of it in old space.
570 : Handle<FixedArray> CopyAndTenureFixedCOWArray(Handle<FixedArray> array);
571 :
572 : Handle<FixedDoubleArray> CopyFixedDoubleArray(Handle<FixedDoubleArray> array);
573 :
574 : Handle<FeedbackVector> CopyFeedbackVector(Handle<FeedbackVector> array);
575 :
576 : // Numbers (e.g. literals) are pretenured by the parser.
577 : // The return value may be a smi or a heap number.
578 : Handle<Object> NewNumber(double value,
579 : AllocationType allocation = AllocationType::kYoung);
580 :
581 : Handle<Object> NewNumberFromInt(
582 : int32_t value, AllocationType allocation = AllocationType::kYoung);
583 : Handle<Object> NewNumberFromUint(
584 : uint32_t value, AllocationType allocation = AllocationType::kYoung);
585 : inline Handle<Object> NewNumberFromSize(
586 : size_t value, AllocationType allocation = AllocationType::kYoung);
587 : inline Handle<Object> NewNumberFromInt64(
588 : int64_t value, AllocationType allocation = AllocationType::kYoung);
589 : inline Handle<HeapNumber> NewHeapNumber(
590 : double value, AllocationType allocation = AllocationType::kYoung);
591 : inline Handle<HeapNumber> NewHeapNumberFromBits(
592 : uint64_t bits, AllocationType allocation = AllocationType::kYoung);
593 :
594 : // Creates heap number object with not yet set value field.
595 : Handle<HeapNumber> NewHeapNumber(
596 : AllocationType allocation = AllocationType::kYoung);
597 :
598 : Handle<MutableHeapNumber> NewMutableHeapNumber(
599 : AllocationType allocation = AllocationType::kYoung);
600 : inline Handle<MutableHeapNumber> NewMutableHeapNumber(
601 : double value, AllocationType allocation = AllocationType::kYoung);
602 : inline Handle<MutableHeapNumber> NewMutableHeapNumberFromBits(
603 : uint64_t bits, AllocationType allocation = AllocationType::kYoung);
604 : inline Handle<MutableHeapNumber> NewMutableHeapNumberWithHoleNaN(
605 : AllocationType allocation = AllocationType::kYoung);
606 :
607 : // Allocates a new BigInt with {length} digits. Only to be used by
608 : // MutableBigInt::New*.
609 : Handle<FreshlyAllocatedBigInt> NewBigInt(
610 : int length, AllocationType allocation = AllocationType::kYoung);
611 :
612 : Handle<JSObject> NewArgumentsObject(Handle<JSFunction> callee, int length);
613 :
614 : // Allocates and initializes a new JavaScript object based on a
615 : // constructor.
616 : // JS objects are pretenured when allocated by the bootstrapper and
617 : // runtime.
618 : Handle<JSObject> NewJSObject(
619 : Handle<JSFunction> constructor,
620 : AllocationType allocation = AllocationType::kYoung);
621 : // JSObject without a prototype.
622 : Handle<JSObject> NewJSObjectWithNullProto(
623 : AllocationType allocation = AllocationType::kYoung);
624 :
625 : // Global objects are pretenured and initialized based on a constructor.
626 : Handle<JSGlobalObject> NewJSGlobalObject(Handle<JSFunction> constructor);
627 :
628 : // Allocates and initializes a new JavaScript object based on a map.
629 : // Passing an allocation site means that a memento will be created that
630 : // points to the site.
631 : // JS objects are pretenured when allocated by the bootstrapper and
632 : // runtime.
633 : Handle<JSObject> NewJSObjectFromMap(
634 : Handle<Map> map, AllocationType allocation = AllocationType::kYoung,
635 : Handle<AllocationSite> allocation_site = Handle<AllocationSite>::null());
636 : Handle<JSObject> NewSlowJSObjectFromMap(
637 : Handle<Map> map,
638 : int number_of_slow_properties = NameDictionary::kInitialCapacity,
639 : AllocationType allocation = AllocationType::kYoung);
640 : // Allocates and initializes a new JavaScript object with the given
641 : // {prototype} and {properties}. The newly created object will be
642 : // in dictionary properties mode. The {elements} can either be the
643 : // empty fixed array, in which case the resulting object will have
644 : // fast elements, or a NumberDictionary, in which case the resulting
645 : // object will have dictionary elements.
646 : Handle<JSObject> NewSlowJSObjectWithPropertiesAndElements(
647 : Handle<HeapObject> prototype, Handle<NameDictionary> properties,
648 : Handle<FixedArrayBase> elements,
649 : AllocationType allocation = AllocationType::kYoung);
650 :
651 : // JS arrays are pretenured when allocated by the parser.
652 :
653 : // Create a JSArray with a specified length and elements initialized
654 : // according to the specified mode.
655 : Handle<JSArray> NewJSArray(
656 : ElementsKind elements_kind, int length, int capacity,
657 : ArrayStorageAllocationMode mode = DONT_INITIALIZE_ARRAY_ELEMENTS,
658 : AllocationType allocation = AllocationType::kYoung);
659 :
660 : Handle<JSArray> NewJSArray(
661 : int capacity, ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND,
662 : AllocationType allocation = AllocationType::kYoung) {
663 : if (capacity != 0) {
664 : elements_kind = GetHoleyElementsKind(elements_kind);
665 : }
666 : return NewJSArray(elements_kind, 0, capacity,
667 241855 : INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE, allocation);
668 : }
669 :
670 : // Create a JSArray with the given elements.
671 : Handle<JSArray> NewJSArrayWithElements(
672 : Handle<FixedArrayBase> elements, ElementsKind elements_kind, int length,
673 : AllocationType allocation = AllocationType::kYoung);
674 :
675 : inline Handle<JSArray> NewJSArrayWithElements(
676 : Handle<FixedArrayBase> elements,
677 : ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND,
678 : AllocationType allocation = AllocationType::kYoung);
679 :
680 : void NewJSArrayStorage(
681 : Handle<JSArray> array, int length, int capacity,
682 : ArrayStorageAllocationMode mode = DONT_INITIALIZE_ARRAY_ELEMENTS);
683 :
684 : Handle<JSWeakMap> NewJSWeakMap();
685 :
686 : Handle<JSGeneratorObject> NewJSGeneratorObject(Handle<JSFunction> function);
687 :
688 : Handle<JSModuleNamespace> NewJSModuleNamespace();
689 :
690 : Handle<Module> NewModule(Handle<SharedFunctionInfo> code);
691 :
692 : Handle<JSArrayBuffer> NewJSArrayBuffer(
693 : SharedFlag shared, AllocationType allocation = AllocationType::kYoung);
694 :
695 : static void TypeAndSizeForElementsKind(ElementsKind kind,
696 : ExternalArrayType* array_type,
697 : size_t* element_size);
698 :
699 : Handle<JSTypedArray> NewJSTypedArray(
700 : ExternalArrayType type,
701 : AllocationType allocation = AllocationType::kYoung);
702 :
703 : Handle<JSTypedArray> NewJSTypedArray(
704 : ElementsKind elements_kind,
705 : AllocationType allocation = AllocationType::kYoung);
706 :
707 : // Creates a new JSTypedArray with the specified buffer.
708 : Handle<JSTypedArray> NewJSTypedArray(
709 : ExternalArrayType type, Handle<JSArrayBuffer> buffer, size_t byte_offset,
710 : size_t length, AllocationType allocation = AllocationType::kYoung);
711 :
712 : // Creates a new on-heap JSTypedArray.
713 : Handle<JSTypedArray> NewJSTypedArray(
714 : ElementsKind elements_kind, size_t number_of_elements,
715 : AllocationType allocation = AllocationType::kYoung);
716 :
717 : Handle<JSDataView> NewJSDataView(Handle<JSArrayBuffer> buffer,
718 : size_t byte_offset, size_t byte_length);
719 :
720 : Handle<JSIteratorResult> NewJSIteratorResult(Handle<Object> value, bool done);
721 : Handle<JSAsyncFromSyncIterator> NewJSAsyncFromSyncIterator(
722 : Handle<JSReceiver> sync_iterator, Handle<Object> next);
723 :
724 : Handle<JSMap> NewJSMap();
725 : Handle<JSSet> NewJSSet();
726 :
727 : // Allocates a bound function.
728 : MaybeHandle<JSBoundFunction> NewJSBoundFunction(
729 : Handle<JSReceiver> target_function, Handle<Object> bound_this,
730 : Vector<Handle<Object>> bound_args);
731 :
732 : // Allocates a Harmony proxy.
733 : Handle<JSProxy> NewJSProxy(Handle<JSReceiver> target,
734 : Handle<JSReceiver> handler);
735 :
736 : // Reinitialize an JSGlobalProxy based on a constructor. The object
737 : // must have the same size as objects allocated using the
738 : // constructor. The object is reinitialized and behaves as an
739 : // object that has been freshly allocated using the constructor.
740 : void ReinitializeJSGlobalProxy(Handle<JSGlobalProxy> global,
741 : Handle<JSFunction> constructor);
742 :
743 : Handle<JSGlobalProxy> NewUninitializedJSGlobalProxy(int size);
744 :
745 : // Creates a new JSFunction according to the given args. This is the function
746 : // you'll probably want to use when creating a JSFunction from the runtime.
747 : Handle<JSFunction> NewFunction(const NewFunctionArgs& args);
748 :
749 : // For testing only. Creates a sloppy function without code.
750 : Handle<JSFunction> NewFunctionForTest(Handle<String> name);
751 :
752 : // Function creation from SharedFunctionInfo.
753 :
754 : Handle<JSFunction> NewFunctionFromSharedFunctionInfo(
755 : Handle<Map> initial_map, Handle<SharedFunctionInfo> function_info,
756 : Handle<Context> context, Handle<FeedbackCell> feedback_cell,
757 : AllocationType allocation = AllocationType::kOld);
758 :
759 : Handle<JSFunction> NewFunctionFromSharedFunctionInfo(
760 : Handle<SharedFunctionInfo> function_info, Handle<Context> context,
761 : Handle<FeedbackCell> feedback_cell,
762 : AllocationType allocation = AllocationType::kOld);
763 :
764 : Handle<JSFunction> NewFunctionFromSharedFunctionInfo(
765 : Handle<Map> initial_map, Handle<SharedFunctionInfo> function_info,
766 : Handle<Context> context,
767 : AllocationType allocation = AllocationType::kOld);
768 :
769 : Handle<JSFunction> NewFunctionFromSharedFunctionInfo(
770 : Handle<SharedFunctionInfo> function_info, Handle<Context> context,
771 : AllocationType allocation = AllocationType::kOld);
772 :
773 : // The choke-point for JSFunction creation. Handles allocation and
774 : // initialization. All other utility methods call into this.
775 : Handle<JSFunction> NewFunction(
776 : Handle<Map> map, Handle<SharedFunctionInfo> info, Handle<Context> context,
777 : AllocationType allocation = AllocationType::kOld);
778 :
779 : // Create a serialized scope info.
780 : Handle<ScopeInfo> NewScopeInfo(int length);
781 :
782 : Handle<ModuleInfo> NewModuleInfo();
783 :
784 : Handle<PreparseData> NewPreparseData(int data_length, int children_length);
785 :
786 : Handle<UncompiledDataWithoutPreparseData>
787 : NewUncompiledDataWithoutPreparseData(Handle<String> inferred_name,
788 : int32_t start_position,
789 : int32_t end_position,
790 : int32_t function_literal_id);
791 :
792 : Handle<UncompiledDataWithPreparseData> NewUncompiledDataWithPreparseData(
793 : Handle<String> inferred_name, int32_t start_position,
794 : int32_t end_position, int32_t function_literal_id, Handle<PreparseData>);
795 :
796 : // Create an External object for V8's external API.
797 : Handle<JSObject> NewExternal(void* value);
798 :
799 : // Creates a new CodeDataContainer for a Code object.
800 : Handle<CodeDataContainer> NewCodeDataContainer(int flags);
801 :
802 : // Allocates a new code object (fully initialized). All header fields of the
803 : // returned object are immutable and the code object is write protected.
804 : // The reference to the Code object is stored in self_reference.
805 : // This allows generated code to reference its own Code object
806 : // by containing this handle.
807 : Handle<Code> NewCode(const CodeDesc& desc, Code::Kind kind,
808 : Handle<Object> self_reference,
809 : int32_t builtin_index = Builtins::kNoBuiltinId,
810 : MaybeHandle<ByteArray> maybe_source_position_table =
811 : MaybeHandle<ByteArray>(),
812 : MaybeHandle<DeoptimizationData> maybe_deopt_data =
813 : MaybeHandle<DeoptimizationData>(),
814 : Movability movability = kMovable,
815 : bool is_turbofanned = false, int stack_slots = 0);
816 :
817 : // Like NewCode, this function allocates a new code object (fully
818 : // initialized). It may return an empty handle if the allocation does not
819 : // succeed.
820 : V8_WARN_UNUSED_RESULT MaybeHandle<Code> TryNewCode(
821 : const CodeDesc& desc, Code::Kind kind, Handle<Object> self_reference,
822 : int32_t builtin_index = Builtins::kNoBuiltinId,
823 : MaybeHandle<ByteArray> maybe_source_position_table =
824 : MaybeHandle<ByteArray>(),
825 : MaybeHandle<DeoptimizationData> maybe_deopt_data =
826 : MaybeHandle<DeoptimizationData>(),
827 : Movability movability = kMovable, bool is_turbofanned = false,
828 : int stack_slots = 0);
829 :
830 : // Allocates a new code object and initializes it as the trampoline to the
831 : // given off-heap entry point.
832 : Handle<Code> NewOffHeapTrampolineFor(Handle<Code> code,
833 : Address off_heap_entry);
834 :
835 : Handle<Code> CopyCode(Handle<Code> code);
836 :
837 : Handle<BytecodeArray> CopyBytecodeArray(Handle<BytecodeArray>);
838 :
839 : // Interface for creating error objects.
840 : Handle<Object> NewError(Handle<JSFunction> constructor,
841 : Handle<String> message);
842 :
843 : Handle<Object> NewInvalidStringLengthError();
844 :
845 : inline Handle<Object> NewURIError();
846 :
847 : Handle<Object> NewError(Handle<JSFunction> constructor,
848 : MessageTemplate template_index,
849 : Handle<Object> arg0 = Handle<Object>(),
850 : Handle<Object> arg1 = Handle<Object>(),
851 : Handle<Object> arg2 = Handle<Object>());
852 :
853 : #define DECLARE_ERROR(NAME) \
854 : Handle<Object> New##NAME(MessageTemplate template_index, \
855 : Handle<Object> arg0 = Handle<Object>(), \
856 : Handle<Object> arg1 = Handle<Object>(), \
857 : Handle<Object> arg2 = Handle<Object>());
858 : DECLARE_ERROR(Error)
859 : DECLARE_ERROR(EvalError)
860 : DECLARE_ERROR(RangeError)
861 : DECLARE_ERROR(ReferenceError)
862 : DECLARE_ERROR(SyntaxError)
863 : DECLARE_ERROR(TypeError)
864 : DECLARE_ERROR(WasmCompileError)
865 : DECLARE_ERROR(WasmLinkError)
866 : DECLARE_ERROR(WasmRuntimeError)
867 : #undef DECLARE_ERROR
868 :
869 : Handle<String> NumberToString(Handle<Object> number, bool check_cache = true);
870 : Handle<String> NumberToString(Smi number, bool check_cache = true);
871 :
872 : inline Handle<String> Uint32ToString(uint32_t value, bool check_cache = true);
873 :
874 : #define ROOT_ACCESSOR(Type, name, CamelName) inline Handle<Type> name();
875 : ROOT_LIST(ROOT_ACCESSOR)
876 : #undef ROOT_ACCESSOR
877 :
878 : // Allocates a new SharedFunctionInfo object.
879 : Handle<SharedFunctionInfo> NewSharedFunctionInfoForApiFunction(
880 : MaybeHandle<String> maybe_name,
881 : Handle<FunctionTemplateInfo> function_template_info, FunctionKind kind);
882 :
883 : Handle<SharedFunctionInfo> NewSharedFunctionInfoForBuiltin(
884 : MaybeHandle<String> name, int builtin_index,
885 : FunctionKind kind = kNormalFunction);
886 :
887 : Handle<SharedFunctionInfo> NewSharedFunctionInfoForLiteral(
888 : FunctionLiteral* literal, Handle<Script> script, bool is_toplevel);
889 :
890 : static bool IsFunctionModeWithPrototype(FunctionMode function_mode) {
891 1554 : return (function_mode & kWithPrototypeBits) != 0;
892 : }
893 :
894 : static bool IsFunctionModeWithWritablePrototype(FunctionMode function_mode) {
895 888 : return (function_mode & kWithWritablePrototypeBit) != 0;
896 : }
897 :
898 : static bool IsFunctionModeWithName(FunctionMode function_mode) {
899 1554 : return (function_mode & kWithNameBit) != 0;
900 : }
901 :
902 : static bool IsFunctionModeWithHomeObject(FunctionMode function_mode) {
903 999 : return (function_mode & kWithHomeObjectBit) != 0;
904 : }
905 :
906 : Handle<Map> CreateSloppyFunctionMap(
907 : FunctionMode function_mode, MaybeHandle<JSFunction> maybe_empty_function);
908 :
909 : Handle<Map> CreateStrictFunctionMap(FunctionMode function_mode,
910 : Handle<JSFunction> empty_function);
911 :
912 : Handle<Map> CreateClassFunctionMap(Handle<JSFunction> empty_function);
913 :
914 : // Allocates a new JSMessageObject object.
915 : Handle<JSMessageObject> NewJSMessageObject(
916 : MessageTemplate message, Handle<Object> argument, int start_position,
917 : int end_position, Handle<Script> script, Handle<Object> stack_frames);
918 :
919 : Handle<ClassPositions> NewClassPositions(int start, int end);
920 : Handle<DebugInfo> NewDebugInfo(Handle<SharedFunctionInfo> shared);
921 :
922 : Handle<CoverageInfo> NewCoverageInfo(const ZoneVector<SourceRange>& slots);
923 :
924 : // Return a map for given number of properties using the map cache in the
925 : // native context.
926 : Handle<Map> ObjectLiteralMapFromCache(Handle<NativeContext> native_context,
927 : int number_of_properties);
928 :
929 : Handle<LoadHandler> NewLoadHandler(int data_count);
930 : Handle<StoreHandler> NewStoreHandler(int data_count);
931 :
932 : Handle<RegExpMatchInfo> NewRegExpMatchInfo();
933 :
934 : // Creates a new FixedArray that holds the data associated with the
935 : // atom regexp and stores it in the regexp.
936 : void SetRegExpAtomData(Handle<JSRegExp> regexp, JSRegExp::Type type,
937 : Handle<String> source, JSRegExp::Flags flags,
938 : Handle<Object> match_pattern);
939 :
940 : // Creates a new FixedArray that holds the data associated with the
941 : // irregexp regexp and stores it in the regexp.
942 : void SetRegExpIrregexpData(Handle<JSRegExp> regexp, JSRegExp::Type type,
943 : Handle<String> source, JSRegExp::Flags flags,
944 : int capture_count);
945 :
946 : // Returns the value for a known global constant (a property of the global
947 : // object which is neither configurable nor writable) like 'undefined'.
948 : // Returns a null handle when the given name is unknown.
949 : Handle<Object> GlobalConstantFor(Handle<Name> name);
950 :
951 : // Converts the given boolean condition to JavaScript boolean value.
952 : Handle<Object> ToBoolean(bool value);
953 :
954 : // Converts the given ToPrimitive hint to it's string representation.
955 : Handle<String> ToPrimitiveHintString(ToPrimitiveHint hint);
956 :
957 : Handle<JSPromise> NewJSPromiseWithoutHook(
958 : AllocationType allocation = AllocationType::kYoung);
959 : Handle<JSPromise> NewJSPromise(
960 : AllocationType allocation = AllocationType::kYoung);
961 :
962 : Handle<CallHandlerInfo> NewCallHandlerInfo(bool has_no_side_effect = false);
963 :
964 : HeapObject NewForTest(Handle<Map> map, AllocationType allocation) {
965 5 : return New(map, allocation);
966 : }
967 :
968 : private:
969 : Isolate* isolate() {
970 : // Downcast to the privately inherited sub-class using c-style casts to
971 : // avoid undefined behavior (as static_cast cannot cast across private
972 : // bases).
973 : // NOLINTNEXTLINE (google-readability-casting)
974 : return (Isolate*)this; // NOLINT(readability/casting)
975 : }
976 :
977 : HeapObject AllocateRawWithImmortalMap(
978 : int size, AllocationType allocation, Map map,
979 : AllocationAlignment alignment = kWordAligned);
980 : HeapObject AllocateRawWithAllocationSite(
981 : Handle<Map> map, AllocationType allocation,
982 : Handle<AllocationSite> allocation_site);
983 :
984 : // Allocate memory for an uninitialized array (e.g., a FixedArray or similar).
985 : HeapObject AllocateRawArray(int size, AllocationType allocation);
986 : HeapObject AllocateRawFixedArray(int length, AllocationType allocation);
987 : HeapObject AllocateRawWeakArrayList(int length, AllocationType allocation);
988 : Handle<FixedArray> NewFixedArrayWithFiller(RootIndex map_root_index,
989 : int length, Object filler,
990 : AllocationType allocation);
991 :
992 : // Allocates new context with given map, sets length and initializes the
993 : // after-header part with uninitialized values and leaves the context header
994 : // uninitialized.
995 : Handle<Context> NewContext(RootIndex map_root_index, int size,
996 : int variadic_part_length,
997 : AllocationType allocation);
998 :
999 : template <typename T>
1000 : Handle<T> AllocateSmallOrderedHashTable(Handle<Map> map, int capacity,
1001 : AllocationType allocation);
1002 :
1003 : // Creates a heap object based on the map. The fields of the heap object are
1004 : // not initialized, it's the responsibility of the caller to do that.
1005 : HeapObject New(Handle<Map> map, AllocationType allocation);
1006 :
1007 : template <typename T>
1008 : Handle<T> CopyArrayWithMap(Handle<T> src, Handle<Map> map);
1009 : template <typename T>
1010 : Handle<T> CopyArrayAndGrow(Handle<T> src, int grow_by,
1011 : AllocationType allocation);
1012 :
1013 : template <bool is_one_byte, typename T>
1014 : Handle<String> AllocateInternalizedStringImpl(T t, int chars,
1015 : uint32_t hash_field);
1016 :
1017 : Handle<SeqOneByteString> AllocateRawOneByteInternalizedString(
1018 : int length, uint32_t hash_field);
1019 :
1020 : Handle<String> AllocateTwoByteInternalizedString(Vector<const uc16> str,
1021 : uint32_t hash_field);
1022 :
1023 : MaybeHandle<String> NewStringFromTwoByte(const uc16* string, int length,
1024 : AllocationType allocation);
1025 :
1026 : // Attempt to find the number in a small cache. If we finds it, return
1027 : // the string representation of the number. Otherwise return undefined.
1028 : Handle<Object> NumberToStringCacheGet(Object number, int hash);
1029 :
1030 : // Update the cache with a new number-string pair.
1031 : Handle<String> NumberToStringCacheSet(Handle<Object> number, int hash,
1032 : const char* string, bool check_cache);
1033 :
1034 : // Create a JSArray with no elements and no length.
1035 : Handle<JSArray> NewJSArray(
1036 : ElementsKind elements_kind,
1037 : AllocationType allocation = AllocationType::kYoung);
1038 :
1039 : Handle<SharedFunctionInfo> NewSharedFunctionInfo(
1040 : MaybeHandle<String> name, MaybeHandle<HeapObject> maybe_function_data,
1041 : int maybe_builtin_index, FunctionKind kind = kNormalFunction);
1042 :
1043 : void InitializeAllocationMemento(AllocationMemento memento,
1044 : AllocationSite allocation_site);
1045 :
1046 : // Initializes a JSObject based on its map.
1047 : void InitializeJSObjectFromMap(Handle<JSObject> obj,
1048 : Handle<Object> properties, Handle<Map> map);
1049 : // Initializes JSObject body starting at given offset.
1050 : void InitializeJSObjectBody(Handle<JSObject> obj, Handle<Map> map,
1051 : int start_offset);
1052 : };
1053 :
1054 : // Utility class to simplify argument handling around JSFunction creation.
1055 : class NewFunctionArgs final {
1056 : public:
1057 : static NewFunctionArgs ForWasm(
1058 : Handle<String> name,
1059 : Handle<WasmExportedFunctionData> exported_function_data, Handle<Map> map);
1060 : V8_EXPORT_PRIVATE static NewFunctionArgs ForBuiltin(Handle<String> name,
1061 : Handle<Map> map,
1062 : int builtin_id);
1063 : static NewFunctionArgs ForFunctionWithoutCode(Handle<String> name,
1064 : Handle<Map> map,
1065 : LanguageMode language_mode);
1066 : static NewFunctionArgs ForBuiltinWithPrototype(
1067 : Handle<String> name, Handle<HeapObject> prototype, InstanceType type,
1068 : int instance_size, int inobject_properties, int builtin_id,
1069 : MutableMode prototype_mutability);
1070 : static NewFunctionArgs ForBuiltinWithoutPrototype(Handle<String> name,
1071 : int builtin_id,
1072 : LanguageMode language_mode);
1073 :
1074 : Handle<Map> GetMap(Isolate* isolate) const;
1075 :
1076 : private:
1077 4541472 : NewFunctionArgs() = default; // Use the static factory constructors.
1078 :
1079 : void SetShouldCreateAndSetInitialMap();
1080 : void SetShouldSetPrototype();
1081 : void SetShouldSetLanguageMode();
1082 :
1083 : // Sentinel value.
1084 : static const int kUninitialized = -1;
1085 :
1086 : Handle<String> name_;
1087 : MaybeHandle<Map> maybe_map_;
1088 : MaybeHandle<WasmExportedFunctionData> maybe_exported_function_data_;
1089 :
1090 : bool should_create_and_set_initial_map_ = false;
1091 : InstanceType type_;
1092 : int instance_size_ = kUninitialized;
1093 : int inobject_properties_ = kUninitialized;
1094 :
1095 : bool should_set_prototype_ = false;
1096 : MaybeHandle<HeapObject> maybe_prototype_;
1097 :
1098 : bool should_set_language_mode_ = false;
1099 : LanguageMode language_mode_;
1100 :
1101 : int maybe_builtin_id_ = kUninitialized;
1102 :
1103 : MutableMode prototype_mutability_;
1104 :
1105 : friend class Factory;
1106 : };
1107 :
1108 : } // namespace internal
1109 : } // namespace v8
1110 :
1111 : #endif // V8_HEAP_FACTORY_H_
|