Home | History | Annotate | Download | only in src
      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_FACTORY_H_
      6 #define V8_FACTORY_H_
      7 
      8 #include "src/isolate.h"
      9 #include "src/messages.h"
     10 #include "src/type-feedback-vector.h"
     11 
     12 namespace v8 {
     13 namespace internal {
     14 
     15 // Interface for handle based allocation.
     16 class Factory final {
     17  public:
     18   Handle<Oddball> NewOddball(Handle<Map> map, const char* to_string,
     19                              Handle<Object> to_number, const char* type_of,
     20                              byte kind);
     21 
     22   // Allocates a fixed array initialized with undefined values.
     23   Handle<FixedArray> NewFixedArray(
     24       int size,
     25       PretenureFlag pretenure = NOT_TENURED);
     26 
     27   // Allocate a new fixed array with non-existing entries (the hole).
     28   Handle<FixedArray> NewFixedArrayWithHoles(
     29       int size,
     30       PretenureFlag pretenure = NOT_TENURED);
     31 
     32   // Allocates an uninitialized fixed array. It must be filled by the caller.
     33   Handle<FixedArray> NewUninitializedFixedArray(int size);
     34 
     35   // Allocate a new uninitialized fixed double array.
     36   // The function returns a pre-allocated empty fixed array for capacity = 0,
     37   // so the return type must be the general fixed array class.
     38   Handle<FixedArrayBase> NewFixedDoubleArray(
     39       int size,
     40       PretenureFlag pretenure = NOT_TENURED);
     41 
     42   // Allocate a new fixed double array with hole values.
     43   Handle<FixedArrayBase> NewFixedDoubleArrayWithHoles(
     44       int size,
     45       PretenureFlag pretenure = NOT_TENURED);
     46 
     47   Handle<OrderedHashSet> NewOrderedHashSet();
     48   Handle<OrderedHashMap> NewOrderedHashMap();
     49 
     50   // Create a new boxed value.
     51   Handle<Box> NewBox(Handle<Object> value);
     52 
     53   // Create a new PrototypeInfo struct.
     54   Handle<PrototypeInfo> NewPrototypeInfo();
     55 
     56   // Create a new SloppyBlockWithEvalContextExtension struct.
     57   Handle<SloppyBlockWithEvalContextExtension>
     58   NewSloppyBlockWithEvalContextExtension(Handle<ScopeInfo> scope_info,
     59                                          Handle<JSObject> extension);
     60 
     61   // Create a pre-tenured empty AccessorPair.
     62   Handle<AccessorPair> NewAccessorPair();
     63 
     64   // Create an empty TypeFeedbackInfo.
     65   Handle<TypeFeedbackInfo> NewTypeFeedbackInfo();
     66 
     67   // Finds the internalized copy for string in the string table.
     68   // If not found, a new string is added to the table and returned.
     69   Handle<String> InternalizeUtf8String(Vector<const char> str);
     70   Handle<String> InternalizeUtf8String(const char* str) {
     71     return InternalizeUtf8String(CStrVector(str));
     72   }
     73   Handle<String> InternalizeString(Handle<String> str);
     74   Handle<String> InternalizeOneByteString(Vector<const uint8_t> str);
     75   Handle<String> InternalizeOneByteString(
     76       Handle<SeqOneByteString>, int from, int length);
     77 
     78   Handle<String> InternalizeTwoByteString(Vector<const uc16> str);
     79 
     80   template<class StringTableKey>
     81   Handle<String> InternalizeStringWithKey(StringTableKey* key);
     82 
     83   Handle<Name> InternalizeName(Handle<Name> name);
     84 
     85 
     86   // String creation functions.  Most of the string creation functions take
     87   // a Heap::PretenureFlag argument to optionally request that they be
     88   // allocated in the old generation.  The pretenure flag defaults to
     89   // DONT_TENURE.
     90   //
     91   // Creates a new String object.  There are two String encodings: one-byte and
     92   // two-byte.  One should choose between the three string factory functions
     93   // based on the encoding of the string buffer that the string is
     94   // initialized from.
     95   //   - ...FromOneByte initializes the string from a buffer that is Latin1
     96   //     encoded (it does not check that the buffer is Latin1 encoded) and
     97   //     the result will be Latin1 encoded.
     98   //   - ...FromUtf8 initializes the string from a buffer that is UTF-8
     99   //     encoded.  If the characters are all ASCII characters, the result
    100   //     will be Latin1 encoded, otherwise it will converted to two-byte.
    101   //   - ...FromTwoByte initializes the string from a buffer that is two-byte
    102   //     encoded.  If the characters are all Latin1 characters, the result
    103   //     will be converted to Latin1, otherwise it will be left as two-byte.
    104   //
    105   // One-byte strings are pretenured when used as keys in the SourceCodeCache.
    106   MUST_USE_RESULT MaybeHandle<String> NewStringFromOneByte(
    107       Vector<const uint8_t> str,
    108       PretenureFlag pretenure = NOT_TENURED);
    109 
    110   template <size_t N>
    111   inline Handle<String> NewStringFromStaticChars(
    112       const char (&str)[N], PretenureFlag pretenure = NOT_TENURED) {
    113     DCHECK(N == StrLength(str) + 1);
    114     return NewStringFromOneByte(STATIC_CHAR_VECTOR(str), pretenure)
    115         .ToHandleChecked();
    116   }
    117 
    118   inline Handle<String> NewStringFromAsciiChecked(
    119       const char* str,
    120       PretenureFlag pretenure = NOT_TENURED) {
    121     return NewStringFromOneByte(
    122         OneByteVector(str), pretenure).ToHandleChecked();
    123   }
    124 
    125 
    126   // Allocates and fully initializes a String.  There are two String encodings:
    127   // one-byte and two-byte. One should choose between the threestring
    128   // allocation functions based on the encoding of the string buffer used to
    129   // initialized the string.
    130   //   - ...FromOneByte initializes the string from a buffer that is Latin1
    131   //     encoded (it does not check that the buffer is Latin1 encoded) and the
    132   //     result will be Latin1 encoded.
    133   //   - ...FromUTF8 initializes the string from a buffer that is UTF-8
    134   //     encoded.  If the characters are all ASCII characters, the result
    135   //     will be Latin1 encoded, otherwise it will converted to two-byte.
    136   //   - ...FromTwoByte initializes the string from a buffer that is two-byte
    137   //     encoded.  If the characters are all Latin1 characters, the
    138   //     result will be converted to Latin1, otherwise it will be left as
    139   //     two-byte.
    140 
    141   // TODO(dcarney): remove this function.
    142   MUST_USE_RESULT inline MaybeHandle<String> NewStringFromAscii(
    143       Vector<const char> str,
    144       PretenureFlag pretenure = NOT_TENURED) {
    145     return NewStringFromOneByte(Vector<const uint8_t>::cast(str), pretenure);
    146   }
    147 
    148   // UTF8 strings are pretenured when used for regexp literal patterns and
    149   // flags in the parser.
    150   MUST_USE_RESULT MaybeHandle<String> NewStringFromUtf8(
    151       Vector<const char> str,
    152       PretenureFlag pretenure = NOT_TENURED);
    153 
    154   MUST_USE_RESULT MaybeHandle<String> NewStringFromTwoByte(
    155       Vector<const uc16> str,
    156       PretenureFlag pretenure = NOT_TENURED);
    157 
    158   // Allocates an internalized string in old space based on the character
    159   // stream.
    160   Handle<String> NewInternalizedStringFromUtf8(Vector<const char> str,
    161                                                int chars, uint32_t hash_field);
    162 
    163   Handle<String> NewOneByteInternalizedString(Vector<const uint8_t> str,
    164                                               uint32_t hash_field);
    165 
    166   Handle<String> NewOneByteInternalizedSubString(
    167       Handle<SeqOneByteString> string, int offset, int length,
    168       uint32_t hash_field);
    169 
    170   Handle<String> NewTwoByteInternalizedString(Vector<const uc16> str,
    171                                               uint32_t hash_field);
    172 
    173   Handle<String> NewInternalizedStringImpl(Handle<String> string, int chars,
    174                                            uint32_t hash_field);
    175 
    176   // Compute the matching internalized string map for a string if possible.
    177   // Empty handle is returned if string is in new space or not flattened.
    178   MUST_USE_RESULT MaybeHandle<Map> InternalizedStringMapForString(
    179       Handle<String> string);
    180 
    181   // Allocates and partially initializes an one-byte or two-byte String. The
    182   // characters of the string are uninitialized. Currently used in regexp code
    183   // only, where they are pretenured.
    184   MUST_USE_RESULT MaybeHandle<SeqOneByteString> NewRawOneByteString(
    185       int length,
    186       PretenureFlag pretenure = NOT_TENURED);
    187   MUST_USE_RESULT MaybeHandle<SeqTwoByteString> NewRawTwoByteString(
    188       int length,
    189       PretenureFlag pretenure = NOT_TENURED);
    190 
    191   // Creates a single character string where the character has given code.
    192   // A cache is used for Latin1 codes.
    193   Handle<String> LookupSingleCharacterStringFromCode(uint32_t code);
    194 
    195   // Create a new cons string object which consists of a pair of strings.
    196   MUST_USE_RESULT MaybeHandle<String> NewConsString(Handle<String> left,
    197                                                     Handle<String> right);
    198 
    199   // Create a new string object which holds a proper substring of a string.
    200   Handle<String> NewProperSubString(Handle<String> str,
    201                                     int begin,
    202                                     int end);
    203 
    204   // Create a new string object which holds a substring of a string.
    205   Handle<String> NewSubString(Handle<String> str, int begin, int end) {
    206     if (begin == 0 && end == str->length()) return str;
    207     return NewProperSubString(str, begin, end);
    208   }
    209 
    210   // Creates a new external String object.  There are two String encodings
    211   // in the system: one-byte and two-byte.  Unlike other String types, it does
    212   // not make sense to have a UTF-8 factory function for external strings,
    213   // because we cannot change the underlying buffer.  Note that these strings
    214   // are backed by a string resource that resides outside the V8 heap.
    215   MUST_USE_RESULT MaybeHandle<String> NewExternalStringFromOneByte(
    216       const ExternalOneByteString::Resource* resource);
    217   MUST_USE_RESULT MaybeHandle<String> NewExternalStringFromTwoByte(
    218       const ExternalTwoByteString::Resource* resource);
    219 
    220   // Create a symbol.
    221   Handle<Symbol> NewSymbol();
    222   Handle<Symbol> NewPrivateSymbol();
    223 
    224   // Create a global (but otherwise uninitialized) context.
    225   Handle<Context> NewNativeContext();
    226 
    227   // Create a script context.
    228   Handle<Context> NewScriptContext(Handle<JSFunction> function,
    229                                    Handle<ScopeInfo> scope_info);
    230 
    231   // Create an empty script context table.
    232   Handle<ScriptContextTable> NewScriptContextTable();
    233 
    234   // Create a module context.
    235   Handle<Context> NewModuleContext(Handle<ScopeInfo> scope_info);
    236 
    237   // Create a function context.
    238   Handle<Context> NewFunctionContext(int length, Handle<JSFunction> function);
    239 
    240   // Create a catch context.
    241   Handle<Context> NewCatchContext(Handle<JSFunction> function,
    242                                   Handle<Context> previous,
    243                                   Handle<String> name,
    244                                   Handle<Object> thrown_object);
    245 
    246   // Create a 'with' context.
    247   Handle<Context> NewWithContext(Handle<JSFunction> function,
    248                                  Handle<Context> previous,
    249                                  Handle<JSReceiver> extension);
    250 
    251   // Create a block context.
    252   Handle<Context> NewBlockContext(Handle<JSFunction> function,
    253                                   Handle<Context> previous,
    254                                   Handle<ScopeInfo> scope_info);
    255 
    256   // Allocate a new struct.  The struct is pretenured (allocated directly in
    257   // the old generation).
    258   Handle<Struct> NewStruct(InstanceType type);
    259 
    260   Handle<CodeCache> NewCodeCache();
    261 
    262   Handle<AliasedArgumentsEntry> NewAliasedArgumentsEntry(
    263       int aliased_context_slot);
    264 
    265   Handle<ExecutableAccessorInfo> NewExecutableAccessorInfo();
    266 
    267   Handle<Script> NewScript(Handle<String> source);
    268 
    269   // Foreign objects are pretenured when allocated by the bootstrapper.
    270   Handle<Foreign> NewForeign(Address addr,
    271                              PretenureFlag pretenure = NOT_TENURED);
    272 
    273   // Allocate a new foreign object.  The foreign is pretenured (allocated
    274   // directly in the old generation).
    275   Handle<Foreign> NewForeign(const AccessorDescriptor* foreign);
    276 
    277   Handle<ByteArray> NewByteArray(int length,
    278                                  PretenureFlag pretenure = NOT_TENURED);
    279 
    280   Handle<BytecodeArray> NewBytecodeArray(int length, const byte* raw_bytecodes,
    281                                          int frame_size, int parameter_count,
    282                                          Handle<FixedArray> constant_pool);
    283 
    284   Handle<FixedTypedArrayBase> NewFixedTypedArrayWithExternalPointer(
    285       int length, ExternalArrayType array_type, void* external_pointer,
    286       PretenureFlag pretenure = NOT_TENURED);
    287 
    288   Handle<FixedTypedArrayBase> NewFixedTypedArray(
    289       int length, ExternalArrayType array_type, bool initialize,
    290       PretenureFlag pretenure = NOT_TENURED);
    291 
    292   Handle<Cell> NewCell(Handle<Object> value);
    293 
    294   Handle<PropertyCell> NewPropertyCell();
    295 
    296   Handle<WeakCell> NewWeakCell(Handle<HeapObject> value);
    297 
    298   Handle<TransitionArray> NewTransitionArray(int capacity);
    299 
    300   // Allocate a tenured AllocationSite. It's payload is null.
    301   Handle<AllocationSite> NewAllocationSite();
    302 
    303   Handle<Map> NewMap(
    304       InstanceType type,
    305       int instance_size,
    306       ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND);
    307 
    308   Handle<HeapObject> NewFillerObject(int size,
    309                                      bool double_align,
    310                                      AllocationSpace space);
    311 
    312   Handle<JSObject> NewFunctionPrototype(Handle<JSFunction> function);
    313 
    314   Handle<JSObject> CopyJSObject(Handle<JSObject> object);
    315 
    316   Handle<JSObject> CopyJSObjectWithAllocationSite(Handle<JSObject> object,
    317                                                   Handle<AllocationSite> site);
    318 
    319   Handle<FixedArray> CopyFixedArrayWithMap(Handle<FixedArray> array,
    320                                            Handle<Map> map);
    321 
    322   Handle<FixedArray> CopyFixedArrayAndGrow(
    323       Handle<FixedArray> array, int grow_by,
    324       PretenureFlag pretenure = NOT_TENURED);
    325 
    326   Handle<FixedArray> CopyFixedArray(Handle<FixedArray> array);
    327 
    328   // This method expects a COW array in new space, and creates a copy
    329   // of it in old space.
    330   Handle<FixedArray> CopyAndTenureFixedCOWArray(Handle<FixedArray> array);
    331 
    332   Handle<FixedDoubleArray> CopyFixedDoubleArray(
    333       Handle<FixedDoubleArray> array);
    334 
    335   // Numbers (e.g. literals) are pretenured by the parser.
    336   // The return value may be a smi or a heap number.
    337   Handle<Object> NewNumber(double value,
    338                            PretenureFlag pretenure = NOT_TENURED);
    339 
    340   Handle<Object> NewNumberFromInt(int32_t value,
    341                                   PretenureFlag pretenure = NOT_TENURED);
    342   Handle<Object> NewNumberFromUint(uint32_t value,
    343                                   PretenureFlag pretenure = NOT_TENURED);
    344   Handle<Object> NewNumberFromSize(size_t value,
    345                                    PretenureFlag pretenure = NOT_TENURED) {
    346     // We can't use Smi::IsValid() here because that operates on a signed
    347     // intptr_t, and casting from size_t could create a bogus sign bit.
    348     if (value <= static_cast<size_t>(Smi::kMaxValue)) {
    349       return Handle<Object>(Smi::FromIntptr(static_cast<intptr_t>(value)),
    350                             isolate());
    351     }
    352     return NewNumber(static_cast<double>(value), pretenure);
    353   }
    354   Handle<HeapNumber> NewHeapNumber(double value,
    355                                    MutableMode mode = IMMUTABLE,
    356                                    PretenureFlag pretenure = NOT_TENURED);
    357 
    358 #define SIMD128_NEW_DECL(TYPE, Type, type, lane_count, lane_type) \
    359   Handle<Type> New##Type(lane_type lanes[lane_count],             \
    360                          PretenureFlag pretenure = NOT_TENURED);
    361   SIMD128_TYPES(SIMD128_NEW_DECL)
    362 #undef SIMD128_NEW_DECL
    363 
    364   // These objects are used by the api to create env-independent data
    365   // structures in the heap.
    366   inline Handle<JSObject> NewNeanderObject() {
    367     return NewJSObjectFromMap(neander_map());
    368   }
    369 
    370   Handle<JSWeakMap> NewJSWeakMap();
    371 
    372   Handle<JSObject> NewArgumentsObject(Handle<JSFunction> callee, int length);
    373 
    374   // JS objects are pretenured when allocated by the bootstrapper and
    375   // runtime.
    376   Handle<JSObject> NewJSObject(Handle<JSFunction> constructor,
    377                                PretenureFlag pretenure = NOT_TENURED);
    378   // JSObject that should have a memento pointing to the allocation site.
    379   Handle<JSObject> NewJSObjectWithMemento(Handle<JSFunction> constructor,
    380                                           Handle<AllocationSite> site);
    381 
    382   // Global objects are pretenured and initialized based on a constructor.
    383   Handle<JSGlobalObject> NewJSGlobalObject(Handle<JSFunction> constructor);
    384 
    385   // JS objects are pretenured when allocated by the bootstrapper and
    386   // runtime.
    387   Handle<JSObject> NewJSObjectFromMap(
    388       Handle<Map> map,
    389       PretenureFlag pretenure = NOT_TENURED,
    390       Handle<AllocationSite> allocation_site = Handle<AllocationSite>::null());
    391 
    392   // JS modules are pretenured.
    393   Handle<JSModule> NewJSModule(Handle<Context> context,
    394                                Handle<ScopeInfo> scope_info);
    395 
    396   // JS arrays are pretenured when allocated by the parser.
    397 
    398   // Create a JSArray with no elements.
    399   Handle<JSArray> NewJSArray(ElementsKind elements_kind,
    400                              Strength strength = Strength::WEAK,
    401                              PretenureFlag pretenure = NOT_TENURED);
    402 
    403   // Create a JSArray with a specified length and elements initialized
    404   // according to the specified mode.
    405   Handle<JSArray> NewJSArray(
    406       ElementsKind elements_kind, int length, int capacity,
    407       Strength strength = Strength::WEAK,
    408       ArrayStorageAllocationMode mode = DONT_INITIALIZE_ARRAY_ELEMENTS,
    409       PretenureFlag pretenure = NOT_TENURED);
    410 
    411   Handle<JSArray> NewJSArray(
    412       int capacity, ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND,
    413       Strength strength = Strength::WEAK,
    414       PretenureFlag pretenure = NOT_TENURED) {
    415     if (capacity != 0) {
    416       elements_kind = GetHoleyElementsKind(elements_kind);
    417     }
    418     return NewJSArray(elements_kind, 0, capacity, strength,
    419                       INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE, pretenure);
    420   }
    421 
    422   // Create a JSArray with the given elements.
    423   Handle<JSArray> NewJSArrayWithElements(Handle<FixedArrayBase> elements,
    424                                          ElementsKind elements_kind, int length,
    425                                          Strength strength = Strength::WEAK,
    426                                          PretenureFlag pretenure = NOT_TENURED);
    427 
    428   Handle<JSArray> NewJSArrayWithElements(
    429       Handle<FixedArrayBase> elements,
    430       ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND,
    431       Strength strength = Strength::WEAK,
    432       PretenureFlag pretenure = NOT_TENURED) {
    433     return NewJSArrayWithElements(elements, elements_kind, elements->length(),
    434                                   strength, pretenure);
    435   }
    436 
    437   void NewJSArrayStorage(
    438       Handle<JSArray> array,
    439       int length,
    440       int capacity,
    441       ArrayStorageAllocationMode mode = DONT_INITIALIZE_ARRAY_ELEMENTS);
    442 
    443   Handle<JSGeneratorObject> NewJSGeneratorObject(Handle<JSFunction> function);
    444 
    445   Handle<JSArrayBuffer> NewJSArrayBuffer(
    446       SharedFlag shared = SharedFlag::kNotShared,
    447       PretenureFlag pretenure = NOT_TENURED);
    448 
    449   Handle<JSTypedArray> NewJSTypedArray(ExternalArrayType type,
    450                                        PretenureFlag pretenure = NOT_TENURED);
    451 
    452   Handle<JSTypedArray> NewJSTypedArray(ElementsKind elements_kind,
    453                                        PretenureFlag pretenure = NOT_TENURED);
    454 
    455   // Creates a new JSTypedArray with the specified buffer.
    456   Handle<JSTypedArray> NewJSTypedArray(ExternalArrayType type,
    457                                        Handle<JSArrayBuffer> buffer,
    458                                        size_t byte_offset, size_t length,
    459                                        PretenureFlag pretenure = NOT_TENURED);
    460 
    461   // Creates a new on-heap JSTypedArray.
    462   Handle<JSTypedArray> NewJSTypedArray(ElementsKind elements_kind,
    463                                        size_t number_of_elements,
    464                                        PretenureFlag pretenure = NOT_TENURED);
    465 
    466   Handle<JSDataView> NewJSDataView();
    467   Handle<JSDataView> NewJSDataView(Handle<JSArrayBuffer> buffer,
    468                                    size_t byte_offset, size_t byte_length);
    469 
    470   Handle<JSMap> NewJSMap();
    471   Handle<JSSet> NewJSSet();
    472 
    473   // TODO(aandrey): Maybe these should take table, index and kind arguments.
    474   Handle<JSMapIterator> NewJSMapIterator();
    475   Handle<JSSetIterator> NewJSSetIterator();
    476 
    477   // Creates a new JSIteratorResult object with the arguments {value} and
    478   // {done}.  Implemented according to ES6 section 7.4.7 CreateIterResultObject.
    479   Handle<JSIteratorResult> NewJSIteratorResult(Handle<Object> value,
    480                                                Handle<Object> done);
    481 
    482   // Allocates a bound function.
    483   MaybeHandle<JSBoundFunction> NewJSBoundFunction(
    484       Handle<JSReceiver> target_function, Handle<Object> bound_this,
    485       Vector<Handle<Object>> bound_args);
    486 
    487   // Allocates a Harmony proxy.
    488   Handle<JSProxy> NewJSProxy(Handle<JSReceiver> target,
    489                              Handle<JSReceiver> handler);
    490 
    491   // Reinitialize an JSGlobalProxy based on a constructor.  The object
    492   // must have the same size as objects allocated using the
    493   // constructor.  The object is reinitialized and behaves as an
    494   // object that has been freshly allocated using the constructor.
    495   void ReinitializeJSGlobalProxy(Handle<JSGlobalProxy> global,
    496                                  Handle<JSFunction> constructor);
    497 
    498   Handle<JSGlobalProxy> NewUninitializedJSGlobalProxy();
    499 
    500   Handle<JSFunction> NewFunction(Handle<String> name, Handle<Code> code,
    501                                  Handle<Object> prototype,
    502                                  bool read_only_prototype = false,
    503                                  bool is_strict = false);
    504   Handle<JSFunction> NewFunction(Handle<String> name);
    505   Handle<JSFunction> NewFunctionWithoutPrototype(Handle<String> name,
    506                                                  Handle<Code> code,
    507                                                  bool is_strict = false);
    508 
    509   Handle<JSFunction> NewFunctionFromSharedFunctionInfo(
    510       Handle<Map> initial_map, Handle<SharedFunctionInfo> function_info,
    511       Handle<Context> context, PretenureFlag pretenure = TENURED);
    512 
    513   Handle<JSFunction> NewFunctionFromSharedFunctionInfo(
    514       Handle<SharedFunctionInfo> function_info, Handle<Context> context,
    515       PretenureFlag pretenure = TENURED);
    516 
    517   Handle<JSFunction> NewFunction(Handle<String> name, Handle<Code> code,
    518                                  Handle<Object> prototype, InstanceType type,
    519                                  int instance_size,
    520                                  bool read_only_prototype = false,
    521                                  bool install_constructor = false,
    522                                  bool is_strict = false);
    523   Handle<JSFunction> NewFunction(Handle<String> name,
    524                                  Handle<Code> code,
    525                                  InstanceType type,
    526                                  int instance_size);
    527   Handle<JSFunction> NewFunction(Handle<Map> map, Handle<String> name,
    528                                  MaybeHandle<Code> maybe_code);
    529 
    530   // Create a serialized scope info.
    531   Handle<ScopeInfo> NewScopeInfo(int length);
    532 
    533   // Create an External object for V8's external API.
    534   Handle<JSObject> NewExternal(void* value);
    535 
    536   // The reference to the Code object is stored in self_reference.
    537   // This allows generated code to reference its own Code object
    538   // by containing this handle.
    539   Handle<Code> NewCode(const CodeDesc& desc,
    540                        Code::Flags flags,
    541                        Handle<Object> self_reference,
    542                        bool immovable = false,
    543                        bool crankshafted = false,
    544                        int prologue_offset = Code::kPrologueOffsetNotSet,
    545                        bool is_debug = false);
    546 
    547   Handle<Code> CopyCode(Handle<Code> code);
    548 
    549   Handle<Code> CopyCode(Handle<Code> code, Vector<byte> reloc_info);
    550 
    551   // Interface for creating error objects.
    552   Handle<Object> NewError(Handle<JSFunction> constructor,
    553                           Handle<String> message);
    554 
    555   Handle<Object> NewInvalidStringLengthError() {
    556     return NewRangeError(MessageTemplate::kInvalidStringLength);
    557   }
    558 
    559   Handle<Object> NewError(Handle<JSFunction> constructor,
    560                           MessageTemplate::Template template_index,
    561                           Handle<Object> arg0 = Handle<Object>(),
    562                           Handle<Object> arg1 = Handle<Object>(),
    563                           Handle<Object> arg2 = Handle<Object>());
    564 
    565 #define DECLARE_ERROR(NAME)                                          \
    566   Handle<Object> New##NAME(MessageTemplate::Template template_index, \
    567                            Handle<Object> arg0 = Handle<Object>(),   \
    568                            Handle<Object> arg1 = Handle<Object>(),   \
    569                            Handle<Object> arg2 = Handle<Object>());
    570   DECLARE_ERROR(Error)
    571   DECLARE_ERROR(EvalError)
    572   DECLARE_ERROR(RangeError)
    573   DECLARE_ERROR(ReferenceError)
    574   DECLARE_ERROR(SyntaxError)
    575   DECLARE_ERROR(TypeError)
    576 #undef DEFINE_ERROR
    577 
    578   Handle<String> NumberToString(Handle<Object> number,
    579                                 bool check_number_string_cache = true);
    580 
    581   Handle<String> Uint32ToString(uint32_t value) {
    582     return NumberToString(NewNumberFromUint(value));
    583   }
    584 
    585   Handle<JSFunction> InstallMembers(Handle<JSFunction> function);
    586 
    587 #define ROOT_ACCESSOR(type, name, camel_name)                         \
    588   inline Handle<type> name() {                                        \
    589     return Handle<type>(bit_cast<type**>(                             \
    590         &isolate()->heap()->roots_[Heap::k##camel_name##RootIndex])); \
    591   }
    592   ROOT_LIST(ROOT_ACCESSOR)
    593 #undef ROOT_ACCESSOR
    594 
    595 #define STRUCT_MAP_ACCESSOR(NAME, Name, name)                      \
    596   inline Handle<Map> name##_map() {                                \
    597     return Handle<Map>(bit_cast<Map**>(                            \
    598         &isolate()->heap()->roots_[Heap::k##Name##MapRootIndex])); \
    599   }
    600   STRUCT_LIST(STRUCT_MAP_ACCESSOR)
    601 #undef STRUCT_MAP_ACCESSOR
    602 
    603 #define STRING_ACCESSOR(name, str)                              \
    604   inline Handle<String> name() {                                \
    605     return Handle<String>(bit_cast<String**>(                   \
    606         &isolate()->heap()->roots_[Heap::k##name##RootIndex])); \
    607   }
    608   INTERNALIZED_STRING_LIST(STRING_ACCESSOR)
    609 #undef STRING_ACCESSOR
    610 
    611 #define SYMBOL_ACCESSOR(name)                                   \
    612   inline Handle<Symbol> name() {                                \
    613     return Handle<Symbol>(bit_cast<Symbol**>(                   \
    614         &isolate()->heap()->roots_[Heap::k##name##RootIndex])); \
    615   }
    616   PRIVATE_SYMBOL_LIST(SYMBOL_ACCESSOR)
    617 #undef SYMBOL_ACCESSOR
    618 
    619 #define SYMBOL_ACCESSOR(name, description)                      \
    620   inline Handle<Symbol> name() {                                \
    621     return Handle<Symbol>(bit_cast<Symbol**>(                   \
    622         &isolate()->heap()->roots_[Heap::k##name##RootIndex])); \
    623   }
    624   PUBLIC_SYMBOL_LIST(SYMBOL_ACCESSOR)
    625   WELL_KNOWN_SYMBOL_LIST(SYMBOL_ACCESSOR)
    626 #undef SYMBOL_ACCESSOR
    627 
    628   // Allocates a new SharedFunctionInfo object.
    629   Handle<SharedFunctionInfo> NewSharedFunctionInfo(
    630       Handle<String> name, int number_of_literals, FunctionKind kind,
    631       Handle<Code> code, Handle<ScopeInfo> scope_info,
    632       Handle<TypeFeedbackVector> feedback_vector);
    633   Handle<SharedFunctionInfo> NewSharedFunctionInfo(Handle<String> name,
    634                                                    MaybeHandle<Code> code,
    635                                                    bool is_constructor);
    636 
    637   // Allocates a new JSMessageObject object.
    638   Handle<JSMessageObject> NewJSMessageObject(MessageTemplate::Template message,
    639                                              Handle<Object> argument,
    640                                              int start_position,
    641                                              int end_position,
    642                                              Handle<Object> script,
    643                                              Handle<Object> stack_frames);
    644 
    645   Handle<DebugInfo> NewDebugInfo(Handle<SharedFunctionInfo> shared);
    646 
    647   // Return a map for given number of properties using the map cache in the
    648   // native context.
    649   Handle<Map> ObjectLiteralMapFromCache(Handle<Context> context,
    650                                         int number_of_properties,
    651                                         bool is_strong,
    652                                         bool* is_result_from_cache);
    653 
    654   // Creates a new FixedArray that holds the data associated with the
    655   // atom regexp and stores it in the regexp.
    656   void SetRegExpAtomData(Handle<JSRegExp> regexp,
    657                          JSRegExp::Type type,
    658                          Handle<String> source,
    659                          JSRegExp::Flags flags,
    660                          Handle<Object> match_pattern);
    661 
    662   // Creates a new FixedArray that holds the data associated with the
    663   // irregexp regexp and stores it in the regexp.
    664   void SetRegExpIrregexpData(Handle<JSRegExp> regexp,
    665                              JSRegExp::Type type,
    666                              Handle<String> source,
    667                              JSRegExp::Flags flags,
    668                              int capture_count);
    669 
    670   // Returns the value for a known global constant (a property of the global
    671   // object which is neither configurable nor writable) like 'undefined'.
    672   // Returns a null handle when the given name is unknown.
    673   Handle<Object> GlobalConstantFor(Handle<Name> name);
    674 
    675   // Converts the given boolean condition to JavaScript boolean value.
    676   Handle<Object> ToBoolean(bool value);
    677 
    678  private:
    679   Isolate* isolate() { return reinterpret_cast<Isolate*>(this); }
    680 
    681   // Creates a heap object based on the map. The fields of the heap object are
    682   // not initialized by New<>() functions. It's the responsibility of the caller
    683   // to do that.
    684   template<typename T>
    685   Handle<T> New(Handle<Map> map, AllocationSpace space);
    686 
    687   template<typename T>
    688   Handle<T> New(Handle<Map> map,
    689                 AllocationSpace space,
    690                 Handle<AllocationSite> allocation_site);
    691 
    692   // Creates a code object that is not yet fully initialized yet.
    693   inline Handle<Code> NewCodeRaw(int object_size, bool immovable);
    694 
    695   // Attempt to find the number in a small cache.  If we finds it, return
    696   // the string representation of the number.  Otherwise return undefined.
    697   Handle<Object> GetNumberStringCache(Handle<Object> number);
    698 
    699   // Update the cache with a new number-string pair.
    700   void SetNumberStringCache(Handle<Object> number, Handle<String> string);
    701 
    702   // Creates a function initialized with a shared part.
    703   Handle<JSFunction> NewFunction(Handle<Map> map,
    704                                  Handle<SharedFunctionInfo> info,
    705                                  Handle<Context> context,
    706                                  PretenureFlag pretenure = TENURED);
    707 };
    708 
    709 }  // namespace internal
    710 }  // namespace v8
    711 
    712 #endif  // V8_FACTORY_H_
    713