1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/factory.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/accessors.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation-site-scopes.h"
962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/ast/ast.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h"
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/bootstrapper.h"
12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/compiler.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/conversions.h"
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/isolate-inl.h"
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/macro-assembler.h"
1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/module-info.h"
1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/scope-info.h"
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Calls the FUNCTION_CALL function and retries it up to three times
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// to guarantee that any allocations performed during the call will
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// succeed if there's enough memory.
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch//
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Warning: Do not use the identifiers __object__, __maybe_object__,
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// __allocation__ or __scope__ in a call to this macro.
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define RETURN_OBJECT_UNLESS_RETRY(ISOLATE, TYPE)         \
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (__allocation__.To(&__object__)) {                   \
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(__object__ != (ISOLATE)->heap()->exception()); \
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Handle<TYPE>(TYPE::cast(__object__), ISOLATE); \
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CALL_HEAP_FUNCTION(ISOLATE, FUNCTION_CALL, TYPE)                      \
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  do {                                                                        \
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    AllocationResult __allocation__ = FUNCTION_CALL;                          \
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Object* __object__ = NULL;                                                \
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RETURN_OBJECT_UNLESS_RETRY(ISOLATE, TYPE)                                 \
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    /* Two GCs before panicking.  In newspace will almost always succeed. */  \
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int __i__ = 0; __i__ < 2; __i__++) {                                 \
43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      (ISOLATE)->heap()->CollectGarbage(                                      \
44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          __allocation__.RetrySpace(),                                        \
45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          GarbageCollectionReason::kAllocationFailure);                       \
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __allocation__ = FUNCTION_CALL;                                         \
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      RETURN_OBJECT_UNLESS_RETRY(ISOLATE, TYPE)                               \
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }                                                                         \
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    (ISOLATE)->counters()->gc_last_resort_from_handles()->Increment();        \
50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    (ISOLATE)->heap()->CollectAllAvailableGarbage(                            \
51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        GarbageCollectionReason::kLastResort);                                \
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    {                                                                         \
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      AlwaysAllocateScope __scope__(ISOLATE);                                 \
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      __allocation__ = FUNCTION_CALL;                                         \
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }                                                                         \
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RETURN_OBJECT_UNLESS_RETRY(ISOLATE, TYPE)                                 \
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    /* TODO(1181417): Fix this. */                                            \
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    v8::internal::Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); \
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Handle<TYPE>();                                                    \
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } while (false)
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T>
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<T> Factory::New(Handle<Map> map, AllocationSpace space) {
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(),
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->Allocate(*map, space),
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      T);
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T>
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<T> Factory::New(Handle<Map> map,
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       AllocationSpace space,
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       Handle<AllocationSite> allocation_site) {
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(),
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->Allocate(*map, space, *allocation_site),
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      T);
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<HeapObject> Factory::NewFillerObject(int size,
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                            bool double_align,
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                            AllocationSpace space) {
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(),
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateFillerObject(size, double_align, space),
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HeapObject);
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<PrototypeInfo> Factory::NewPrototypeInfo() {
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<PrototypeInfo> result =
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<PrototypeInfo>::cast(NewStruct(PROTOTYPE_INFO_TYPE));
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  result->set_prototype_users(WeakFixedArray::Empty());
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  result->set_registry_slot(PrototypeInfo::UNREGISTERED);
97c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->set_validity_cell(Smi::kZero);
9813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  result->set_bit_field(0);
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return result;
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
10262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Tuple2> Factory::NewTuple2(Handle<Object> value1,
10362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                  Handle<Object> value2) {
10462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Tuple2> result = Handle<Tuple2>::cast(NewStruct(TUPLE2_TYPE));
10562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  result->set_value1(*value1);
10662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  result->set_value2(*value2);
10762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return result;
10862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
10962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
110c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<Tuple3> Factory::NewTuple3(Handle<Object> value1, Handle<Object> value2,
111c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                  Handle<Object> value3) {
112c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<Tuple3> result = Handle<Tuple3>::cast(NewStruct(TUPLE3_TYPE));
113c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->set_value1(*value1);
114c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->set_value2(*value2);
115c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->set_value3(*value3);
116c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return result;
117c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
118c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
119f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<ContextExtension> Factory::NewContextExtension(
120f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Handle<ScopeInfo> scope_info, Handle<Object> extension) {
121f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<ContextExtension> result =
122f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Handle<ContextExtension>::cast(NewStruct(CONTEXT_EXTENSION_TYPE));
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  result->set_scope_info(*scope_info);
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  result->set_extension(*extension);
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return result;
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<ConstantElementsPair> Factory::NewConstantElementsPair(
12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ElementsKind elements_kind, Handle<FixedArrayBase> constant_values) {
13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<ConstantElementsPair> result = Handle<ConstantElementsPair>::cast(
13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      NewStruct(CONSTANT_ELEMENTS_PAIR_TYPE));
13262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  result->set_elements_kind(elements_kind);
13362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  result->set_constant_values(*constant_values);
13462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return result;
13562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
13662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Oddball> Factory::NewOddball(Handle<Map> map, const char* to_string,
138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                    Handle<Object> to_number,
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    const char* type_of, byte kind) {
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Oddball> oddball = New<Oddball>(map, OLD_SPACE);
141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Oddball::Initialize(isolate(), oddball, to_string, to_number, type_of, kind);
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return oddball;
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<FixedArray> Factory::NewFixedArray(int size, PretenureFlag pretenure) {
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= size);
14844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
14944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
15044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateFixedArray(size, pretenure),
15144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      FixedArray);
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
154c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochMaybeHandle<FixedArray> Factory::TryNewFixedArray(int size,
155c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                  PretenureFlag pretenure) {
156c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(0 <= size);
157c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  AllocationResult allocation =
158c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      isolate()->heap()->AllocateFixedArray(size, pretenure);
159c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Object* array = NULL;
160c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!allocation.To(&array)) return MaybeHandle<FixedArray>();
161c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return Handle<FixedArray>(FixedArray::cast(array), isolate());
162c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1646ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<FixedArray> Factory::NewFixedArrayWithHoles(int size,
1656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                                   PretenureFlag pretenure) {
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= size);
16744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateFixedArrayWithFiller(size,
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                      pretenure,
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                      *the_hole_value()),
17244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      FixedArray);
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArray> Factory::NewUninitializedFixedArray(int size) {
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(),
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateUninitializedFixedArray(size),
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FixedArray);
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<BoilerplateDescription> Factory::NewBoilerplateDescription(
18362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    int boilerplate, int all_properties, int index_keys, bool has_seen_proto) {
18462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_GE(boilerplate, 0);
18562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_GE(all_properties, index_keys);
18662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_GE(index_keys, 0);
18762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
18862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int backing_store_size =
18962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      all_properties - index_keys - (has_seen_proto ? 1 : 0);
19062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_GE(backing_store_size, 0);
19162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool has_different_size_backing_store = boilerplate != backing_store_size;
19262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
19362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Space for name and value for every boilerplate property.
19462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int size = 2 * boilerplate;
19562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
19662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (has_different_size_backing_store) {
19762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // An extra entry for the backing store size.
19862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    size++;
19962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
20062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
20162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<BoilerplateDescription> description =
20262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Handle<BoilerplateDescription>::cast(NewFixedArray(size, TENURED));
20362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
20462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (has_different_size_backing_store) {
20562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK((boilerplate != (all_properties - index_keys)) || has_seen_proto);
20662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    description->set_backing_store_size(isolate(), backing_store_size);
20762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
20862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return description;
20962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArrayBase> Factory::NewFixedDoubleArray(int size,
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                    PretenureFlag pretenure) {
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= size);
2143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  CALL_HEAP_FUNCTION(
2153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      isolate(),
2163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      isolate()->heap()->AllocateUninitializedFixedDoubleArray(size, pretenure),
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FixedArrayBase);
2183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
2193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArrayBase> Factory::NewFixedDoubleArrayWithHoles(
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int size,
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PretenureFlag pretenure) {
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= size);
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArrayBase> array = NewFixedDoubleArray(size, pretenure);
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (size > 0) {
22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<FixedDoubleArray>::cast(array)->FillWithHoles(0, size);
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return array;
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
232f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<FrameArray> Factory::NewFrameArray(int number_of_frames,
233f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                          PretenureFlag pretenure) {
234f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_LE(0, number_of_frames);
235f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<FixedArray> result =
236f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      NewFixedArrayWithHoles(FrameArray::LengthFor(number_of_frames));
237c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->set(FrameArray::kFrameCountIndex, Smi::kZero);
238f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return Handle<FrameArray>::cast(result);
239f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<OrderedHashSet> Factory::NewOrderedHashSet() {
242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return OrderedHashSet::Allocate(isolate(), OrderedHashSet::kMinCapacity);
2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<OrderedHashMap> Factory::NewOrderedHashMap() {
247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return OrderedHashMap::Allocate(isolate(), OrderedHashMap::kMinCapacity);
24869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
24969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
25069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<AccessorPair> Factory::NewAccessorPair() {
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<AccessorPair> accessors =
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<AccessorPair>::cast(NewStruct(ACCESSOR_PAIR_TYPE));
254bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  accessors->set_getter(*null_value(), SKIP_WRITE_BARRIER);
255bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  accessors->set_setter(*null_value(), SKIP_WRITE_BARRIER);
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return accessors;
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<TypeFeedbackInfo> Factory::NewTypeFeedbackInfo() {
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<TypeFeedbackInfo> info =
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<TypeFeedbackInfo>::cast(NewStruct(TYPE_FEEDBACK_INFO_TYPE));
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info->initialize_storage();
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return info;
265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Internalized strings are created in the old generation (data space).
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::InternalizeUtf8String(Vector<const char> string) {
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Utf8StringKey key(string, isolate()->heap()->HashSeed());
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return InternalizeStringWithKey(&key);
272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::InternalizeOneByteString(Vector<const uint8_t> string) {
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OneByteStringKey key(string, isolate()->heap()->HashSeed());
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return InternalizeStringWithKey(&key);
2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::InternalizeOneByteString(
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<SeqOneByteString> string, int from, int length) {
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SeqOneByteSubStringKey key(string, from, length);
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return InternalizeStringWithKey(&key);
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::InternalizeTwoByteString(Vector<const uc16> string) {
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TwoByteStringKey key(string, isolate()->heap()->HashSeed());
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return InternalizeStringWithKey(&key);
291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
292257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class StringTableKey>
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::InternalizeStringWithKey(StringTableKey* key) {
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return StringTable::LookupKey(isolate(), key);
2979fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}
2989fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<String> Factory::NewStringFromOneByte(Vector<const uint8_t> string,
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                  PretenureFlag pretenure) {
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int length = string.length();
30362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (length == 0) return empty_string();
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length == 1) return LookupSingleCharacterStringFromCode(string[0]);
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<SeqOneByteString> result;
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSIGN_RETURN_ON_EXCEPTION(
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(),
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      result,
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NewRawOneByteString(string.length(), pretenure),
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      String);
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DisallowHeapAllocation no_gc;
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Copy the characters into the new object.
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CopyChars(SeqOneByteString::cast(*result)->GetChars(),
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            string.start(),
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            length);
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<String> Factory::NewStringFromUtf8(Vector<const char> string,
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               PretenureFlag pretenure) {
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Check for ASCII first since this is the common case.
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* start = string.start();
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int length = string.length();
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int non_ascii_start = String::NonAsciiStart(start, length);
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (non_ascii_start >= length) {
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // If the string is ASCII, we do not need to convert the characters
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // since UTF8 is backwards compatible with ASCII.
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return NewStringFromOneByte(Vector<const uint8_t>::cast(string), pretenure);
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
331257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Non-ASCII and we need to decode.
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Access<UnicodeCache::Utf8Decoder>
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      decoder(isolate()->unicode_cache()->utf8_decoder());
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  decoder->Reset(string.start() + non_ascii_start,
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 length - non_ascii_start);
337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int utf16_length = static_cast<int>(decoder->Utf16Length());
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(utf16_length > 0);
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allocate string.
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<SeqTwoByteString> result;
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSIGN_RETURN_ON_EXCEPTION(
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(), result,
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NewRawTwoByteString(non_ascii_start + utf16_length, pretenure),
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      String);
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Copy ASCII portion.
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint16_t* data = result->GetChars();
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* ascii_data = string.start();
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < non_ascii_start; i++) {
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    *data++ = *ascii_data++;
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Now write the remainder.
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  decoder->WriteUtf16(data, utf16_length);
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
356c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochMaybeHandle<String> Factory::NewStringFromUtf8SubString(
357c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Handle<SeqOneByteString> str, int begin, int length,
358c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    PretenureFlag pretenure) {
359c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Check for ASCII first since this is the common case.
360c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  const char* start = reinterpret_cast<const char*>(str->GetChars() + begin);
361c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int non_ascii_start = String::NonAsciiStart(start, length);
362c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (non_ascii_start >= length) {
363c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // If the string is ASCII, we can just make a substring.
364c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // TODO(v8): the pretenure flag is ignored in this case.
365c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    return NewSubString(str, begin, begin + length);
366c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
367c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
368c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Non-ASCII and we need to decode.
369c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Access<UnicodeCache::Utf8Decoder> decoder(
370c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      isolate()->unicode_cache()->utf8_decoder());
371c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  decoder->Reset(start + non_ascii_start, length - non_ascii_start);
372c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int utf16_length = static_cast<int>(decoder->Utf16Length());
373c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(utf16_length > 0);
374c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Allocate string.
375c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<SeqTwoByteString> result;
376c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ASSIGN_RETURN_ON_EXCEPTION(
377c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      isolate(), result,
378c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      NewRawTwoByteString(non_ascii_start + utf16_length, pretenure), String);
379c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
380c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Reset the decoder, because the original {str} may have moved.
381c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  const char* ascii_data =
382c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      reinterpret_cast<const char*>(str->GetChars() + begin);
383c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  decoder->Reset(ascii_data + non_ascii_start, length - non_ascii_start);
384c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Copy ASCII portion.
385c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  uint16_t* data = result->GetChars();
386c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  for (int i = 0; i < non_ascii_start; i++) {
387c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    *data++ = *ascii_data++;
388c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
389c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Now write the remainder.
390c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  decoder->WriteUtf16(data, utf16_length);
391c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return result;
392c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
393c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
39413e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochMaybeHandle<String> Factory::NewStringFromTwoByte(const uc16* string,
39513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                  int length,
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                  PretenureFlag pretenure) {
39762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (length == 0) return empty_string();
39813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (String::IsOneByte(string, length)) {
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (length == 1) return LookupSingleCharacterStringFromCode(string[0]);
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<SeqOneByteString> result;
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ASSIGN_RETURN_ON_EXCEPTION(
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        isolate(),
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        result,
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        NewRawOneByteString(length, pretenure),
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        String);
40613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    CopyChars(result->GetChars(), string, length);
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<SeqTwoByteString> result;
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ASSIGN_RETURN_ON_EXCEPTION(
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        isolate(),
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        result,
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        NewRawTwoByteString(length, pretenure),
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        String);
41513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    CopyChars(result->GetChars(), string, length);
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}
4199fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
42013e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochMaybeHandle<String> Factory::NewStringFromTwoByte(Vector<const uc16> string,
42113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                                  PretenureFlag pretenure) {
42213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return NewStringFromTwoByte(string.start(), string.length(), pretenure);
42313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
42413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
42513e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochMaybeHandle<String> Factory::NewStringFromTwoByte(
42613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    const ZoneVector<uc16>* string, PretenureFlag pretenure) {
42713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return NewStringFromTwoByte(string->data(), static_cast<int>(string->size()),
42813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                              pretenure);
42913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::NewInternalizedStringFromUtf8(Vector<const char> str,
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                      int chars,
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                      uint32_t hash_field) {
43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
43544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateInternalizedStringFromUtf8(
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          str, chars, hash_field),
43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      String);
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMUST_USE_RESULT Handle<String> Factory::NewOneByteInternalizedString(
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Vector<const uint8_t> str,
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      uint32_t hash_field) {
44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateOneByteInternalizedString(str, hash_field),
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      String);
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMUST_USE_RESULT Handle<String> Factory::NewOneByteInternalizedSubString(
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<SeqOneByteString> string, int offset, int length,
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint32_t hash_field) {
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(), isolate()->heap()->AllocateOneByteInternalizedString(
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     Vector<const uint8_t>(string->GetChars() + offset, length),
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     hash_field),
45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      String);
460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMUST_USE_RESULT Handle<String> Factory::NewTwoByteInternalizedString(
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Vector<const uc16> str,
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      uint32_t hash_field) {
46644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
46744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateTwoByteInternalizedString(str, hash_field),
46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      String);
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::NewInternalizedStringImpl(
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> string, int chars, uint32_t hash_field) {
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(),
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateInternalizedStringImpl(
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          *string, chars, hash_field),
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      String);
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
48262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace {
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
48462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Map> GetInternalizedStringMap(Factory* f, Handle<String> string) {
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (string->map()->instance_type()) {
48662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case STRING_TYPE:
48762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return f->internalized_string_map();
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case ONE_BYTE_STRING_TYPE:
48962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return f->one_byte_internalized_string_map();
49062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case EXTERNAL_STRING_TYPE:
49162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return f->external_internalized_string_map();
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case EXTERNAL_ONE_BYTE_STRING_TYPE:
49362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return f->external_one_byte_internalized_string_map();
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE:
49562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return f->external_internalized_string_with_one_byte_data_map();
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case SHORT_EXTERNAL_STRING_TYPE:
49762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return f->short_external_internalized_string_map();
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE:
49962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return f->short_external_one_byte_internalized_string_map();
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE:
50162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return f->short_external_internalized_string_with_one_byte_data_map();
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default: return MaybeHandle<Map>();  // No match found.
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
50662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}  // namespace
50762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
50862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Map> Factory::InternalizedStringMapForString(
50962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<String> string) {
51062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // If the string is in new space it cannot be used as internalized.
51162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (isolate()->heap()->InNewSpace(*string)) return MaybeHandle<Map>();
51262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
51362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return GetInternalizedStringMap(this, string);
51462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
51562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
51662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <class StringClass>
51762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<StringClass> Factory::InternalizeExternalString(Handle<String> string) {
51862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<StringClass> cast_string = Handle<StringClass>::cast(string);
51962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Map> map = GetInternalizedStringMap(this, string).ToHandleChecked();
52062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<StringClass> external_string = New<StringClass>(map, OLD_SPACE);
52162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  external_string->set_length(cast_string->length());
52262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  external_string->set_hash_field(cast_string->hash_field());
52362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  external_string->set_resource(nullptr);
52462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  isolate()->heap()->RegisterExternalString(*external_string);
52562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return external_string;
52662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
52762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
52862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate Handle<ExternalOneByteString>
52962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Factory::InternalizeExternalString<ExternalOneByteString>(Handle<String>);
53062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate Handle<ExternalTwoByteString>
53162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Factory::InternalizeExternalString<ExternalTwoByteString>(Handle<String>);
532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<SeqOneByteString> Factory::NewRawOneByteString(
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int length, PretenureFlag pretenure) {
535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length > String::kMaxLength || length < 0) {
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), SeqOneByteString);
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
53862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(length > 0);  // Use Factory::empty_string() instead.
53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
54044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateRawOneByteString(length, pretenure),
542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SeqOneByteString);
543ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
544ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
545ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<SeqTwoByteString> Factory::NewRawTwoByteString(
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int length, PretenureFlag pretenure) {
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length > String::kMaxLength || length < 0) {
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), SeqTwoByteString);
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
55162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(length > 0);  // Use Factory::empty_string() instead.
55244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
55344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
55444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateRawTwoByteString(length, pretenure),
5553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      SeqTwoByteString);
556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::LookupSingleCharacterStringFromCode(uint32_t code) {
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (code <= String::kMaxOneByteCharCodeU) {
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DisallowHeapAllocation no_allocation;
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Object* value = single_character_string_cache()->get(code);
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (value != *undefined_value()) {
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return handle(String::cast(value), isolate());
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint8_t buffer[1];
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer[0] = static_cast<uint8_t>(code);
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> result =
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        InternalizeOneByteString(Vector<const uint8_t>(buffer, 1));
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    single_character_string_cache()->set(code, *result);
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(code <= String::kMaxUtf16CodeUnitU);
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<SeqTwoByteString> result = NewRawTwoByteString(1).ToHandleChecked();
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result->SeqTwoByteStringSet(0, static_cast<uint16_t>(code));
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Returns true for a character in a range.  Both limits are inclusive.
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline bool Between(uint32_t character, uint32_t from, uint32_t to) {
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This makes uses of the the unsigned wraparound.
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return character - from <= to - from;
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline Handle<String> MakeOrFindTwoCharacterString(Isolate* isolate,
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                          uint16_t c1,
592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                          uint16_t c2) {
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Numeric strings have a different hash algorithm not known by
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // LookupTwoCharsStringIfExists, so we skip this step for such strings.
595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!Between(c1, '0', '9') || !Between(c2, '0', '9')) {
596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<String> result;
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (StringTable::LookupTwoCharsStringIfExists(isolate, c1, c2).
598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ToHandle(&result)) {
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Now we know the length is 2, we might as well make use of that fact
604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // when building the new string.
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (static_cast<unsigned>(c1 | c2) <= String::kMaxOneByteCharCodeU) {
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // We can do this.
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(base::bits::IsPowerOfTwo32(String::kMaxOneByteCharCodeU +
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      1));  // because of this.
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<SeqOneByteString> str =
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        isolate->factory()->NewRawOneByteString(2).ToHandleChecked();
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint8_t* dest = str->GetChars();
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    dest[0] = static_cast<uint8_t>(c1);
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    dest[1] = static_cast<uint8_t>(c2);
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return str;
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<SeqTwoByteString> str =
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        isolate->factory()->NewRawTwoByteString(2).ToHandleChecked();
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uc16* dest = str->GetChars();
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    dest[0] = c1;
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    dest[1] = c2;
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return str;
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename SinkChar, typename StringType>
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> ConcatStringContent(Handle<StringType> result,
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   Handle<String> first,
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   Handle<String> second) {
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DisallowHeapAllocation pointer_stays_valid;
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SinkChar* sink = result->GetChars();
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  String::WriteToFlat(*first, sink, 0, first->length());
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  String::WriteToFlat(*second, sink + first->length(), 0, second->length());
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<String> Factory::NewConsString(Handle<String> left,
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           Handle<String> right) {
64062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (left->IsThinString()) {
64162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    left = handle(Handle<ThinString>::cast(left)->actual(), isolate());
64262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
64362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (right->IsThinString()) {
64462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    right = handle(Handle<ThinString>::cast(right)->actual(), isolate());
64562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int left_length = left->length();
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (left_length == 0) return right;
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int right_length = right->length();
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (right_length == 0) return left;
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int length = left_length + right_length;
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length == 2) {
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint16_t c1 = left->Get(0);
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint16_t c2 = right->Get(0);
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MakeOrFindTwoCharacterString(isolate(), c1, c2);
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure that an out of memory exception is thrown if the length
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // of the new cons string is too large.
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length > String::kMaxLength || length < 0) {
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), String);
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool left_is_one_byte = left->IsOneByteRepresentation();
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool right_is_one_byte = right->IsOneByteRepresentation();
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_one_byte = left_is_one_byte && right_is_one_byte;
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_one_byte_data_in_two_byte_string = false;
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!is_one_byte) {
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // At least one of the strings uses two-byte representation so we
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // can't use the fast case code for short one-byte strings below, but
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // we can try to save memory if all chars actually fit in one-byte.
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    is_one_byte_data_in_two_byte_string =
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        left->HasOnlyOneByteChars() && right->HasOnlyOneByteChars();
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (is_one_byte_data_in_two_byte_string) {
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->counters()->string_add_runtime_ext_to_one_byte()->Increment();
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If the resulting string is small make a flat string.
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length < ConsString::kMinLength) {
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Note that neither of the two inputs can be a slice because:
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    STATIC_ASSERT(ConsString::kMinLength <= SlicedString::kMinLength);
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(left->IsFlat());
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(right->IsFlat());
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    STATIC_ASSERT(ConsString::kMinLength <= String::kMaxLength);
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (is_one_byte) {
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<SeqOneByteString> result =
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          NewRawOneByteString(length).ToHandleChecked();
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DisallowHeapAllocation no_gc;
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      uint8_t* dest = result->GetChars();
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Copy left part.
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      const uint8_t* src =
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          left->IsExternalString()
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              ? Handle<ExternalOneByteString>::cast(left)->GetChars()
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              : Handle<SeqOneByteString>::cast(left)->GetChars();
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (int i = 0; i < left_length; i++) *dest++ = src[i];
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Copy right part.
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      src = right->IsExternalString()
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                ? Handle<ExternalOneByteString>::cast(right)->GetChars()
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                : Handle<SeqOneByteString>::cast(right)->GetChars();
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (int i = 0; i < right_length; i++) *dest++ = src[i];
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (is_one_byte_data_in_two_byte_string)
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? ConcatStringContent<uint8_t>(
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            NewRawOneByteString(length).ToHandleChecked(), left, right)
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : ConcatStringContent<uc16>(
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            NewRawTwoByteString(length).ToHandleChecked(), left, right);
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<ConsString> result =
715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      (is_one_byte || is_one_byte_data_in_two_byte_string)
716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          ? New<ConsString>(cons_one_byte_string_map(), NEW_SPACE)
717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          : New<ConsString>(cons_string_map(), NEW_SPACE);
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DisallowHeapAllocation no_gc;
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc);
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result->set_hash_field(String::kEmptyHashField);
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result->set_length(length);
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result->set_first(*left, mode);
725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result->set_second(*right, mode);
726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
729f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<String> Factory::NewSurrogatePairString(uint16_t lead, uint16_t trail) {
730f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_GE(lead, 0xD800);
731f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_LE(lead, 0xDBFF);
732f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_GE(trail, 0xDC00);
733f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_LE(trail, 0xDFFF);
734f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
735f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<SeqTwoByteString> str =
736f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      isolate()->factory()->NewRawTwoByteString(2).ToHandleChecked();
737f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  uc16* dest = str->GetChars();
738f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  dest[0] = lead;
739f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  dest[1] = trail;
740f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return str;
741f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7433fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<String> Factory::NewProperSubString(Handle<String> str,
7443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                           int begin,
7453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                           int end) {
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if VERIFY_HEAP
747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_verify_heap) str->StringVerify();
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(begin > 0 || end < str->length());
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  str = String::Flatten(str);
752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int length = end - begin;
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length <= 0) return empty_string();
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length == 1) {
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return LookupSingleCharacterStringFromCode(str->Get(begin));
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length == 2) {
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Optimization for 2-byte strings often used as keys in a decompression
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // dictionary.  Check whether we already have the string in the string
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // table to prevent creation of many unnecessary strings.
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint16_t c1 = str->Get(begin);
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint16_t c2 = str->Get(begin + 1);
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MakeOrFindTwoCharacterString(isolate(), c1, c2);
765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!FLAG_string_slices || length < SlicedString::kMinLength) {
768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (str->IsOneByteRepresentation()) {
769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<SeqOneByteString> result =
770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          NewRawOneByteString(length).ToHandleChecked();
771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      uint8_t* dest = result->GetChars();
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DisallowHeapAllocation no_gc;
773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      String::WriteToFlat(*str, dest, begin, end);
774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<SeqTwoByteString> result =
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          NewRawTwoByteString(length).ToHandleChecked();
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      uc16* dest = result->GetChars();
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DisallowHeapAllocation no_gc;
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      String::WriteToFlat(*str, dest, begin, end);
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int offset = begin;
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (str->IsSlicedString()) {
788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<SlicedString> slice = Handle<SlicedString>::cast(str);
789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    str = Handle<String>(slice->parent(), isolate());
790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    offset += slice->offset();
791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
79262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (str->IsThinString()) {
79362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<ThinString> thin = Handle<ThinString>::cast(str);
79462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    str = handle(thin->actual(), isolate());
79562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(str->IsSeqString() || str->IsExternalString());
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> map = str->IsOneByteRepresentation()
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ? sliced_one_byte_string_map()
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        : sliced_string_map();
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<SlicedString> slice = New<SlicedString>(map, NEW_SPACE);
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  slice->set_hash_field(String::kEmptyHashField);
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  slice->set_length(length);
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  slice->set_parent(*str);
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  slice->set_offset(offset);
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return slice;
8083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
8093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
8103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<String> Factory::NewExternalStringFromOneByte(
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const ExternalOneByteString::Resource* resource) {
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  size_t length = resource->length();
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length > static_cast<size_t>(String::kMaxLength)) {
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), String);
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
81762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (length == 0) return empty_string();
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> map;
820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (resource->IsCompressible()) {
821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // TODO(hajimehoshi): Rename this to 'uncached_external_one_byte_string_map'
822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = short_external_one_byte_string_map();
823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = external_one_byte_string_map();
825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<ExternalOneByteString> external_string =
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      New<ExternalOneByteString>(map, NEW_SPACE);
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_string->set_length(static_cast<int>(length));
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_string->set_hash_field(String::kEmptyHashField);
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_string->set_resource(resource);
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return external_string;
833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<String> Factory::NewExternalStringFromTwoByte(
8373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    const ExternalTwoByteString::Resource* resource) {
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  size_t length = resource->length();
839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (length > static_cast<size_t>(String::kMaxLength)) {
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), String);
841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
84262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (length == 0) return empty_string();
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // For small strings we check whether the resource contains only
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // one byte characters.  If yes, we use a different string map.
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const size_t kOneByteCheckLengthLimit = 32;
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_one_byte = length <= kOneByteCheckLengthLimit &&
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      String::IsOneByte(resource->data(), static_cast<int>(length));
849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> map;
850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (resource->IsCompressible()) {
851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // TODO(hajimehoshi): Rename these to 'uncached_external_string_...'.
852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = is_one_byte ? short_external_string_with_one_byte_data_map()
853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      : short_external_string_map();
854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = is_one_byte ? external_string_with_one_byte_data_map()
856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      : external_string_map();
857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<ExternalTwoByteString> external_string =
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      New<ExternalTwoByteString>(map, NEW_SPACE);
860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_string->set_length(static_cast<int>(length));
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_string->set_hash_field(String::kEmptyHashField);
862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external_string->set_resource(resource);
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return external_string;
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
86713e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochHandle<ExternalOneByteString> Factory::NewNativeSourceString(
86813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    const ExternalOneByteString::Resource* resource) {
86913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  size_t length = resource->length();
87013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK_LE(length, static_cast<size_t>(String::kMaxLength));
87113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
87213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<Map> map = native_source_string_map();
87313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<ExternalOneByteString> external_string =
87413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      New<ExternalOneByteString>(map, OLD_SPACE);
87513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  external_string->set_length(static_cast<int>(length));
87613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  external_string->set_hash_field(String::kEmptyHashField);
87713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  external_string->set_resource(resource);
87813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
87913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return external_string;
88013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
88113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
882f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<JSStringIterator> Factory::NewJSStringIterator(Handle<String> string) {
883f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<Map> map(isolate()->native_context()->string_iterator_map(),
884f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  isolate());
885f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<String> flat_string = String::Flatten(string);
886f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<JSStringIterator> iterator =
887f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Handle<JSStringIterator>::cast(NewJSObjectFromMap(map));
888f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  iterator->set_string(*flat_string);
889f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  iterator->set_index(0);
890f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
891f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return iterator;
892f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Symbol> Factory::NewSymbol() {
89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
89644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateSymbol(),
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Symbol);
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Symbol> Factory::NewPrivateSymbol() {
903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Symbol> symbol = NewSymbol();
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  symbol->set_is_private(true);
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return symbol;
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Context> Factory::NewNativeContext() {
910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<FixedArray> array =
911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      NewFixedArray(Context::NATIVE_CONTEXT_SLOTS, TENURED);
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_map_no_write_barrier(*native_context_map());
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> context = Handle<Context>::cast(array);
914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set_native_context(*context);
915c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  context->set_errors_thrown(Smi::kZero);
916c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  context->set_math_random_index(Smi::kZero);
917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<WeakCell> weak_cell = NewWeakCell(context);
918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set_self_weak_cell(*weak_cell);
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(context->IsNativeContext());
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return context;
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<Context> Factory::NewScriptContext(Handle<JSFunction> function,
925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          Handle<ScopeInfo> scope_info) {
926f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK_EQ(scope_info->scope_type(), SCRIPT_SCOPE);
927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> array =
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NewFixedArray(scope_info->ContextLength(), TENURED);
929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  array->set_map_no_write_barrier(*script_context_map());
930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> context = Handle<Context>::cast(array);
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_closure(*function);
932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_previous(function->context());
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_extension(*scope_info);
934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set_native_context(function->native_context());
935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(context->IsScriptContext());
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return context;
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<ScriptContextTable> Factory::NewScriptContextTable() {
941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<FixedArray> array = NewFixedArray(1);
942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  array->set_map_no_write_barrier(*script_context_table_map());
943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<ScriptContextTable> context_table =
944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Handle<ScriptContextTable>::cast(array);
945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  context_table->set_used(0);
946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return context_table;
947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
949f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<Context> Factory::NewModuleContext(Handle<Module> module,
950f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                          Handle<JSFunction> function,
951f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                          Handle<ScopeInfo> scope_info) {
952f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK_EQ(scope_info->scope_type(), MODULE_SCOPE);
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> array =
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NewFixedArray(scope_info->ContextLength(), TENURED);
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_map_no_write_barrier(*module_context_map());
956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> context = Handle<Context>::cast(array);
957f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  context->set_closure(*function);
958f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  context->set_previous(function->context());
959f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  context->set_extension(*module);
960f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  context->set_native_context(function->native_context());
961f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK(context->IsModuleContext());
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return context;
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Context> Factory::NewFunctionContext(int length,
96662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                            Handle<JSFunction> function,
96762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                            ScopeType scope_type) {
96862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(function->shared()->scope_info()->scope_type() == scope_type);
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(length >= Context::MIN_CONTEXT_SLOTS);
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> array = NewFixedArray(length);
97162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Map> map;
97262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (scope_type) {
97362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case EVAL_SCOPE:
97462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      map = eval_context_map();
97562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
97662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case FUNCTION_SCOPE:
97762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      map = function_context_map();
97862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
97962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    default:
98062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      UNREACHABLE();
98162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
98262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  array->set_map_no_write_barrier(*map);
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> context = Handle<Context>::cast(array);
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_closure(*function);
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_previous(function->context());
986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set_extension(*the_hole_value());
987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set_native_context(function->native_context());
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return context;
989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9913fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<Context> Factory::NewCatchContext(Handle<JSFunction> function,
9923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                         Handle<Context> previous,
993f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                         Handle<ScopeInfo> scope_info,
9943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                         Handle<String> name,
9953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                         Handle<Object> thrown_object) {
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS == Context::THROWN_OBJECT_INDEX);
997f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<ContextExtension> extension = NewContextExtension(scope_info, name);
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> array = NewFixedArray(Context::MIN_CONTEXT_SLOTS + 1);
999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_map_no_write_barrier(*catch_context_map());
1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> context = Handle<Context>::cast(array);
1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_closure(*function);
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_previous(*previous);
1003f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  context->set_extension(*extension);
1004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set_native_context(previous->native_context());
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set(Context::THROWN_OBJECT_INDEX, *thrown_object);
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return context;
10073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
10083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochHandle<Context> Factory::NewDebugEvaluateContext(Handle<Context> previous,
1010f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                                 Handle<ScopeInfo> scope_info,
10113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                 Handle<JSReceiver> extension,
10123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                 Handle<Context> wrapped,
10133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                 Handle<StringSet> whitelist) {
10143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  STATIC_ASSERT(Context::WHITE_LIST_INDEX == Context::MIN_CONTEXT_SLOTS + 1);
1015f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK(scope_info->IsDebugEvaluateScope());
1016f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<ContextExtension> context_extension = NewContextExtension(
1017f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      scope_info, extension.is_null() ? Handle<Object>::cast(undefined_value())
1018f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                      : Handle<Object>::cast(extension));
10193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<FixedArray> array = NewFixedArray(Context::MIN_CONTEXT_SLOTS + 2);
10203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  array->set_map_no_write_barrier(*debug_evaluate_context_map());
10213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Context> c = Handle<Context>::cast(array);
10223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  c->set_closure(wrapped.is_null() ? previous->closure() : wrapped->closure());
10233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  c->set_previous(*previous);
10243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  c->set_native_context(previous->native_context());
1025f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  c->set_extension(*context_extension);
10263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!wrapped.is_null()) c->set(Context::WRAPPED_CONTEXT_INDEX, *wrapped);
10273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!whitelist.is_null()) c->set(Context::WHITE_LIST_INDEX, *whitelist);
10283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return c;
10293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
10303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10313fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<Context> Factory::NewWithContext(Handle<JSFunction> function,
10323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                        Handle<Context> previous,
1033f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                        Handle<ScopeInfo> scope_info,
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Handle<JSReceiver> extension) {
1035f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<ContextExtension> context_extension =
1036f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      NewContextExtension(scope_info, extension);
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> array = NewFixedArray(Context::MIN_CONTEXT_SLOTS);
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_map_no_write_barrier(*with_context_map());
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> context = Handle<Context>::cast(array);
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_closure(*function);
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_previous(*previous);
1042f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  context->set_extension(*context_extension);
1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set_native_context(previous->native_context());
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return context;
1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Context> Factory::NewBlockContext(Handle<JSFunction> function,
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         Handle<Context> previous,
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         Handle<ScopeInfo> scope_info) {
1051f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK_EQ(scope_info->scope_type(), BLOCK_SCOPE);
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<FixedArray> array = NewFixedArray(scope_info->ContextLength());
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_map_no_write_barrier(*block_context_map());
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> context = Handle<Context>::cast(array);
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_closure(*function);
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_previous(*previous);
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context->set_extension(*scope_info);
1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context->set_native_context(previous->native_context());
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return context;
106069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
106169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Struct> Factory::NewStruct(InstanceType type) {
106344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
106444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
106544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateStruct(type),
106644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Struct);
1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<AliasedArgumentsEntry> Factory::NewAliasedArgumentsEntry(
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int aliased_context_slot) {
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<AliasedArgumentsEntry> entry = Handle<AliasedArgumentsEntry>::cast(
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NewStruct(ALIASED_ARGUMENTS_ENTRY_TYPE));
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  entry->set_aliased_context_slot(aliased_context_slot);
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return entry;
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1078109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<AccessorInfo> Factory::NewAccessorInfo() {
1079109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Handle<AccessorInfo> info =
1080109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      Handle<AccessorInfo>::cast(NewStruct(ACCESSOR_INFO_TYPE));
1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  info->set_flag(0);  // Must clear the flag, it was initialized as undefined.
10823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  info->set_is_sloppy(true);
1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return info;
1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Script> Factory::NewScript(Handle<String> source) {
1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Create and initialize script object.
1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Heap* heap = isolate()->heap();
1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Script> script = Handle<Script>::cast(NewStruct(SCRIPT_TYPE));
1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  script->set_source(*source);
109244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  script->set_name(heap->undefined_value());
1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  script->set_id(isolate()->heap()->NextScriptId());
1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  script->set_line_offset(0);
1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  script->set_column_offset(0);
109644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  script->set_context_data(heap->undefined_value());
1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  script->set_type(Script::TYPE_NORMAL);
1098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  script->set_wrapper(heap->undefined_value());
109944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  script->set_line_ends(heap->undefined_value());
110044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  script->set_eval_from_shared(heap->undefined_value());
1101bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  script->set_eval_from_position(0);
110262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  script->set_shared_function_infos(*empty_fixed_array(), SKIP_WRITE_BARRIER);
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  script->set_flags(0);
1104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  heap->set_script_list(*WeakFixedArray::Add(script_list(), script));
1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return script;
1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<Foreign> Factory::NewForeign(Address addr, PretenureFlag pretenure) {
111144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
1112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     isolate()->heap()->AllocateForeign(addr, pretenure),
1113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     Foreign);
1114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<Foreign> Factory::NewForeign(const AccessorDescriptor* desc) {
1118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return NewForeign((Address) desc, TENURED);
1119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<ByteArray> Factory::NewByteArray(int length, PretenureFlag pretenure) {
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= length);
112444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
112544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
112644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateByteArray(length, pretenure),
112744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      ByteArray);
1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<BytecodeArray> Factory::NewBytecodeArray(
1132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int length, const byte* raw_bytecodes, int frame_size, int parameter_count,
1133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<FixedArray> constant_pool) {
1134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(0 <= length);
1135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateBytecodeArray(
1136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    length, raw_bytecodes, frame_size,
1137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    parameter_count, *constant_pool),
1138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     BytecodeArray);
1139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<FixedTypedArrayBase> Factory::NewFixedTypedArrayWithExternalPointer(
1143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int length, ExternalArrayType array_type, void* external_pointer,
1144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PretenureFlag pretenure) {
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= length && length <= Smi::kMaxValue);
114644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
1147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate(), isolate()->heap()->AllocateFixedTypedArrayWithExternalPointer(
1148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     length, array_type, external_pointer, pretenure),
1149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FixedTypedArrayBase);
11503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedTypedArrayBase> Factory::NewFixedTypedArray(
1154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int length, ExternalArrayType array_type, bool initialize,
1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PretenureFlag pretenure) {
1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= length && length <= Smi::kMaxValue);
1157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateFixedTypedArray(
1158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    length, array_type, initialize, pretenure),
1159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     FixedTypedArrayBase);
1160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Cell> Factory::NewCell(Handle<Object> value) {
1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AllowDeferredHandleDereference convert_to_cell;
116444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
116544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateCell(*value),
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cell);
1168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
117062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Cell> Factory::NewNoClosuresCell(Handle<Object> value) {
117162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Cell> cell = NewCell(value);
117262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  cell->set_map_no_write_barrier(*no_closures_cell_map());
117362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return cell;
117462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
117562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
117662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Cell> Factory::NewOneClosureCell(Handle<Object> value) {
117762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Cell> cell = NewCell(value);
117862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  cell->set_map_no_write_barrier(*one_closure_cell_map());
117962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return cell;
118062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
118162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
118262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Cell> Factory::NewManyClosuresCell(Handle<Object> value) {
118362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Cell> cell = NewCell(value);
118462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  cell->set_map_no_write_barrier(*many_closures_cell_map());
118562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return cell;
118662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<PropertyCell> Factory::NewPropertyCell() {
118944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
119044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocatePropertyCell(),
1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      PropertyCell);
1193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<WeakCell> Factory::NewWeakCell(Handle<HeapObject> value) {
1197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // It is safe to dereference the value because we are embedding it
1198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // in cell and not inspecting its fields.
1199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  AllowDeferredHandleDereference convert_to_cell;
1200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateWeakCell(*value),
1201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                     WeakCell);
1202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<TransitionArray> Factory::NewTransitionArray(int capacity) {
1206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CALL_HEAP_FUNCTION(isolate(),
1207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     isolate()->heap()->AllocateTransitionArray(capacity),
1208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     TransitionArray);
1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<AllocationSite> Factory::NewAllocationSite() {
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> map = allocation_site_map();
1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<AllocationSite> site = New<AllocationSite>(map, OLD_SPACE);
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  site->Initialize();
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Link the site
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  site->set_weak_next(isolate()->heap()->allocation_sites_list());
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  isolate()->heap()->set_allocation_sites_list(*site);
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return site;
1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Map> Factory::NewMap(InstanceType type,
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            int instance_size,
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            ElementsKind elements_kind) {
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(
1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(),
1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateMap(type, instance_size, elements_kind),
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Map);
1231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12338defd9ff6930b4e24729971a61cf7469daf119beSteve Block
1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::CopyJSObject(Handle<JSObject> object) {
1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     isolate()->heap()->CopyJSObject(*object, NULL),
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     JSObject);
1238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::CopyJSObjectWithAllocationSite(
1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSObject> object,
1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AllocationSite> site) {
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     isolate()->heap()->CopyJSObject(
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         *object,
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         site.is_null() ? NULL : *site),
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     JSObject);
12491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
12501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
12511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArray> Factory::CopyFixedArrayWithMap(Handle<FixedArray> array,
1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                  Handle<Map> map) {
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     isolate()->heap()->CopyFixedArrayWithMap(*array, *map),
1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     FixedArray);
1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<FixedArray> Factory::CopyFixedArrayAndGrow(Handle<FixedArray> array,
1261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                  int grow_by,
1262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                  PretenureFlag pretenure) {
1263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->CopyFixedArrayAndGrow(
1264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    *array, grow_by, pretenure),
1265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     FixedArray);
1266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1268109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<FixedArray> Factory::CopyFixedArrayUpTo(Handle<FixedArray> array,
1269109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                               int new_len,
1270109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                               PretenureFlag pretenure) {
1271109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->CopyFixedArrayUpTo(
1272109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                    *array, new_len, pretenure),
1273109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                     FixedArray);
1274109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
1275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArray> Factory::CopyFixedArray(Handle<FixedArray> array) {
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     isolate()->heap()->CopyFixedArray(*array),
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     FixedArray);
12803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArray> Factory::CopyAndTenureFixedCOWArray(
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<FixedArray> array) {
1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(isolate()->heap()->InNewSpace(*array));
1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     isolate()->heap()->CopyAndTenureFixedCOWArray(*array),
1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     FixedArray);
1289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedDoubleArray> Factory::CopyFixedDoubleArray(
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<FixedDoubleArray> array) {
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     isolate()->heap()->CopyFixedDoubleArray(*array),
1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     FixedDoubleArray);
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
129844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
12998f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch
1300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewNumber(double value,
1301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                  PretenureFlag pretenure) {
1302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Materialize as a SMI if possible
1303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  int32_t int_value;
1304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (DoubleToSmiInteger(value, &int_value)) {
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return handle(Smi::FromInt(int_value), isolate());
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Materialize the value in the heap.
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NewHeapNumber(value, IMMUTABLE, pretenure);
1310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> Factory::NewNumberFromInt(int32_t value,
13143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                         PretenureFlag pretenure) {
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (Smi::IsValid(value)) return handle(Smi::FromInt(value), isolate());
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Bypass NewNumber to avoid various redundant checks.
1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NewHeapNumber(FastI2D(value), IMMUTABLE, pretenure);
1318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> Factory::NewNumberFromUint(uint32_t value,
1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          PretenureFlag pretenure) {
1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t int32v = static_cast<int32_t>(value);
1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (int32v >= 0 && Smi::IsValid(int32v)) {
1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return handle(Smi::FromInt(int32v), isolate());
1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NewHeapNumber(FastUI2D(value), IMMUTABLE, pretenure);
1328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
133062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<HeapNumber> Factory::NewHeapNumber(MutableMode mode,
1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          PretenureFlag pretenure) {
133262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
133362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                     isolate()->heap()->AllocateHeapNumber(mode, pretenure),
133462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                     HeapNumber);
1335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Object> Factory::NewError(Handle<JSFunction> constructor,
1338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 MessageTemplate::Template template_index,
1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 Handle<Object> arg0, Handle<Object> arg1,
1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 Handle<Object> arg2) {
1341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate());
1342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (isolate()->bootstrapper()->IsActive()) {
1343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // During bootstrapping we cannot construct error objects.
1344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return scope.CloseAndEscape(NewStringFromAsciiChecked(
1345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        MessageTemplate::TemplateString(template_index)));
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (arg0.is_null()) arg0 = undefined_value();
1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (arg1.is_null()) arg1 = undefined_value();
1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (arg2.is_null()) arg2 = undefined_value();
1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> result;
1353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (!ErrorUtils::MakeGenericError(isolate(), constructor, template_index,
1354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                    arg0, arg1, arg2, SKIP_NONE)
1355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           .ToHandle(&result)) {
1356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // If an exception is thrown while
1357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // running the factory method, use the exception as the result.
1358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    DCHECK(isolate()->has_pending_exception());
1359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    result = handle(isolate()->pending_exception(), isolate());
1360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    isolate()->clear_pending_exception();
1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return scope.CloseAndEscape(result);
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Object> Factory::NewError(Handle<JSFunction> constructor,
1368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                 Handle<String> message) {
1369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Construct a new error object. If an exception is thrown, use the exception
1370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // as the result.
1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<Object> no_caller;
1373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MaybeHandle<Object> maybe_error =
1374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ErrorUtils::Construct(isolate(), constructor, constructor, message,
1375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                            SKIP_NONE, no_caller, false);
1376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (maybe_error.is_null()) {
1377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    DCHECK(isolate()->has_pending_exception());
1378f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    maybe_error = handle(isolate()->pending_exception(), isolate());
1379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    isolate()->clear_pending_exception();
1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return maybe_error.ToHandleChecked();
1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1385f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<Object> Factory::NewInvalidStringLengthError() {
1386f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Invalidate the "string length" protector.
1387f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (isolate()->IsStringLengthOverflowIntact()) {
1388f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    isolate()->InvalidateStringLengthOverflowProtector();
1389f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
1390f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return NewRangeError(MessageTemplate::kInvalidStringLength);
1391f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DEFINE_ERROR(NAME, name)                                              \
1394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> Factory::New##NAME(MessageTemplate::Template template_index, \
1395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    Handle<Object> arg0, Handle<Object> arg1, \
1396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    Handle<Object> arg2) {                    \
1397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return NewError(isolate()->name##_function(), template_index, arg0, arg1, \
1398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    arg2);                                                    \
1399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(Error, error)
1401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(EvalError, eval_error)
1402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(RangeError, range_error)
1403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(ReferenceError, reference_error)
1404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(SyntaxError, syntax_error)
1405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(TypeError, type_error)
1406c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochDEFINE_ERROR(WasmCompileError, wasm_compile_error)
140762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDEFINE_ERROR(WasmLinkError, wasm_link_error)
1408c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochDEFINE_ERROR(WasmRuntimeError, wasm_runtime_error)
1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DEFINE_ERROR
1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunction(Handle<Map> map,
1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Handle<SharedFunctionInfo> info,
1413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                        Handle<Object> context_or_undefined,
1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        PretenureFlag pretenure) {
1415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  AllocationSpace space = pretenure == TENURED ? OLD_SPACE : NEW_SPACE;
1416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> function = New<JSFunction>(map, space);
1417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(context_or_undefined->IsContext() ||
1418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         context_or_undefined->IsUndefined(isolate()));
1419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function->initialize_properties();
1421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function->initialize_elements();
1422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function->set_shared(*info);
1423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function->set_code(info->code());
1424f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  function->set_context(*context_or_undefined);
1425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function->set_prototype_or_initial_map(*the_hole_value());
142662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  function->set_feedback_vector_cell(*undefined_cell());
1427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function->set_next_function_link(*undefined_value(), SKIP_WRITE_BARRIER);
1428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  isolate()->heap()->InitializeJSObjectBody(*function, *map, JSFunction::kSize);
1429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return function;
1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunction(Handle<Map> map,
1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Handle<String> name,
1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        MaybeHandle<Code> code) {
1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> context(isolate()->native_context());
1437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<SharedFunctionInfo> info =
1438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      NewSharedFunctionInfo(name, code, map->is_constructor());
1439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(is_sloppy(info->language_mode()));
144013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(!map->IsUndefined(isolate()));
1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(
1442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map.is_identical_to(isolate()->sloppy_function_map()) ||
1443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map.is_identical_to(isolate()->sloppy_function_without_prototype_map()) ||
1444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map.is_identical_to(
1445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          isolate()->sloppy_function_with_readonly_prototype_map()) ||
1446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map.is_identical_to(isolate()->strict_function_map()) ||
1447bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      map.is_identical_to(isolate()->strict_function_without_prototype_map()) ||
1448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // TODO(titzer): wasm_function_map() could be undefined here. ugly.
1449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      (*map == context->get(Context::WASM_FUNCTION_MAP_INDEX)) ||
145062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      (*map == context->get(Context::NATIVE_FUNCTION_MAP_INDEX)) ||
1451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map.is_identical_to(isolate()->proxy_function_map()));
1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NewFunction(map, info, context);
1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunction(Handle<String> name) {
1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NewFunction(
1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->sloppy_function_map(), name, MaybeHandle<Code>());
1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunctionWithoutPrototype(Handle<String> name,
1463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                        Handle<Code> code,
1464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                        bool is_strict) {
1465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> map = is_strict
1466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        ? isolate()->strict_function_without_prototype_map()
1467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        : isolate()->sloppy_function_without_prototype_map();
1468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return NewFunction(map, name, code);
1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Factory::NewFunction(Handle<String> name, Handle<Code> code,
1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Handle<Object> prototype,
1474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        bool is_strict) {
147513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<Map> map = is_strict ? isolate()->strict_function_map()
147613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                              : isolate()->sloppy_function_map();
1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> result = NewFunction(map, name, code);
1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result->set_prototype_or_initial_map(*prototype);
1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSFunction> Factory::NewFunction(Handle<String> name, Handle<Code> code,
1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Handle<Object> prototype,
1485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                        InstanceType type, int instance_size,
1486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        bool is_strict) {
1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allocate the function
148813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<JSFunction> function = NewFunction(name, code, prototype, is_strict);
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ElementsKind elements_kind =
1491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      type == JS_ARRAY_TYPE ? FAST_SMI_ELEMENTS : FAST_HOLEY_SMI_ELEMENTS;
1492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Map> initial_map = NewMap(type, instance_size, elements_kind);
149313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // TODO(littledan): Why do we have this is_generator test when
149413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // NewFunctionPrototype already handles finding an appropriately
149513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // shared prototype?
1496f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (!IsResumableFunction(function->shared()->kind())) {
149713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (prototype->IsTheHole(isolate())) {
1498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      prototype = NewFunctionPrototype(function);
1499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSFunction::SetInitialMap(function, initial_map,
1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            Handle<JSReceiver>::cast(prototype));
1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return function;
1506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunction(Handle<String> name,
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Handle<Code> code,
1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        InstanceType type,
1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        int instance_size) {
1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NewFunction(name, code, the_hole_value(), type, instance_size);
1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) {
1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure to use globals from the function's context, since the function
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // can be from a different context.
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> native_context(function->context()->native_context());
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> new_map;
1522f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (IsResumableFunction(function->shared()->kind())) {
152313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // Generator and async function prototypes can share maps since they
152413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // don't have "constructor" properties.
1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new_map = handle(native_context->generator_object_prototype_map());
1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Each function prototype gets a fresh map to avoid unwanted sharing of
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // maps between prototypes of different constructors.
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> object_function(native_context->object_function());
1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(object_function->has_initial_map());
1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new_map = handle(object_function->initial_map());
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!new_map->is_prototype_map());
1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> prototype = NewJSObjectFromMap(new_map);
1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1537f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (!IsResumableFunction(function->shared()->kind())) {
1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    JSObject::AddProperty(prototype, constructor_string(), function, DONT_ENUM);
1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return prototype;
1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<SharedFunctionInfo> info,
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Context> context,
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PretenureFlag pretenure) {
1549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int map_index =
1550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Context::FunctionMapIndex(info->language_mode(), info->kind());
1551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> initial_map(Map::cast(context->native_context()->get(map_index)));
1552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return NewFunctionFromSharedFunctionInfo(initial_map, info, context,
1554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           pretenure);
1555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
155862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<SharedFunctionInfo> info, Handle<Context> context,
155962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<Cell> vector, PretenureFlag pretenure) {
156062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int map_index =
156162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Context::FunctionMapIndex(info->language_mode(), info->kind());
156262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Map> initial_map(Map::cast(context->native_context()->get(map_index)));
156362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
156462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return NewFunctionFromSharedFunctionInfo(initial_map, info, context, vector,
156562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                           pretenure);
156662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
156762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
156862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
1569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> initial_map, Handle<SharedFunctionInfo> info,
1570f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<Object> context_or_undefined, PretenureFlag pretenure) {
1571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(JS_FUNCTION_TYPE, initial_map->instance_type());
1572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> result =
1573f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      NewFunction(initial_map, info, context_or_undefined, pretenure);
1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (info->ic_age() != isolate()->heap()->global_ic_age()) {
1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    info->ResetForNewContext(isolate()->heap()->global_ic_age());
1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1579f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (context_or_undefined->IsContext()) {
1580f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Give compiler a chance to pre-initialize.
1581f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Compiler::PostInstantiation(result, pretenure);
1582f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
1583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
158762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
158862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<Map> initial_map, Handle<SharedFunctionInfo> info,
158962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<Object> context_or_undefined, Handle<Cell> vector,
159062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PretenureFlag pretenure) {
159162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(JS_FUNCTION_TYPE, initial_map->instance_type());
159262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<JSFunction> result =
159362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      NewFunction(initial_map, info, context_or_undefined, pretenure);
159462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
159562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Bump the closure count that is encoded in the vector cell's map.
159662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (vector->map() == *no_closures_cell_map()) {
159762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    vector->set_map(*one_closure_cell_map());
159862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else if (vector->map() == *one_closure_cell_map()) {
159962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    vector->set_map(*many_closures_cell_map());
160062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else {
160162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK_EQ(vector->map(), *many_closures_cell_map());
160262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
160362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
160462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  result->set_feedback_vector_cell(*vector);
160562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (info->ic_age() != isolate()->heap()->global_ic_age()) {
160662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    info->ResetForNewContext(isolate()->heap()->global_ic_age());
160762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
160862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
160962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (context_or_undefined->IsContext()) {
161062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // Give compiler a chance to pre-initialize.
161162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Compiler::PostInstantiation(result, pretenure);
161262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
161362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
161462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return result;
161562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<ScopeInfo> Factory::NewScopeInfo(int length) {
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> array = NewFixedArray(length, TENURED);
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_map_no_write_barrier(*scope_info_map());
1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<ScopeInfo> scope_info = Handle<ScopeInfo>::cast(array);
1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return scope_info;
1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1624f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<ModuleInfo> Factory::NewModuleInfo() {
1625f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<FixedArray> array = NewFixedArray(ModuleInfo::kLength, TENURED);
1626f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  array->set_map_no_write_barrier(*module_info_map());
1627f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return Handle<ModuleInfo>::cast(array);
1628f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::NewExternal(void* value) {
1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Foreign> foreign = NewForeign(static_cast<Address>(value));
1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> external = NewJSObjectFromMap(external_map());
1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  external->SetInternalField(0, *foreign);
1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return external;
16356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
16366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
16376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Code> Factory::NewCodeRaw(int object_size, bool immovable) {
1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     isolate()->heap()->AllocateCode(object_size, immovable),
1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     Code);
164269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
164369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
164469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Code> Factory::NewCode(const CodeDesc& desc,
1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                              Code::Flags flags,
164744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                              Handle<Object> self_ref,
1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              bool immovable,
1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              bool crankshafted,
1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              int prologue_offset,
1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              bool is_debug) {
1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<ByteArray> reloc_info = NewByteArray(desc.reloc_size, TENURED);
1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
165413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool has_unwinding_info = desc.unwinding_info != nullptr;
165513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK((has_unwinding_info && desc.unwinding_info_size > 0) ||
165613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch         (!has_unwinding_info && desc.unwinding_info_size == 0));
165713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Compute size.
165913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  int body_size = desc.instr_size;
166013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  int unwinding_info_size_field_size = kInt64Size;
166113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (has_unwinding_info) {
166213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    body_size = RoundUp(body_size, kInt64Size) + desc.unwinding_info_size +
166313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                unwinding_info_size_field_size;
166413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
166513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  int obj_size = Code::SizeFor(RoundUp(body_size, kObjectAlignment));
1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Code> code = NewCodeRaw(obj_size, immovable);
166813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(!isolate()->heap()->memory_allocator()->code_range()->valid() ||
1669bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         isolate()->heap()->memory_allocator()->code_range()->contains(
1670bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch             code->address()) ||
1671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         obj_size <= isolate()->heap()->code_space()->AreaSize());
1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The code object has not been fully initialized yet.  We rely on the
1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // fact that no allocation will happen from this point on.
1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DisallowHeapAllocation no_gc;
1676c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  code->set_gc_metadata(Smi::kZero);
1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->set_ic_age(isolate()->heap()->global_ic_age());
1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->set_instruction_size(desc.instr_size);
1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->set_relocation_info(*reloc_info);
1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->set_flags(flags);
168113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  code->set_has_unwinding_info(has_unwinding_info);
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->set_raw_kind_specific_flags1(0);
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->set_raw_kind_specific_flags2(0);
1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->set_is_crankshafted(crankshafted);
1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->set_deoptimization_data(*empty_fixed_array(), SKIP_WRITE_BARRIER);
1686c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  code->set_raw_type_feedback_info(Smi::kZero);
1687f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  code->set_next_code_link(*undefined_value(), SKIP_WRITE_BARRIER);
1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->set_handler_table(*empty_fixed_array(), SKIP_WRITE_BARRIER);
1689f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  code->set_source_position_table(*empty_byte_array(), SKIP_WRITE_BARRIER);
1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->set_prologue_offset(prologue_offset);
1691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  code->set_constant_pool_offset(desc.instr_size - desc.constant_pool_size);
1692f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  code->set_builtin_index(-1);
1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (code->kind() == Code::OPTIMIZED_FUNCTION) {
1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    code->set_marked_for_deoptimization(false);
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (is_debug) {
1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(code->kind() == Code::FUNCTION);
1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    code->set_has_debug_break_slots(true);
1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allow self references to created code object by patching the handle to
1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // point to the newly allocated Code object.
1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!self_ref.is_null()) *(self_ref.location()) = *code;
1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Migrate generated code.
1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The generated code can contain Object** values (typically from handles)
1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // that are dereferenced during the copy to point directly to the actual heap
1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // objects. These pointers can include references to the code object itself,
1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // through the self_reference parameter.
1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code->CopyFrom(desc);
1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP
1715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_verify_heap) code->ObjectVerify();
1716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return code;
1718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Code> Factory::CopyCode(Handle<Code> code) {
172244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
172344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->CopyCode(*code),
172444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     Code);
1725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1728109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<BytecodeArray> Factory::CopyBytecodeArray(
1729109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<BytecodeArray> bytecode_array) {
1730109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  CALL_HEAP_FUNCTION(isolate(),
1731109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                     isolate()->heap()->CopyBytecodeArray(*bytecode_array),
1732109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                     BytecodeArray);
1733109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
17346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::NewJSObject(Handle<JSFunction> constructor,
1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      PretenureFlag pretenure) {
1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSFunction::EnsureHasInitialMap(constructor);
1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(
1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(),
1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateJSObject(*constructor, pretenure), JSObject);
1741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
174362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<JSObject> Factory::NewJSObjectWithNullProto(PretenureFlag pretenure) {
174462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<JSObject> result =
174562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      NewJSObject(isolate()->object_function(), pretenure);
17463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Map> new_map =
17473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Map::Copy(Handle<Map>(result->map()), "ObjectWithNullProto");
17483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Map::SetPrototype(new_map, null_value());
17493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  JSObject::MigrateToMap(result, new_map);
17503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return result;
17513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSGlobalObject> Factory::NewJSGlobalObject(
1754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSFunction> constructor) {
1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(constructor->has_initial_map());
1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> map(constructor->initial_map());
1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(map->is_dictionary_map());
1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure no field properties are described in the initial map.
1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This guarantees us that normalizing the properties does not
1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // require us to change property values to PropertyCells.
1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(map->NextFreePropertyIndex() == 0);
1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure we don't have a ton of pre-allocated slots in the
1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // global objects. They will be unused once we normalize the object.
1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(map->unused_property_fields() == 0);
1767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(map->GetInObjectProperties() == 0);
1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Initial size of the backing store to avoid resize of the storage during
1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // bootstrapping. The size differs between the JS global object ad the
1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // builtins object.
1772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int initial_size = 64;
1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allocate a dictionary object for backing storage.
1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int at_least_space_for = map->NumberOfOwnDescriptors() * 2 + initial_size;
1776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<GlobalDictionary> dictionary =
1777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      GlobalDictionary::New(isolate(), at_least_space_for);
1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The global object might be created from an object template with accessors.
1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Fill these accessors into the dictionary.
1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<DescriptorArray> descs(map->instance_descriptors());
1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < map->NumberOfOwnDescriptors(); i++) {
1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyDetails details = descs->GetDetails(i);
1784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Only accessors are expected.
178562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK_EQ(kAccessor, details.kind());
178662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PropertyDetails d(kAccessor, details.attributes(), i + 1,
1787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      PropertyCellType::kMutable);
1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Name> name(descs->GetKey(i));
1789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<PropertyCell> cell = NewPropertyCell();
179062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    cell->set_value(descs->GetValue(i));
1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // |dictionary| already contains enough space for all properties.
1792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    USE(GlobalDictionary::Add(dictionary, name, cell, d));
1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allocate the global object and initialize it with the backing store.
1796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSGlobalObject> global = New<JSGlobalObject>(map, OLD_SPACE);
1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  isolate()->heap()->InitializeJSObjectFromMap(*global, *dictionary, *map);
1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Create a new map for the global object.
1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> new_map = Map::CopyDropDescriptors(map);
1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  new_map->set_dictionary_map(true);
1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Set up the global object as a normalized object.
1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global->set_map(*new_map);
1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global->set_properties(*dictionary);
1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure result is a global object with properties in dictionary.
1808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(global->IsJSGlobalObject() && !global->HasFastProperties());
1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return global;
1810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::NewJSObjectFromMap(
1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Map> map,
1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PretenureFlag pretenure,
1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<AllocationSite> allocation_site) {
1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CALL_HEAP_FUNCTION(
1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate(),
1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateJSObjectFromMap(
1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          *map,
1821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          pretenure,
1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          allocation_site.is_null() ? NULL : *allocation_site),
1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSObject);
1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSArray> Factory::NewJSArray(ElementsKind elements_kind,
1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    PretenureFlag pretenure) {
18293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Map* map = isolate()->get_initial_js_array_map(elements_kind);
1830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (map == nullptr) {
1831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Context* native_context = isolate()->context()->native_context();
1832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSFunction* array_function = native_context->array_function();
1833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = array_function->initial_map();
1834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Handle<JSArray>::cast(NewJSObjectFromMap(handle(map), pretenure));
1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
18373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSArray> Factory::NewJSArray(ElementsKind elements_kind, int length,
18393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                    int capacity,
1840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    ArrayStorageAllocationMode mode,
1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    PretenureFlag pretenure) {
18423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<JSArray> array = NewJSArray(elements_kind, pretenure);
1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NewJSArrayStorage(array, length, capacity, mode);
1844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return array;
1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSArray> Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements,
1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                ElementsKind elements_kind,
18493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                int length,
1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                PretenureFlag pretenure) {
1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(length <= elements->length());
18523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<JSArray> array = NewJSArray(elements_kind, pretenure);
1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_elements(*elements);
1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_length(Smi::FromInt(length));
1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObject::ValidateElements(array);
1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return array;
1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Factory::NewJSArrayStorage(Handle<JSArray> array,
1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                int length,
1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                int capacity,
1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                ArrayStorageAllocationMode mode) {
1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(capacity >= length);
1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (capacity == 0) {
1868c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    array->set_length(Smi::kZero);
1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    array->set_elements(*empty_fixed_array());
1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
1871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope inner_scope(isolate());
1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArrayBase> elms;
1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind = array->GetElementsKind();
1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsFastDoubleElementsKind(elements_kind)) {
1877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) {
1878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      elms = NewFixedDoubleArray(capacity);
1879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
1880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE);
1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      elms = NewFixedDoubleArrayWithHoles(capacity);
1882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(IsFastSmiOrObjectElementsKind(elements_kind));
1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) {
1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      elms = NewUninitializedFixedArray(capacity);
1887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE);
1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      elms = NewFixedArrayWithHoles(capacity);
1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_elements(*elms);
1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_length(Smi::FromInt(length));
1895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1897c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<JSModuleNamespace> Factory::NewJSModuleNamespace() {
1898c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<Map> map = isolate()->js_module_namespace_map();
189962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<JSModuleNamespace> module_namespace(
190062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Handle<JSModuleNamespace>::cast(NewJSObjectFromMap(map)));
190162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  FieldIndex index = FieldIndex::ForDescriptor(
190262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      *map, JSModuleNamespace::kToStringTagFieldIndex);
190362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  module_namespace->FastPropertyAtPut(index,
190462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                      isolate()->heap()->Module_string());
190562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return module_namespace;
1906c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
1907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSGeneratorObject> Factory::NewJSGeneratorObject(
1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSFunction> function) {
1910f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK(IsResumableFunction(function->shared()->kind()));
1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSFunction::EnsureHasInitialMap(function);
1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> map(function->initial_map());
1913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(JS_GENERATOR_OBJECT_TYPE, map->instance_type());
191444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
191544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateJSObjectFromMap(*map),
1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSGeneratorObject);
1918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1920f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<Module> Factory::NewModule(Handle<SharedFunctionInfo> code) {
1921f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<ModuleInfo> module_info(code->scope_info()->ModuleDescriptorInfo(),
1922f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                 isolate());
1923f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<ObjectHashTable> exports =
1924c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      ObjectHashTable::New(isolate(), module_info->RegularExportCount());
1925c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<FixedArray> regular_exports =
1926c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      NewFixedArray(module_info->RegularExportCount());
1927c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<FixedArray> regular_imports =
1928c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      NewFixedArray(module_info->regular_imports()->length());
1929f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int requested_modules_length = module_info->module_requests()->length();
1930f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<FixedArray> requested_modules =
1931f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      requested_modules_length > 0 ? NewFixedArray(requested_modules_length)
1932f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                   : empty_fixed_array();
1933f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1934f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<Module> module = Handle<Module>::cast(NewStruct(MODULE_TYPE));
1935f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  module->set_code(*code);
1936f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  module->set_exports(*exports);
1937c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  module->set_regular_exports(*regular_exports);
1938c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  module->set_regular_imports(*regular_imports);
1939c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  module->set_hash(isolate()->GenerateIdentityHash(Smi::kMaxValue));
1940c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  module->set_module_namespace(isolate()->heap()->undefined_value());
1941f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  module->set_requested_modules(*requested_modules);
1942c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(!module->instantiated());
1943c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(!module->evaluated());
1944f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return module;
1945f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSArrayBuffer> Factory::NewJSArrayBuffer(SharedFlag shared,
1948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                PretenureFlag pretenure) {
1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> array_buffer_fun(
1950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      shared == SharedFlag::kShared
1951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          ? isolate()->native_context()->shared_array_buffer_fun()
1952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          : isolate()->native_context()->array_buffer_fun());
1953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateJSObject(
1954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    *array_buffer_fun, pretenure),
1955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     JSArrayBuffer);
1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSDataView> Factory::NewJSDataView() {
1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> data_view_fun(
1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->native_context()->data_view_fun());
196244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
196344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
1964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->AllocateJSObject(*data_view_fun),
1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSDataView);
1966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1968f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<JSIteratorResult> Factory::NewJSIteratorResult(Handle<Object> value,
1969f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                                      bool done) {
1970f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<Map> map(isolate()->native_context()->iterator_result_map());
1971f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Handle<JSIteratorResult> js_iter_result =
1972f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Handle<JSIteratorResult>::cast(NewJSObjectFromMap(map));
1973f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  js_iter_result->set_value(*value);
1974f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  js_iter_result->set_done(*ToBoolean(done));
1975f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return js_iter_result;
1976f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
197862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<JSAsyncFromSyncIterator> Factory::NewJSAsyncFromSyncIterator(
197962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<JSReceiver> sync_iterator) {
198062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Map> map(isolate()->native_context()->async_from_sync_iterator_map());
198162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<JSAsyncFromSyncIterator> iterator =
198262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Handle<JSAsyncFromSyncIterator>::cast(NewJSObjectFromMap(map));
198362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
198462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  iterator->set_sync_iterator(*sync_iterator);
198562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return iterator;
198662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
198762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSMap> Factory::NewJSMap() {
1989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> map(isolate()->native_context()->js_map_map());
1990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSMap> js_map = Handle<JSMap>::cast(NewJSObjectFromMap(map));
1991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSMap::Initialize(js_map, isolate());
1992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return js_map;
1993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSSet> Factory::NewJSSet() {
1997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> map(isolate()->native_context()->js_set_map());
1998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSSet> js_set = Handle<JSSet>::cast(NewJSObjectFromMap(map));
1999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSSet::Initialize(js_set, isolate());
2000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return js_set;
2001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSMapIterator> Factory::NewJSMapIterator() {
2005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Map> map(isolate()->native_context()->map_iterator_map());
2006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CALL_HEAP_FUNCTION(isolate(),
2007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                     isolate()->heap()->AllocateJSObjectFromMap(*map),
2008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                     JSMapIterator);
2009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSSetIterator> Factory::NewJSSetIterator() {
2013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Map> map(isolate()->native_context()->set_iterator_map());
2014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CALL_HEAP_FUNCTION(isolate(),
2015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                     isolate()->heap()->AllocateJSObjectFromMap(*map),
2016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                     JSSetIterator);
2017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace {
2021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierElementsKind GetExternalArrayElementsKind(ExternalArrayType type) {
2023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (type) {
2024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
2025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case kExternal##Type##Array:                          \
2026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return TYPE##_ELEMENTS;
2027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    TYPED_ARRAYS(TYPED_ARRAY_CASE)
2028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
2030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND;
2031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef TYPED_ARRAY_CASE
2032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t GetExternalArrayElementSize(ExternalArrayType type) {
2036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (type) {
2037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
2038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case kExternal##Type##Array:                          \
2039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return size;
2040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    TYPED_ARRAYS(TYPED_ARRAY_CASE)
2041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
2042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      UNREACHABLE();
2043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 0;
2044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef TYPED_ARRAY_CASE
2046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t GetFixedTypedArraysElementSize(ElementsKind kind) {
2050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (kind) {
2051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
2052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case TYPE##_ELEMENTS:                                 \
2053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return size;
2054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TYPED_ARRAYS(TYPED_ARRAY_CASE)
2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
2056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      UNREACHABLE();
2057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 0;
2058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef TYPED_ARRAY_CASE
2060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochExternalArrayType GetArrayTypeFromElementsKind(ElementsKind kind) {
2064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (kind) {
2065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
2066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case TYPE##_ELEMENTS:                                 \
2067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return kExternal##Type##Array;
2068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TYPED_ARRAYS(TYPED_ARRAY_CASE)
2069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
2070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      UNREACHABLE();
2071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return kExternalInt8Array;
2072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef TYPED_ARRAY_CASE
2074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierJSFunction* GetTypedArrayFun(ExternalArrayType type, Isolate* isolate) {
2078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Context* native_context = isolate->context()->native_context();
2079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (type) {
2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define TYPED_ARRAY_FUN(Type, type, TYPE, ctype, size)                        \
2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kExternal##Type##Array:                                              \
2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return native_context->type##_array_fun();
2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TYPED_ARRAYS(TYPED_ARRAY_FUN)
2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef TYPED_ARRAY_FUN
2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UNREACHABLE();
2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return NULL;
2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochJSFunction* GetTypedArrayFun(ElementsKind elements_kind, Isolate* isolate) {
2095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Context* native_context = isolate->context()->native_context();
2096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (elements_kind) {
2097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define TYPED_ARRAY_FUN(Type, type, TYPE, ctype, size) \
2098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case TYPE##_ELEMENTS:                                \
2099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return native_context->type##_array_fun();
2100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TYPED_ARRAYS(TYPED_ARRAY_FUN)
2102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef TYPED_ARRAY_FUN
2103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
2105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      UNREACHABLE();
2106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return NULL;
2107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid SetupArrayBufferView(i::Isolate* isolate,
2112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                          i::Handle<i::JSArrayBufferView> obj,
2113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                          i::Handle<i::JSArrayBuffer> buffer,
2114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          size_t byte_offset, size_t byte_length,
2115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          PretenureFlag pretenure = NOT_TENURED) {
2116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(byte_offset + byte_length <=
2117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier         static_cast<size_t>(buffer->byte_length()->Number()));
2118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2119c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_EQ(obj->GetInternalFieldCount(),
2120c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            v8::ArrayBufferView::kInternalFieldCount);
2121c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) {
2122c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    obj->SetInternalField(i, Smi::kZero);
2123c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
2124c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  obj->set_buffer(*buffer);
2126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  i::Handle<i::Object> byte_offset_object =
2128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->factory()->NewNumberFromSize(byte_offset, pretenure);
2129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  obj->set_byte_offset(*byte_offset_object);
2130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  i::Handle<i::Object> byte_length_object =
2132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->factory()->NewNumberFromSize(byte_length, pretenure);
2133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  obj->set_byte_length(*byte_length_object);
2134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}  // namespace
2138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSTypedArray> Factory::NewJSTypedArray(ExternalArrayType type,
2141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              PretenureFlag pretenure) {
2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> typed_array_fun_handle(GetTypedArrayFun(type, isolate()));
2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateJSObject(
2145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    *typed_array_fun_handle, pretenure),
2146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     JSTypedArray);
2147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSTypedArray> Factory::NewJSTypedArray(ElementsKind elements_kind,
2151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              PretenureFlag pretenure) {
2152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> typed_array_fun_handle(
2153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      GetTypedArrayFun(elements_kind, isolate()));
2154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateJSObject(
2156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    *typed_array_fun_handle, pretenure),
2157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     JSTypedArray);
21583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSTypedArray> Factory::NewJSTypedArray(ExternalArrayType type,
2162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                              Handle<JSArrayBuffer> buffer,
2163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              size_t byte_offset, size_t length,
2164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              PretenureFlag pretenure) {
2165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSTypedArray> obj = NewJSTypedArray(type, pretenure);
2166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  size_t element_size = GetExternalArrayElementSize(type);
2168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ElementsKind elements_kind = GetExternalArrayElementsKind(type);
2169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CHECK(byte_offset % element_size == 0);
2171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CHECK(length <= (std::numeric_limits<size_t>::max() / element_size));
2173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CHECK(length <= static_cast<size_t>(Smi::kMaxValue));
2174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  size_t byte_length = length * element_size;
2175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SetupArrayBufferView(isolate(), obj, buffer, byte_offset, byte_length,
2176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       pretenure);
2177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> length_object = NewNumberFromSize(length, pretenure);
2179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  obj->set_length(*length_object);
2180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<FixedTypedArrayBase> elements = NewFixedTypedArrayWithExternalPointer(
2182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      static_cast<int>(length), type,
2183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<uint8_t*>(buffer->backing_store()) + byte_offset, pretenure);
2184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Map> map = JSObject::GetElementsTransitionMap(obj, elements_kind);
2185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  JSObject::SetMapAndElements(obj, map, elements);
2186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return obj;
2187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSTypedArray> Factory::NewJSTypedArray(ElementsKind elements_kind,
2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              size_t number_of_elements,
2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              PretenureFlag pretenure) {
2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSTypedArray> obj = NewJSTypedArray(elements_kind, pretenure);
2194c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_EQ(obj->GetInternalFieldCount(),
2195c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            v8::ArrayBufferView::kInternalFieldCount);
2196c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) {
2197c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    obj->SetInternalField(i, Smi::kZero);
2198c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t element_size = GetFixedTypedArraysElementSize(elements_kind);
2201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ExternalArrayType array_type = GetArrayTypeFromElementsKind(elements_kind);
2202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(number_of_elements <=
2204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        (std::numeric_limits<size_t>::max() / element_size));
2205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(number_of_elements <= static_cast<size_t>(Smi::kMaxValue));
2206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  size_t byte_length = number_of_elements * element_size;
2207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2208c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  obj->set_byte_offset(Smi::kZero);
2209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  i::Handle<i::Object> byte_length_object =
2210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      NewNumberFromSize(byte_length, pretenure);
2211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  obj->set_byte_length(*byte_length_object);
2212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> length_object =
2213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      NewNumberFromSize(number_of_elements, pretenure);
2214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  obj->set_length(*length_object);
2215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSArrayBuffer> buffer =
2217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      NewJSArrayBuffer(SharedFlag::kNotShared, pretenure);
2218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSArrayBuffer::Setup(buffer, isolate(), true, NULL, byte_length,
2219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       SharedFlag::kNotShared);
2220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  obj->set_buffer(*buffer);
2221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<FixedTypedArrayBase> elements = NewFixedTypedArray(
2222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<int>(number_of_elements), array_type, true, pretenure);
2223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  obj->set_elements(*elements);
2224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return obj;
2225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSDataView> Factory::NewJSDataView(Handle<JSArrayBuffer> buffer,
2229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                          size_t byte_offset,
2230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                          size_t byte_length) {
2231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSDataView> obj = NewJSDataView();
2232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SetupArrayBufferView(isolate(), obj, buffer, byte_offset, byte_length);
2233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return obj;
2234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybeHandle<JSBoundFunction> Factory::NewJSBoundFunction(
2238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSReceiver> target_function, Handle<Object> bound_this,
2239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Vector<Handle<Object>> bound_args) {
2240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(target_function->IsCallable());
2241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  STATIC_ASSERT(Code::kMaxArguments <= FixedArray::kMaxLength);
2242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (bound_args.length() >= Code::kMaxArguments) {
2243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    THROW_NEW_ERROR(isolate(),
2244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    NewRangeError(MessageTemplate::kTooManyArguments),
2245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    JSBoundFunction);
2246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Determine the prototype of the {target_function}.
2249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> prototype;
2250109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  ASSIGN_RETURN_ON_EXCEPTION(
2251109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      isolate(), prototype,
2252109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      JSReceiver::GetPrototype(isolate(), target_function), JSBoundFunction);
2253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Create the [[BoundArguments]] for the result.
2255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<FixedArray> bound_arguments;
2256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (bound_args.length() == 0) {
2257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    bound_arguments = empty_fixed_array();
2258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
2259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    bound_arguments = NewFixedArray(bound_args.length());
2260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int i = 0; i < bound_args.length(); ++i) {
2261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      bound_arguments->set(i, *bound_args[i]);
2262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Setup the map for the JSBoundFunction instance.
2266bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Handle<Map> map = target_function->IsConstructor()
2267bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        ? isolate()->bound_function_with_constructor_map()
2268bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                        : isolate()->bound_function_without_constructor_map();
2269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (map->prototype() != *prototype) {
2270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = Map::TransitionToPrototype(map, prototype, REGULAR_PROTOTYPE);
2271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(target_function->IsConstructor(), map->is_constructor());
2273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Setup the JSBoundFunction instance.
2275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSBoundFunction> result =
2276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSBoundFunction>::cast(NewJSObjectFromMap(map));
2277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  result->set_bound_target_function(*target_function);
2278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  result->set_bound_this(*bound_this);
2279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  result->set_bound_arguments(*bound_arguments);
2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
22813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ES6 section 9.5.15 ProxyCreate (target, handler)
2285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSProxy> Factory::NewJSProxy(Handle<JSReceiver> target,
2286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    Handle<JSReceiver> handler) {
2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allocate the proxy object.
2288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> map;
2289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (target->IsCallable()) {
2290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (target->IsConstructor()) {
2291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map = Handle<Map>(isolate()->proxy_constructor_map());
2292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
2293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      map = Handle<Map>(isolate()->proxy_callable_map());
2294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
2296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = Handle<Map>(isolate()->proxy_map());
2297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
229813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(map->prototype()->IsNull(isolate()));
2299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSProxy> result = New<JSProxy>(map, NEW_SPACE);
2300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  result->initialize_properties();
2301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  result->set_target(*target);
2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result->set_handler(*handler);
2303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  result->set_hash(*undefined_value(), SKIP_WRITE_BARRIER);
2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
23053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2307c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<JSGlobalProxy> Factory::NewUninitializedJSGlobalProxy(int size) {
2308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Create an empty shell of a JSGlobalProxy that needs to be reinitialized
2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // via ReinitializeJSGlobalProxy later.
2310c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<Map> map = NewMap(JS_GLOBAL_PROXY_TYPE, size);
2311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Maintain invariant expected from any JSGlobalProxy.
2312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  map->set_is_access_check_needed(true);
2313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CALL_HEAP_FUNCTION(
2314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate(), isolate()->heap()->AllocateJSObjectFromMap(*map, NOT_TENURED),
2315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSGlobalProxy);
2316592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
2317592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2318592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Factory::ReinitializeJSGlobalProxy(Handle<JSGlobalProxy> object,
2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Handle<JSFunction> constructor) {
2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(constructor->has_initial_map());
2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> map(constructor->initial_map(), isolate());
2323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> old_map(object->map(), isolate());
2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The proxy's hash should be retained across reinitialization.
2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> hash(object->hash(), isolate());
2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (old_map->is_prototype_map()) {
2329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map = Map::Copy(map, "CopyAsPrototypeForJSGlobalProxy");
2330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    map->set_is_prototype_map(true);
2331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2332c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  JSObject::NotifyMapChange(old_map, map, isolate());
233362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  old_map->NotifyLeafMapLayoutChange();
2334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Check that the already allocated object has the same size and type as
2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // objects allocated using the constructor.
2337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(map->instance_size() == old_map->instance_size());
2338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(map->instance_type() == old_map->instance_type());
2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Allocate the backing storage for the properties.
2341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<FixedArray> properties = empty_fixed_array();
2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // In order to keep heap in consistent state there must be no allocations
2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // before object re-initialization is finished.
2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DisallowHeapAllocation no_allocation;
2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Reset the map for the object.
2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  object->synchronized_set_map(*map);
2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap* heap = isolate()->heap();
2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Reinitialize the object from the constructor map.
2352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  heap->InitializeJSObjectFromMap(*object, *properties, *map);
2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Restore the saved hash.
2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  object->set_hash(*hash);
2356257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2357257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
23586ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(
235962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<String> name, FunctionKind kind, Handle<Code> code,
236062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<ScopeInfo> scope_info) {
2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsValidFunctionKind(kind));
2362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<SharedFunctionInfo> shared = NewSharedFunctionInfo(
2363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      name, code, IsConstructable(kind, scope_info->language_mode()));
23643bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  shared->set_scope_info(*scope_info);
2365f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  shared->set_outer_scope_info(*the_hole_value());
2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  shared->set_kind(kind);
2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsGeneratorFunction(kind)) {
2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    shared->set_instance_class_name(isolate()->heap()->Generator_string());
2369bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
23706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return shared;
23716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
23726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
237362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<SharedFunctionInfo> Factory::NewSharedFunctionInfoForLiteral(
237462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    FunctionLiteral* literal, Handle<Script> script) {
237562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Code> code = isolate()->builtins()->CompileLazy();
237662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<ScopeInfo> scope_info(ScopeInfo::Empty(isolate()));
237762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<SharedFunctionInfo> result =
237862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      NewSharedFunctionInfo(literal->name(), literal->kind(), code, scope_info);
237962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  SharedFunctionInfo::InitFromFunctionLiteral(result, literal);
238062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  SharedFunctionInfo::SetScript(result, script);
238162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return result;
238262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
23836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
23841e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockHandle<JSMessageObject> Factory::NewJSMessageObject(
2385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    MessageTemplate::Template message, Handle<Object> argument,
2386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int start_position, int end_position, Handle<Object> script,
23871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    Handle<Object> stack_frames) {
2388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> map = message_object_map();
2389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSMessageObject> message_obj = New<JSMessageObject>(map, NEW_SPACE);
2390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  message_obj->set_properties(*empty_fixed_array(), SKIP_WRITE_BARRIER);
2391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  message_obj->initialize_elements();
2392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  message_obj->set_elements(*empty_fixed_array(), SKIP_WRITE_BARRIER);
2393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  message_obj->set_type(message);
2394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  message_obj->set_argument(*argument);
2395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  message_obj->set_start_position(start_position);
2396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  message_obj->set_end_position(end_position);
2397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  message_obj->set_script(*script);
2398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  message_obj->set_stack_frames(*stack_frames);
239962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  message_obj->set_error_level(v8::Isolate::kMessageError);
2400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return message_obj;
2401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(
2405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<String> name, MaybeHandle<Code> maybe_code, bool is_constructor) {
2406109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Function names are assumed to be flat elsewhere. Must flatten before
2407109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // allocating SharedFunctionInfo to avoid GC seeing the uninitialized SFI.
2408109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  name = String::Flatten(name, TENURED);
2409109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> map = shared_function_info_map();
2411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<SharedFunctionInfo> share = New<SharedFunctionInfo>(map, OLD_SPACE);
2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Set pointer fields.
2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_name(*name);
241562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  share->set_function_data(*undefined_value(), SKIP_WRITE_BARRIER);
2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Code> code;
2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!maybe_code.ToHandle(&code)) {
2418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    code = isolate()->builtins()->Illegal();
2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_code(*code);
2421c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  share->set_optimized_code_map(*empty_fixed_array());
2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_scope_info(ScopeInfo::Empty(isolate()));
2423f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  share->set_outer_scope_info(*the_hole_value());
2424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Code> construct_stub =
2425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      is_constructor ? isolate()->builtins()->JSConstructStubGeneric()
2426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     : isolate()->builtins()->ConstructedNonConstructable();
2427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  share->SetConstructStub(*construct_stub);
2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_instance_class_name(*Object_string());
2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_script(*undefined_value(), SKIP_WRITE_BARRIER);
243062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  share->set_debug_info(Smi::kZero, SKIP_WRITE_BARRIER);
24313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  share->set_function_identifier(*undefined_value(), SKIP_WRITE_BARRIER);
2432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  StaticFeedbackVectorSpec empty_spec;
243362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<FeedbackMetadata> feedback_metadata =
243462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      FeedbackMetadata::New(isolate(), &empty_spec);
243513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  share->set_feedback_metadata(*feedback_metadata, SKIP_WRITE_BARRIER);
243662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  share->set_function_literal_id(FunctionLiteral::kIdTypeInvalid);
2437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS
2438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  share->set_unique_id(isolate()->GetNextUniqueSharedFunctionInfoId());
2439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
2440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_profiler_ticks(0);
2441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_ast_node_count(0);
2442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_counters(0);
2443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Set integer fields (smi or int, depending on the architecture).
2445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_length(0);
2446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  share->set_internal_formal_parameter_count(0);
2447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_expected_nof_properties(0);
2448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_start_position_and_type(0);
2449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_end_position(0);
2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_function_token_position(0);
2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // All compiler hints default to false or 0.
2452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_compiler_hints(0);
2453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  share->set_opt_count_and_bailout_reason(0);
2454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Link into the list.
2456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Object> new_noscript_list =
2457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      WeakFixedArray::Add(noscript_shared_function_infos(), share);
2458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  isolate()->heap()->set_noscript_shared_function_infos(*new_noscript_list);
2459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return share;
2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline int NumberCacheHash(Handle<FixedArray> cache,
2465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                  Handle<Object> number) {
2466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int mask = (cache->length() >> 1) - 1;
2467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (number->IsSmi()) {
2468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Handle<Smi>::cast(number)->value() & mask;
2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2470f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    int64_t bits = bit_cast<int64_t>(number->Number());
2471f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    return (static_cast<int>(bits) ^ static_cast<int>(bits >> 32)) & mask;
2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
24736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
24746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
24756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Factory::GetNumberStringCache(Handle<Object> number) {
2477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DisallowHeapAllocation no_gc;
2478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int hash = NumberCacheHash(number_string_cache(), number);
2479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* key = number_string_cache()->get(hash * 2);
2480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (key == *number || (key->IsHeapNumber() && number->IsHeapNumber() &&
2481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         key->Number() == number->Number())) {
2482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Handle<String>(
2483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        String::cast(number_string_cache()->get(hash * 2 + 1)), isolate());
2484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return undefined_value();
2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Factory::SetNumberStringCache(Handle<Object> number,
2490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   Handle<String> string) {
2491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int hash = NumberCacheHash(number_string_cache(), number);
2492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (number_string_cache()->get(hash * 2) != *undefined_value()) {
2493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int full_size = isolate()->heap()->FullSizeNumberStringCacheLength();
2494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (number_string_cache()->length() != full_size) {
2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<FixedArray> new_cache = NewFixedArray(full_size, TENURED);
2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate()->heap()->set_number_string_cache(*new_cache);
2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  number_string_cache()->set(hash * 2, *number);
2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  number_string_cache()->set(hash * 2 + 1, *string);
25026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
25036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
25046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::NumberToString(Handle<Object> number,
2506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                       bool check_number_string_cache) {
2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  isolate()->counters()->number_to_string_runtime()->Increment();
2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (check_number_string_cache) {
2509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Object> cached = GetNumberStringCache(number);
251013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (!cached->IsUndefined(isolate())) return Handle<String>::cast(cached);
2511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2512e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  char arr[100];
2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Vector<char> buffer(arr, arraysize(arr));
2515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* str;
2516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (number->IsSmi()) {
2517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int num = Handle<Smi>::cast(number)->value();
2518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    str = IntToCString(num, buffer);
2519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    double num = Handle<HeapNumber>::cast(number)->value();
2521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    str = DoubleToCString(num, buffer);
2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2523e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We tenure the allocated string since it is referenced from the
2525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // number-string cache which lives in the old space.
2526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> js_string = NewStringFromAsciiChecked(str, TENURED);
2527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetNumberStringCache(number, js_string);
2528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return js_string;
2529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<DebugInfo> Factory::NewDebugInfo(Handle<SharedFunctionInfo> shared) {
253362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(!shared->HasDebugInfo());
2534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Allocate initial fixed array for active break points before allocating the
2535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // debug info object to avoid allocation while setting up the debug info
2536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // object.
2537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<FixedArray> break_points(
2538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NewFixedArray(DebugInfo::kEstimatedNofBreakPointsInFunction));
2539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2540f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Make a copy of the bytecode array if available.
2541f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<Object> maybe_debug_bytecode_array = undefined_value();
2542f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (shared->HasBytecodeArray()) {
2543f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<BytecodeArray> original(shared->bytecode_array());
2544f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    maybe_debug_bytecode_array = CopyBytecodeArray(original);
2545f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
2546f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Create and set up the debug info object. Debug info contains function, a
2548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // copy of the original code, the executing code and initial fixed array for
2549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // active break points.
2550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<DebugInfo> debug_info =
255144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Handle<DebugInfo>::cast(NewStruct(DEBUG_INFO_TYPE));
2552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debug_info->set_shared(*shared);
255362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  debug_info->set_debugger_hints(shared->debugger_hints());
2554f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  debug_info->set_debug_bytecode_array(*maybe_debug_bytecode_array);
2555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debug_info->set_break_points(*break_points);
2556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Link debug info to function.
2558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  shared->set_debug_info(*debug_info);
2559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return debug_info;
2561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
256362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<BreakPointInfo> Factory::NewBreakPointInfo(int source_position) {
256462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<BreakPointInfo> new_break_point_info =
256562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Handle<BreakPointInfo>::cast(NewStruct(BREAK_POINT_INFO_TYPE));
256662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  new_break_point_info->set_source_position(source_position);
256762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  new_break_point_info->set_break_point_objects(*undefined_value());
256862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new_break_point_info;
256962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
2570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::NewArgumentsObject(Handle<JSFunction> callee,
2572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                             int length) {
2573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool strict_mode_callee = is_strict(callee->shared()->language_mode()) ||
2574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            !callee->shared()->has_simple_parameters();
2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> map = strict_mode_callee ? isolate()->strict_arguments_map()
2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                       : isolate()->sloppy_arguments_map();
2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AllocationSiteUsageContext context(isolate(), Handle<AllocationSite>(),
2578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     false);
2579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!isolate()->has_pending_exception());
2580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> result = NewJSObjectFromMap(map);
2581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Smi> value(Smi::FromInt(length), isolate());
2582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object::SetProperty(result, length_string(), value, STRICT).Assert();
2583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!strict_mode_callee) {
2584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Object::SetProperty(result, callee_string(), callee, STRICT).Assert();
2585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
2587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSWeakMap> Factory::NewJSWeakMap() {
2591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // TODO(adamk): Currently the map is only created three times per
2592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // isolate. If it's created more often, the map should be moved into the
2593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // strong root list.
2594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Map> map = NewMap(JS_WEAK_MAP_TYPE, JSWeakMap::kSize);
2595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Handle<JSWeakMap>::cast(NewJSObjectFromMap(map));
2596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Map> Factory::ObjectLiteralMapFromCache(Handle<Context> context,
2600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                               int number_of_properties,
2601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                               bool* is_result_from_cache) {
2602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const int kMapCacheSize = 128;
2603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // We do not cache maps for too many properties or when running builtin code.
2605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (number_of_properties > kMapCacheSize ||
2606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate()->bootstrapper()->IsActive()) {
2607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    *is_result_from_cache = false;
2608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> map = Map::Create(isolate(), number_of_properties);
2609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return map;
2610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  *is_result_from_cache = true;
2612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (number_of_properties == 0) {
2613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // Reuse the initial map of the Object function if the literal has no
26143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // predeclared properties.
26153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return handle(context->object_function()->initial_map(), isolate());
2616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int cache_index = number_of_properties - 1;
26193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Object> maybe_cache(context->map_cache(), isolate());
262013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (maybe_cache->IsUndefined(isolate())) {
2621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Allocate the new map cache for the native context.
2622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    maybe_cache = NewFixedArray(kMapCacheSize, TENURED);
26233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    context->set_map_cache(*maybe_cache);
2624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
2625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Check to see whether there is a matching element in the cache.
2626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<FixedArray> cache = Handle<FixedArray>::cast(maybe_cache);
2627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Object* result = cache->get(cache_index);
2628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (result->IsWeakCell()) {
2629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      WeakCell* cell = WeakCell::cast(result);
2630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (!cell->cleared()) {
2631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return handle(Map::cast(cell->value()), isolate());
2632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
2633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
2634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Create a new map and add it to the cache.
2636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<FixedArray> cache = Handle<FixedArray>::cast(maybe_cache);
2637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Map> map = Map::Create(isolate(), number_of_properties);
2638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<WeakCell> cell = NewWeakCell(map);
2639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  cache->set(cache_index, *cell);
2640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return map;
2641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Factory::SetRegExpAtomData(Handle<JSRegExp> regexp,
2645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                JSRegExp::Type type,
2646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                Handle<String> source,
2647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                JSRegExp::Flags flags,
2648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                Handle<Object> data) {
2649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<FixedArray> store = NewFixedArray(JSRegExp::kAtomDataSize);
2650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kTagIndex, Smi::FromInt(type));
2652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kSourceIndex, *source);
2653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  store->set(JSRegExp::kFlagsIndex, Smi::FromInt(flags));
2654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kAtomPatternIndex, *data);
2655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  regexp->set_data(*store);
2656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Factory::SetRegExpIrregexpData(Handle<JSRegExp> regexp,
2660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                    JSRegExp::Type type,
2661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                    Handle<String> source,
2662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                    JSRegExp::Flags flags,
2663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                    int capture_count) {
2664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<FixedArray> store = NewFixedArray(JSRegExp::kIrregexpDataSize);
2665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Smi* uninitialized = Smi::FromInt(JSRegExp::kUninitializedValue);
2666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kTagIndex, Smi::FromInt(type));
2667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kSourceIndex, *source);
2668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  store->set(JSRegExp::kFlagsIndex, Smi::FromInt(flags));
2669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  store->set(JSRegExp::kIrregexpLatin1CodeIndex, uninitialized);
2670257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  store->set(JSRegExp::kIrregexpUC16CodeIndex, uninitialized);
2671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  store->set(JSRegExp::kIrregexpLatin1CodeSavedIndex, uninitialized);
2672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  store->set(JSRegExp::kIrregexpUC16CodeSavedIndex, uninitialized);
2673c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  store->set(JSRegExp::kIrregexpMaxRegisterCountIndex, Smi::kZero);
2674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kIrregexpCaptureCountIndex,
2675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             Smi::FromInt(capture_count));
267613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  store->set(JSRegExp::kIrregexpCaptureNameMapIndex, uninitialized);
2677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  regexp->set_data(*store);
2678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2680c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<RegExpMatchInfo> Factory::NewRegExpMatchInfo() {
2681c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Initially, the last match info consists of all fixed fields plus space for
2682c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // the match itself (i.e., 2 capture indices).
2683c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  static const int kInitialSize = RegExpMatchInfo::kFirstCaptureIndex +
2684c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                  RegExpMatchInfo::kInitialCaptureIndices;
2685c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2686c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<FixedArray> elems = NewFixedArray(kInitialSize);
2687c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<RegExpMatchInfo> result = Handle<RegExpMatchInfo>::cast(elems);
2688c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2689c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->SetNumberOfCaptureRegisters(RegExpMatchInfo::kInitialCaptureIndices);
2690c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->SetLastSubject(*empty_string());
2691c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->SetLastInput(*undefined_value());
2692c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->SetCapture(0, 0);
2693c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  result->SetCapture(1, 0);
2694c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2695c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return result;
2696c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Object> Factory::GlobalConstantFor(Handle<Name> name) {
2699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (Name::Equals(name, undefined_string())) return undefined_value();
2700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (Name::Equals(name, nan_string())) return nan_value();
2701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (Name::Equals(name, infinity_string())) return infinity_value();
27023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Handle<Object>::null();
27033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
27043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
27053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
27063ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> Factory::ToBoolean(bool value) {
2707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return value ? true_value() : false_value();
27083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
27093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2710f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<String> Factory::ToPrimitiveHintString(ToPrimitiveHint hint) {
2711f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  switch (hint) {
2712f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case ToPrimitiveHint::kDefault:
2713f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return default_string();
2714f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case ToPrimitiveHint::kNumber:
2715f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return number_string();
2716f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case ToPrimitiveHint::kString:
2717f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return string_string();
2718f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
2719f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  UNREACHABLE();
2720f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return Handle<String>::null();
2721f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2722f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2723f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<Map> Factory::CreateSloppyFunctionMap(FunctionMode function_mode) {
2724f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<Map> map = NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
2725f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  SetFunctionInstanceDescriptor(map, function_mode);
2726f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  map->set_is_constructor(IsFunctionModeWithPrototype(function_mode));
2727f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  map->set_is_callable();
2728f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return map;
2729f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2730f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2731f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Factory::SetFunctionInstanceDescriptor(Handle<Map> map,
2732f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                            FunctionMode function_mode) {
2733f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4;
2734f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Map::EnsureDescriptorSlack(map, size);
2735f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2736f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  PropertyAttributes ro_attribs =
2737f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
2738f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  PropertyAttributes roc_attribs =
2739f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
2740f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2741f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  STATIC_ASSERT(JSFunction::kLengthDescriptorIndex == 0);
2742f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<AccessorInfo> length =
2743f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Accessors::FunctionLengthInfo(isolate(), roc_attribs);
2744f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  {  // Add length.
274562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Descriptor d = Descriptor::AccessorConstant(
274662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        Handle<Name>(Name::cast(length->name())), length, roc_attribs);
2747f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    map->AppendDescriptor(&d);
2748f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
2749f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2750f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  STATIC_ASSERT(JSFunction::kNameDescriptorIndex == 1);
2751f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<AccessorInfo> name =
275262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Accessors::FunctionNameInfo(isolate(), roc_attribs);
2753f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  {  // Add name.
275462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Descriptor d = Descriptor::AccessorConstant(
275562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        Handle<Name>(Name::cast(name->name())), name, roc_attribs);
2756f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    map->AppendDescriptor(&d);
2757f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
2758f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<AccessorInfo> args =
2759f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Accessors::FunctionArgumentsInfo(isolate(), ro_attribs);
2760f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  {  // Add arguments.
276162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Descriptor d = Descriptor::AccessorConstant(
276262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        Handle<Name>(Name::cast(args->name())), args, ro_attribs);
2763f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    map->AppendDescriptor(&d);
2764f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
2765f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<AccessorInfo> caller =
2766f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Accessors::FunctionCallerInfo(isolate(), ro_attribs);
2767f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  {  // Add caller.
276862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Descriptor d = Descriptor::AccessorConstant(
276962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        Handle<Name>(Name::cast(caller->name())), caller, ro_attribs);
2770f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    map->AppendDescriptor(&d);
2771f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
2772f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (IsFunctionModeWithPrototype(function_mode)) {
2773f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE) {
2774f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ro_attribs = static_cast<PropertyAttributes>(ro_attribs & ~READ_ONLY);
2775f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
2776f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<AccessorInfo> prototype =
2777f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        Accessors::FunctionPrototypeInfo(isolate(), ro_attribs);
277862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Descriptor d = Descriptor::AccessorConstant(
277962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        Handle<Name>(Name::cast(prototype->name())), prototype, ro_attribs);
2780f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    map->AppendDescriptor(&d);
2781f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
2782f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2783f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2784f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<Map> Factory::CreateStrictFunctionMap(
2785f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    FunctionMode function_mode, Handle<JSFunction> empty_function) {
2786f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<Map> map = NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
2787f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  SetStrictFunctionInstanceDescriptor(map, function_mode);
2788f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  map->set_is_constructor(IsFunctionModeWithPrototype(function_mode));
2789f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  map->set_is_callable();
2790f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Map::SetPrototype(map, empty_function);
2791f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return map;
2792f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2793f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2794f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Factory::SetStrictFunctionInstanceDescriptor(Handle<Map> map,
2795f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                                  FunctionMode function_mode) {
2796f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  int size = IsFunctionModeWithPrototype(function_mode) ? 3 : 2;
2797f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Map::EnsureDescriptorSlack(map, size);
2798f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2799f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  PropertyAttributes rw_attribs =
2800f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
2801f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  PropertyAttributes ro_attribs =
2802f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
2803f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  PropertyAttributes roc_attribs =
2804f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
2805f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2806f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ||
2807f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         function_mode == FUNCTION_WITH_READONLY_PROTOTYPE ||
2808f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         function_mode == FUNCTION_WITHOUT_PROTOTYPE);
2809f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  STATIC_ASSERT(JSFunction::kLengthDescriptorIndex == 0);
2810f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  {  // Add length.
2811f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<AccessorInfo> length =
2812f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        Accessors::FunctionLengthInfo(isolate(), roc_attribs);
281362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Descriptor d = Descriptor::AccessorConstant(
281462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        handle(Name::cast(length->name())), length, roc_attribs);
2815f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    map->AppendDescriptor(&d);
2816f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
2817f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2818f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  STATIC_ASSERT(JSFunction::kNameDescriptorIndex == 1);
2819f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  {  // Add name.
2820f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<AccessorInfo> name =
2821f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        Accessors::FunctionNameInfo(isolate(), roc_attribs);
282262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Descriptor d = Descriptor::AccessorConstant(
282362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        handle(Name::cast(name->name())), name, roc_attribs);
2824f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    map->AppendDescriptor(&d);
2825f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
2826f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (IsFunctionModeWithPrototype(function_mode)) {
2827f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // Add prototype.
2828f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    PropertyAttributes attribs =
2829f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs
2830f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                                           : ro_attribs;
2831f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Handle<AccessorInfo> prototype =
2832f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        Accessors::FunctionPrototypeInfo(isolate(), attribs);
283362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Descriptor d = Descriptor::AccessorConstant(
283462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        Handle<Name>(Name::cast(prototype->name())), prototype, attribs);
2835f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    map->AppendDescriptor(&d);
2836f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
2837f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
28383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
283962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Map> Factory::CreateClassFunctionMap(Handle<JSFunction> empty_function) {
284062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Map> map = NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
284162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  SetClassFunctionInstanceDescriptor(map);
284262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  map->set_is_constructor(true);
284362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  map->set_is_callable();
284462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Map::SetPrototype(map, empty_function);
284562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map;
284662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
284762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
284862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Factory::SetClassFunctionInstanceDescriptor(Handle<Map> map) {
284962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Map::EnsureDescriptorSlack(map, 2);
285062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
285162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  PropertyAttributes rw_attribs =
285262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
285362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  PropertyAttributes roc_attribs =
285462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
285562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
285662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT(JSFunction::kLengthDescriptorIndex == 0);
285762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  {  // Add length.
285862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<AccessorInfo> length =
285962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        Accessors::FunctionLengthInfo(isolate(), roc_attribs);
286062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Descriptor d = Descriptor::AccessorConstant(
286162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        handle(Name::cast(length->name())), length, roc_attribs);
286262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    map->AppendDescriptor(&d);
286362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
286462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
286562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  {
286662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // Add prototype.
286762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<AccessorInfo> prototype =
286862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        Accessors::FunctionPrototypeInfo(isolate(), rw_attribs);
286962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Descriptor d = Descriptor::AccessorConstant(
287062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        Handle<Name>(Name::cast(prototype->name())), prototype, rw_attribs);
287162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    map->AppendDescriptor(&d);
287262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
2873c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2874c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
2876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
2877