13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h"
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "api.h"
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "debug.h"
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "execution.h"
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "factory.h"
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "macro-assembler.h"
35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "objects.h"
36756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#include "objects-visiting.h"
3769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#include "scopeinfo.h"
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<FixedArray> Factory::NewFixedArray(int size, PretenureFlag pretenure) {
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= size);
4544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
4644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
4744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateFixedArray(size, pretenure),
4844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      FixedArray);
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
526ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<FixedArray> Factory::NewFixedArrayWithHoles(int size,
536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                                   PretenureFlag pretenure) {
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= size);
5544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
5644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
5744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateFixedArrayWithHoles(size, pretenure),
5844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      FixedArray);
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<FixedDoubleArray> Factory::NewFixedDoubleArray(int size,
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                      PretenureFlag pretenure) {
643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(0 <= size);
653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  CALL_HEAP_FUNCTION(
663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      isolate(),
673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      isolate()->heap()->AllocateUninitializedFixedDoubleArray(size, pretenure),
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      FixedDoubleArray);
693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<StringDictionary> Factory::NewStringDictionary(int at_least_space_for) {
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= at_least_space_for);
7444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
7544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     StringDictionary::Allocate(at_least_space_for),
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     StringDictionary);
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
80c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochHandle<SeededNumberDictionary> Factory::NewSeededNumberDictionary(
81c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    int at_least_space_for) {
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= at_least_space_for);
8344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
84c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                     SeededNumberDictionary::Allocate(at_least_space_for),
85c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                     SeededNumberDictionary);
86c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
87c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
88c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
89c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochHandle<UnseededNumberDictionary> Factory::NewUnseededNumberDictionary(
90c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    int at_least_space_for) {
91c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  ASSERT(0 <= at_least_space_for);
92c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  CALL_HEAP_FUNCTION(isolate(),
93c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                     UnseededNumberDictionary::Allocate(at_least_space_for),
94c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                     UnseededNumberDictionary);
952b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch}
962b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch
972b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<ObjectHashSet> Factory::NewObjectHashSet(int at_least_space_for) {
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(0 <= at_least_space_for);
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     ObjectHashSet::Allocate(at_least_space_for),
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     ObjectHashSet);
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochHandle<ObjectHashTable> Factory::NewObjectHashTable(int at_least_space_for) {
10769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ASSERT(0 <= at_least_space_for);
10869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
10969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                     ObjectHashTable::Allocate(at_least_space_for),
11069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                     ObjectHashTable);
11169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
11269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
11369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<DescriptorArray> Factory::NewDescriptorArray(int number_of_descriptors) {
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= number_of_descriptors);
11644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
11744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     DescriptorArray::Allocate(number_of_descriptors),
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     DescriptorArray);
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHandle<DeoptimizationInputData> Factory::NewDeoptimizationInputData(
123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    int deopt_entry_count,
124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    PretenureFlag pretenure) {
125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(deopt_entry_count > 0);
12644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
12744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     DeoptimizationInputData::Allocate(deopt_entry_count,
128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                                       pretenure),
129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                     DeoptimizationInputData);
130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHandle<DeoptimizationOutputData> Factory::NewDeoptimizationOutputData(
134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    int deopt_entry_count,
135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    PretenureFlag pretenure) {
136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(deopt_entry_count > 0);
13744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
13844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     DeoptimizationOutputData::Allocate(deopt_entry_count,
139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                                        pretenure),
140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                     DeoptimizationOutputData);
141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<AccessorPair> Factory::NewAccessorPair() {
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     isolate()->heap()->AllocateAccessorPair(),
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     AccessorPair);
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<TypeFeedbackInfo> Factory::NewTypeFeedbackInfo() {
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     isolate()->heap()->AllocateTypeFeedbackInfo(),
1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     TypeFeedbackInfo);
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Symbols are created in the old generation (data space).
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<String> Factory::LookupSymbol(Vector<const char> string) {
16044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
16144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->LookupSymbol(string),
16244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     String);
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Symbols are created in the old generation (data space).
166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<String> Factory::LookupSymbol(Handle<String> string) {
167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  CALL_HEAP_FUNCTION(isolate(),
168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     isolate()->heap()->LookupSymbol(*string),
169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     String);
170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1729fac840a46e8b7e26894f4792ba26dde14c56b04Steve BlockHandle<String> Factory::LookupAsciiSymbol(Vector<const char> string) {
17344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
17444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->LookupAsciiSymbol(string),
17544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     String);
1769fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}
1779fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
178257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<String> Factory::LookupAsciiSymbol(Handle<SeqAsciiString> string,
180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                          int from,
181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                          int length) {
182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  CALL_HEAP_FUNCTION(isolate(),
183257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     isolate()->heap()->LookupAsciiSymbol(string,
184257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                                          from,
185257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                                          length),
186257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     String);
187257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
188257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
189257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1909fac840a46e8b7e26894f4792ba26dde14c56b04Steve BlockHandle<String> Factory::LookupTwoByteSymbol(Vector<const uc16> string) {
19144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
19244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->LookupTwoByteSymbol(string),
19344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     String);
1949fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}
1959fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<String> Factory::NewStringFromAscii(Vector<const char> string,
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                           PretenureFlag pretenure) {
19944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
20044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
20144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateStringFromAscii(string, pretenure),
20244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      String);
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<String> Factory::NewStringFromUtf8(Vector<const char> string,
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                          PretenureFlag pretenure) {
20744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
20844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
20944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateStringFromUtf8(string, pretenure),
21044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      String);
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<String> Factory::NewStringFromTwoByte(Vector<const uc16> string,
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                             PretenureFlag pretenure) {
21644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
21744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
21844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateStringFromTwoByte(string, pretenure),
21944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      String);
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2233fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<SeqAsciiString> Factory::NewRawAsciiString(int length,
2243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                                  PretenureFlag pretenure) {
22544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
22644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
22744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateRawAsciiString(length, pretenure),
2283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      SeqAsciiString);
229ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
230ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
231ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
2323fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<SeqTwoByteString> Factory::NewRawTwoByteString(int length,
2333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                                      PretenureFlag pretenure) {
23444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
23544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
23644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateRawTwoByteString(length, pretenure),
2373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      SeqTwoByteString);
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<String> Factory::NewConsString(Handle<String> first,
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      Handle<String> second) {
24344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
24444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->AllocateConsString(*first, *second),
24544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     String);
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
249d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockHandle<String> Factory::NewSubString(Handle<String> str,
250d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                                     int begin,
251d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                                     int end) {
25244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
25344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     str->SubString(begin, end),
25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     String);
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2583fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<String> Factory::NewProperSubString(Handle<String> str,
2593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                           int begin,
2603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                           int end) {
2613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(begin > 0 || end < str->length());
2623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  CALL_HEAP_FUNCTION(isolate(),
2633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                     isolate()->heap()->AllocateSubString(*str, begin, end),
2643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                     String);
2653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
2663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<String> Factory::NewExternalStringFromAscii(
2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    const ExternalAsciiString::Resource* resource) {
27044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
27244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateExternalStringFromAscii(resource),
27344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      String);
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<String> Factory::NewExternalStringFromTwoByte(
2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    const ExternalTwoByteString::Resource* resource) {
27944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
28044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
28144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateExternalStringFromTwoByte(resource),
28244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      String);
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Context> Factory::NewGlobalContext() {
28744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
28844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
28944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateGlobalContext(),
29044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Context);
291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Context> Factory::NewFunctionContext(int length,
2953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                            Handle<JSFunction> function) {
29644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
29744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
2983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      isolate()->heap()->AllocateFunctionContext(length, *function),
29944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Context);
300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3033fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<Context> Factory::NewCatchContext(Handle<JSFunction> function,
3043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                         Handle<Context> previous,
3053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                         Handle<String> name,
3063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                         Handle<Object> thrown_object) {
30744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
30844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
3093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      isolate()->heap()->AllocateCatchContext(*function,
3103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                              *previous,
3113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                              *name,
3123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                              *thrown_object),
3133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      Context);
3143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
3153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3173fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<Context> Factory::NewWithContext(Handle<JSFunction> function,
3183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                        Handle<Context> previous,
3193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                        Handle<JSObject> extension) {
3203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  CALL_HEAP_FUNCTION(
3213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      isolate(),
3223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      isolate()->heap()->AllocateWithContext(*function, *previous, *extension),
32344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Context);
324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochHandle<Context> Factory::NewBlockContext(
32869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    Handle<JSFunction> function,
32969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    Handle<Context> previous,
3303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Handle<ScopeInfo> scope_info) {
33169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CALL_HEAP_FUNCTION(
33269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      isolate(),
33369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      isolate()->heap()->AllocateBlockContext(*function,
33469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                              *previous,
33569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                              *scope_info),
33669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      Context);
33769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
33869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
33969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Struct> Factory::NewStruct(InstanceType type) {
34144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
34244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
34344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateStruct(type),
34444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Struct);
345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<AccessorInfo> Factory::NewAccessorInfo() {
349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<AccessorInfo> info =
350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Handle<AccessorInfo>::cast(NewStruct(ACCESSOR_INFO_TYPE));
351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  info->set_flag(0);  // Must clear the flag, it was initialized as undefined.
352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return info;
353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Script> Factory::NewScript(Handle<String> source) {
357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Generate id for this script.
358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int id;
35944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Heap* heap = isolate()->heap();
36044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (heap->last_script_id()->IsUndefined()) {
361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Script ids start from one.
362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    id = 1;
363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Increment id, wrap when positive smi is exhausted.
36544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    id = Smi::cast(heap->last_script_id())->value();
366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    id++;
367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (!Smi::IsValid(id)) {
368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      id = 0;
369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
37144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  heap->SetLastScriptId(Smi::FromInt(id));
372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Create and initialize script object.
374257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Handle<Foreign> wrapper = NewForeign(0, TENURED);
375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Script> script = Handle<Script>::cast(NewStruct(SCRIPT_TYPE));
376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  script->set_source(*source);
37744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  script->set_name(heap->undefined_value());
37844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  script->set_id(heap->last_script_id());
379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  script->set_line_offset(Smi::FromInt(0));
380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  script->set_column_offset(Smi::FromInt(0));
38144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  script->set_data(heap->undefined_value());
38244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  script->set_context_data(heap->undefined_value());
383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  script->set_type(Smi::FromInt(Script::TYPE_NORMAL));
384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  script->set_compilation_type(Smi::FromInt(Script::COMPILATION_TYPE_HOST));
3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  script->set_compilation_state(
3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      Smi::FromInt(Script::COMPILATION_STATE_INITIAL));
387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  script->set_wrapper(*wrapper);
38844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  script->set_line_ends(heap->undefined_value());
38944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  script->set_eval_from_shared(heap->undefined_value());
390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  script->set_eval_from_instructions_offset(Smi::FromInt(0));
391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return script;
393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
396257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<Foreign> Factory::NewForeign(Address addr, PretenureFlag pretenure) {
39744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     isolate()->heap()->AllocateForeign(addr, pretenure),
399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                     Foreign);
400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
403257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<Foreign> Factory::NewForeign(const AccessorDescriptor* desc) {
404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return NewForeign((Address) desc, TENURED);
405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<ByteArray> Factory::NewByteArray(int length, PretenureFlag pretenure) {
409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= length);
41044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
41144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
41244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateByteArray(length, pretenure),
41344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      ByteArray);
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockHandle<ExternalArray> Factory::NewExternalArray(int length,
4183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block                                                ExternalArrayType array_type,
4193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block                                                void* external_pointer,
4203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block                                                PretenureFlag pretenure) {
4213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT(0 <= length);
42244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
42344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
42444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateExternalArray(length,
42544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                               array_type,
42644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                               external_pointer,
42744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                               pretenure),
42844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      ExternalArray);
4293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
4303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
4313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHandle<JSGlobalPropertyCell> Factory::NewJSGlobalPropertyCell(
433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Handle<Object> value) {
43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
43544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateJSGlobalPropertyCell(*value),
43744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      JSGlobalPropertyCell);
438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Map> Factory::NewMap(InstanceType type,
4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            int instance_size,
4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            ElementsKind elements_kind) {
44444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate()->heap()->AllocateMap(type, instance_size, elements_kind),
44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Map);
448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) {
45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
45344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateFunctionPrototype(*function),
45544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      JSObject);
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Map> Factory::CopyMapDropDescriptors(Handle<Map> src) {
46044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(), src->CopyDropDescriptors(), Map);
461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Map> Factory::CopyMap(Handle<Map> src,
465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                             int extra_inobject_properties) {
466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Map> copy = CopyMapDropDescriptors(src);
467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Check that we do not overflow the instance size when adding the
468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // extra inobject properties.
469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int instance_size_delta = extra_inobject_properties * kPointerSize;
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int max_instance_size_delta =
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSObject::kMaxInstanceSize - copy->instance_size();
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (instance_size_delta > max_instance_size_delta) {
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // If the instance size overflows, we allocate as many properties
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // as we can as inobject properties.
475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    instance_size_delta = max_instance_size_delta;
476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    extra_inobject_properties = max_instance_size_delta >> kPointerSizeLog2;
477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Adjust the map with the extra inobject properties.
479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int inobject_properties =
480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      copy->inobject_properties() + extra_inobject_properties;
481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  copy->set_inobject_properties(inobject_properties);
482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  copy->set_unused_property_fields(inobject_properties);
483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  copy->set_instance_size(copy->instance_size() + instance_size_delta);
484756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy));
485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return copy;
486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4888defd9ff6930b4e24729971a61cf7469daf119beSteve Block
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Map> Factory::CopyMapDropTransitions(Handle<Map> src) {
49044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(), src->CopyDropTransitions(), Map);
491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
494589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochHandle<Map> Factory::GetElementsTransitionMap(
4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Handle<JSObject> src,
4963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ElementsKind elements_kind) {
4973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Isolate* i = isolate();
4983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION(i,
4993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     src->GetElementsTransitionMap(i, elements_kind),
50044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     Map);
5011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
5021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<FixedArray> Factory::CopyFixedArray(Handle<FixedArray> array) {
50544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(), array->Copy(), FixedArray);
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<FixedDoubleArray> Factory::CopyFixedDoubleArray(
5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Handle<FixedDoubleArray> array) {
5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION(isolate(), array->Copy(), FixedDoubleArray);
5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5156ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<JSFunction> Factory::BaseNewFunctionFromSharedFunctionInfo(
5166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Handle<SharedFunctionInfo> function_info,
517e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    Handle<Map> function_map,
518e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    PretenureFlag pretenure) {
51944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
52044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
52144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateFunction(*function_map,
52244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                          *function_info,
52344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                          isolate()->heap()->the_hole_value(),
52444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                          pretenure),
525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     JSFunction);
526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5296ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
5306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    Handle<SharedFunctionInfo> function_info,
531e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    Handle<Context> context,
532e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    PretenureFlag pretenure) {
5336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Handle<JSFunction> result = BaseNewFunctionFromSharedFunctionInfo(
53444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      function_info,
5353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      function_info->is_classic_mode()
5363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          ? isolate()->function_map()
5373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          : isolate()->strict_mode_function_map(),
53844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      pretenure);
53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
5408f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch  if (function_info->ic_age() != isolate()->heap()->global_ic_age()) {
5418f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch    function_info->ResetForNewContext(isolate()->heap()->global_ic_age());
5428f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch  }
5438f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result->set_context(*context);
5453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!function_info->bound()) {
5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int number_of_literals = function_info->num_literals();
5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Handle<FixedArray> literals = NewFixedArray(number_of_literals, pretenure);
5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (number_of_literals > 0) {
5493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      // Store the object, regexp and array functions in the literals
5503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      // array prefix.  These functions will be used when creating
5513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      // object, regexp and array literals in this function.
5523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      literals->set(JSFunction::kLiteralGlobalContextIndex,
5533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    context->global_context());
5543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result->set_literals(*literals);
556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (V8::UseCrankshaft() &&
558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      FLAG_always_opt &&
559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      result->is_compiled() &&
560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      !function_info->is_toplevel() &&
5613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      function_info->allows_lazy_compilation() &&
5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      !function_info->optimization_disabled()) {
563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result->MarkForLazyRecompilation();
564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewNumber(double value,
570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                  PretenureFlag pretenure) {
57144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
57244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
57344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->NumberFromDouble(value, pretenure), Object);
574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5773ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> Factory::NewNumberFromInt(int32_t value,
5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                         PretenureFlag pretenure) {
57944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
58044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate()->heap()->NumberFromInt32(value, pretenure), Object);
582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> Factory::NewNumberFromUint(uint32_t value,
5863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                         PretenureFlag pretenure) {
58744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
58844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
5893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate()->heap()->NumberFromUint32(value, pretenure), Object);
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<JSObject> Factory::NewNeanderObject() {
59444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
59544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
59644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateJSObjectFromMap(
59744f0eee88ff00398ff7f715fab053374d808c90dSteve Block          isolate()->heap()->neander_map()),
59844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      JSObject);
599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewTypeError(const char* type,
603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                     Vector< Handle<Object> > args) {
604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("MakeTypeError", type, args);
605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewTypeError(Handle<String> message) {
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("$TypeError", message);
610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewRangeError(const char* type,
614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      Vector< Handle<Object> > args) {
615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("MakeRangeError", type, args);
616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewRangeError(Handle<String> message) {
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("$RangeError", message);
621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewSyntaxError(const char* type, Handle<JSArray> args) {
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("MakeSyntaxError", type, args);
626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewSyntaxError(Handle<String> message) {
630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("$SyntaxError", message);
631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewReferenceError(const char* type,
635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                          Vector< Handle<Object> > args) {
636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("MakeReferenceError", type, args);
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewReferenceError(Handle<String> message) {
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("$ReferenceError", message);
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewError(const char* maker, const char* type,
646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Vector< Handle<Object> > args) {
647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  v8::HandleScope scope;  // Instantiate a closeable HandleScope for EscapeFrom.
64844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<FixedArray> array = NewFixedArray(args.length());
649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < args.length(); i++) {
650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    array->set(i, *args[i]);
651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
65244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<JSArray> object = NewJSArrayWithElements(array);
653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Object> result = NewError(maker, type, object);
654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result.EscapeFrom(&scope);
655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewEvalError(const char* type,
659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                     Vector< Handle<Object> > args) {
660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("MakeEvalError", type, args);
661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewError(const char* type,
665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                 Vector< Handle<Object> > args) {
666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("MakeError", type, args);
667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewError(const char* maker,
671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                 const char* type,
672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                 Handle<JSArray> args) {
67344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> make_str = LookupAsciiSymbol(maker);
67444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Object> fun_obj(
67544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->js_builtins_object()->GetPropertyNoExceptionThrown(*make_str));
676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If the builtins haven't been properly configured yet this error
677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // constructor may not have been defined.  Bail out.
678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!fun_obj->IsJSFunction())
67944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return undefined_value();
680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<JSFunction> fun = Handle<JSFunction>::cast(fun_obj);
68144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Object> type_obj = LookupAsciiSymbol(type);
6823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Object> argv[] = { type_obj, args };
683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Invoke the JavaScript factory method. If an exception is thrown while
685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // running the factory method, use the exception as the result.
686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool caught_exception;
687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Object> result = Execution::TryCall(fun,
6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                             isolate()->js_builtins_object(),
6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                             ARRAY_SIZE(argv),
6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                             argv,
6913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                             &caught_exception);
692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewError(Handle<String> message) {
697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NewError("$Error", message);
698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewError(const char* constructor,
702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                 Handle<String> message) {
70344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> constr = LookupAsciiSymbol(constructor);
70444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<JSFunction> fun = Handle<JSFunction>(
70544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      JSFunction::cast(isolate()->js_builtins_object()->
70644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                       GetPropertyNoExceptionThrown(*constr)));
7073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Object> argv[] = { message };
708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Invoke the JavaScript factory method. If an exception is thrown while
710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // running the factory method, use the exception as the result.
711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool caught_exception;
712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Object> result = Execution::TryCall(fun,
7133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                             isolate()->js_builtins_object(),
7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                             ARRAY_SIZE(argv),
7153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                             argv,
7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                             &caught_exception);
717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<JSFunction> Factory::NewFunction(Handle<String> name,
722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        InstanceType type,
723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        int instance_size,
724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        Handle<Code> code,
725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        bool force_initial_map) {
726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Allocate the function
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<JSFunction> function = NewFunction(name, the_hole_value());
728756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
7293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the code pointer in both the shared function info and in
730756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  // the function itself.
731756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  function->shared()->set_code(*code);
732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function->set_code(*code);
733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (force_initial_map ||
735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      type != JS_OBJECT_TYPE ||
736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      instance_size != JSObject::kHeaderSize) {
737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<Map> initial_map = NewMap(type, instance_size);
738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSObject> prototype = NewFunctionPrototype(function);
739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    initial_map->set_prototype(*prototype);
740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    function->set_initial_map(*initial_map);
741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    initial_map->set_constructor(*function);
742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(!function->has_initial_map());
744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(!function->has_prototype());
745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return function;
748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<JSFunction> Factory::NewFunctionWithPrototype(Handle<String> name,
752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                     InstanceType type,
753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                     int instance_size,
754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                     Handle<JSObject> prototype,
755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                     Handle<Code> code,
756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                     bool force_initial_map) {
757756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  // Allocate the function.
758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<JSFunction> function = NewFunction(name, prototype);
759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Set up the code pointer in both the shared function info and in
761756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  // the function itself.
762756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  function->shared()->set_code(*code);
763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  function->set_code(*code);
764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (force_initial_map ||
766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      type != JS_OBJECT_TYPE ||
767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      instance_size != JSObject::kHeaderSize) {
7683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Handle<Map> initial_map = NewMap(type,
7693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                     instance_size,
7703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                     FAST_SMI_ONLY_ELEMENTS);
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    function->set_initial_map(*initial_map);
772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    initial_map->set_constructor(*function);
773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Set function.prototype and give the prototype a constructor
776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // property that refers to the function.
777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  SetPrototypeProperty(function, prototype);
7781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // Currently safe because it is only invoked from Genesis.
7793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK_NOT_EMPTY_HANDLE(isolate(),
7803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         JSObject::SetLocalPropertyIgnoreAttributes(
7813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                             prototype, constructor_symbol(),
7823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                             function, DONT_ENUM));
783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return function;
784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7876ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<JSFunction> Factory::NewFunctionWithoutPrototype(Handle<String> name,
7886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                                        Handle<Code> code) {
78944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<JSFunction> function = NewFunctionWithoutPrototype(name,
7903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                            CLASSIC_MODE);
791756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  function->shared()->set_code(*code);
7926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  function->set_code(*code);
7936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(!function->has_initial_map());
7946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(!function->has_prototype());
7956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return function;
7966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
7976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
7986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
7993ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<ScopeInfo> Factory::NewScopeInfo(int length) {
80069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CALL_HEAP_FUNCTION(
80169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      isolate(),
8023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate()->heap()->AllocateScopeInfo(length),
8033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ScopeInfo);
80469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
80569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
80669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Code> Factory::NewCode(const CodeDesc& desc,
808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                              Code::Flags flags,
80944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                              Handle<Object> self_ref,
81044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                              bool immovable) {
81144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
81244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->CreateCode(
81344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         desc, flags, self_ref, immovable),
81444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     Code);
815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Code> Factory::CopyCode(Handle<Code> code) {
81944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
82044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->CopyCode(*code),
82144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     Code);
822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8256ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<Code> Factory::CopyCode(Handle<Code> code, Vector<byte> reloc_info) {
82644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
82744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->CopyCode(*code, reloc_info),
82844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     Code);
8296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
8306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
8316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
8325913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMUST_USE_RESULT static inline MaybeObject* DoCopyInsert(
8335913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck    DescriptorArray* array,
8345913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck    String* key,
8355913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck    Object* value,
8365913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck    PropertyAttributes attributes) {
837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CallbacksDescriptor desc(key, value, attributes);
8385913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  MaybeObject* obj = array->CopyInsert(&desc, REMOVE_TRANSITIONS);
839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return obj;
840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Allocate the new array.
844257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<DescriptorArray> Factory::CopyAppendForeignDescriptor(
845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<DescriptorArray> array,
846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<String> key,
847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<Object> value,
848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PropertyAttributes attributes) {
84944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
85044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     DoCopyInsert(*array, *key, *value, attributes),
851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     DescriptorArray);
852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<String> Factory::SymbolFromString(Handle<String> value) {
85644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
85744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->LookupSymbol(*value), String);
858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<DescriptorArray> Factory::CopyAppendCallbackDescriptors(
862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<DescriptorArray> array,
863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<Object> descriptors) {
864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  v8::NeanderArray callbacks(descriptors);
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int nof_callbacks = callbacks.length();
866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<DescriptorArray> result =
867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      NewDescriptorArray(array->number_of_descriptors() + nof_callbacks);
868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Number of descriptors added to the result so far.
870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int descriptor_count = 0;
871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Ensure that marking will not progress and change color of objects.
8733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DescriptorArray::WhitenessWitness witness(*result);
8743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Copy the descriptors from the array.
876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < array->number_of_descriptors(); i++) {
8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!array->IsNullDescriptor(i)) {
8783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DescriptorArray::CopyFrom(result, descriptor_count++, array, i, witness);
879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Number of duplicates detected.
883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int duplicates = 0;
884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Fill in new callback descriptors.  Process the callbacks from
886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // back to front so that the last callback with a given name takes
887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // precedence over previously added callbacks with that name.
888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = nof_callbacks - 1; i >= 0; i--) {
889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<AccessorInfo> entry =
890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Handle<AccessorInfo>(AccessorInfo::cast(callbacks.get(i)));
891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Ensure the key is a symbol before writing into the instance descriptor.
892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<String> key =
893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        SymbolFromString(Handle<String>(String::cast(entry->name())));
894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Check if a descriptor with this name already exists before writing.
895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (result->LinearSearch(*key, descriptor_count) ==
896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        DescriptorArray::kNotFound) {
897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      CallbacksDescriptor desc(*key, *entry, entry->property_attributes());
8983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      result->Set(descriptor_count, &desc, witness);
899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      descriptor_count++;
900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      duplicates++;
902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If duplicates were detected, allocate a result of the right size
906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // and transfer the elements.
907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (duplicates > 0) {
908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int number_of_descriptors = result->number_of_descriptors() - duplicates;
909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<DescriptorArray> new_result =
910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        NewDescriptorArray(number_of_descriptors);
911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < number_of_descriptors; i++) {
9123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DescriptorArray::CopyFrom(new_result, i, result, i, witness);
913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    result = new_result;
915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Sort the result before returning.
9183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  result->Sort(witness);
919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<JSObject> Factory::NewJSObject(Handle<JSFunction> constructor,
924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      PretenureFlag pretenure) {
92544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
92644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
92744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateJSObject(*constructor, pretenure), JSObject);
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<GlobalObject> Factory::NewGlobalObject(
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<JSFunction> constructor) {
93344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
93444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->AllocateGlobalObject(*constructor),
935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     GlobalObject);
936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<JSObject> Factory::NewJSObjectFromMap(Handle<Map> map) {
94144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
94244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateJSObjectFromMap(*map, NOT_TENURED),
94444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      JSObject);
945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
94844f0eee88ff00398ff7f715fab053374d808c90dSteve BlockHandle<JSArray> Factory::NewJSArray(int capacity,
9493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    ElementsKind elements_kind,
950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                    PretenureFlag pretenure) {
95144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
9523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     isolate()->heap()->AllocateJSArrayAndStorage(
9533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         elements_kind,
9543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         0,
9553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         capacity,
9563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE,
9573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         pretenure),
95844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     JSArray);
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<JSArray> Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements,
9633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                ElementsKind elements_kind,
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                                PretenureFlag pretenure) {
9653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION(
9663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate(),
9673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate()->heap()->AllocateJSArrayWithElements(*elements,
9683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                     elements_kind,
9693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                     pretenure),
9703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      JSArray);
9713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Factory::SetElementsCapacityAndLength(Handle<JSArray> array,
9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           int capacity,
9763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           int length) {
9773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ElementsAccessor* accessor = array->GetElementsAccessor();
9783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION_VOID(
9793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate(),
9803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      accessor->SetCapacityAndLength(*array, capacity, length));
9813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Factory::SetContent(Handle<JSArray> array,
9853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         Handle<FixedArrayBase> elements) {
9863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION_VOID(
9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate(),
9883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      array->SetContent(*elements));
9893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Factory::EnsureCanContainHeapObjectElements(Handle<JSArray> array) {
9933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION_VOID(
9943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate(),
9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      array->EnsureCanContainHeapObjectElements());
9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Factory::EnsureCanContainElements(Handle<JSArray> array,
10003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                       Handle<FixedArrayBase> elements,
10013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                       EnsureElementsMode mode) {
10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION_VOID(
10033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate(),
10043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      array->EnsureCanContainElements(*elements, mode));
1005592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1006592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1007592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1008257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<JSProxy> Factory::NewJSProxy(Handle<Object> handler,
1009257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                    Handle<Object> prototype) {
1010257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  CALL_HEAP_FUNCTION(
1011257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      isolate(),
1012257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      isolate()->heap()->AllocateJSProxy(*handler, *prototype),
1013257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      JSProxy);
1014257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1015257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1016257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1017589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid Factory::BecomeJSObject(Handle<JSReceiver> object) {
10183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  CALL_HEAP_FUNCTION_VOID(
10193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      isolate(),
1020589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      isolate()->heap()->ReinitializeJSReceiver(
1021589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch          *object, JS_OBJECT_TYPE, JSObject::kHeaderSize));
1022589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
1023589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1024589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1025589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid Factory::BecomeJSFunction(Handle<JSReceiver> object) {
1026589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  CALL_HEAP_FUNCTION_VOID(
1027589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      isolate(),
1028589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      isolate()->heap()->ReinitializeJSReceiver(
1029589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch          *object, JS_FUNCTION_TYPE, JSFunction::kSize));
10303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
10313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Factory::SetIdentityHash(Handle<JSObject> object, Object* hash) {
10343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION_VOID(
10353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      isolate(),
10363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      object->SetIdentityHash(hash, ALLOW_CREATION));
10373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10406ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(
10413bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch    Handle<String> name,
10423bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch    int number_of_literals,
10433bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch    Handle<Code> code,
10443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Handle<ScopeInfo> scope_info) {
10456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Handle<SharedFunctionInfo> shared = NewSharedFunctionInfo(name);
10466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  shared->set_code(*code);
10473bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  shared->set_scope_info(*scope_info);
10486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int literals_array_size = number_of_literals;
10496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // If the function contains object, regexp or array literals,
10506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // allocate extra space for a literals array prefix containing the
10516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // context.
10526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (number_of_literals > 0) {
10536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    literals_array_size += JSFunction::kLiteralsPrefixSize;
10546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
10556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  shared->set_num_literals(literals_array_size);
10566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return shared;
10576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
10586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
10596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
10601e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockHandle<JSMessageObject> Factory::NewJSMessageObject(
10611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    Handle<String> type,
10621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    Handle<JSArray> arguments,
10631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    int start_position,
10641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    int end_position,
10651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    Handle<Object> script,
10661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    Handle<Object> stack_trace,
10671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    Handle<Object> stack_frames) {
106844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
106944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->AllocateJSMessageObject(*type,
107044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         *arguments,
107144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         start_position,
107244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         end_position,
107344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         *script,
107444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         *stack_trace,
107544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         *stack_frames),
10761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     JSMessageObject);
10771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
10781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(Handle<String> name) {
108044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
108144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->AllocateSharedFunctionInfo(*name),
1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     SharedFunctionInfo);
1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<String> Factory::NumberToString(Handle<Object> number) {
108744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
108844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->NumberToString(*number), String);
1089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
10923ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<String> Factory::Uint32ToString(uint32_t value) {
10933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_HEAP_FUNCTION(isolate(),
10943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     isolate()->heap()->Uint32ToString(value), String);
10953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1098c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochHandle<SeededNumberDictionary> Factory::DictionaryAtNumberPut(
1099c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    Handle<SeededNumberDictionary> dictionary,
1100c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    uint32_t key,
1101c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    Handle<Object> value) {
1102c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  CALL_HEAP_FUNCTION(isolate(),
1103c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                     dictionary->AtNumberPut(key, *value),
1104c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                     SeededNumberDictionary);
1105c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
1106c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1107c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1108c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochHandle<UnseededNumberDictionary> Factory::DictionaryAtNumberPut(
1109c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    Handle<UnseededNumberDictionary> dictionary,
1110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uint32_t key,
1111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<Object> value) {
111244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
111344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     dictionary->AtNumberPut(key, *value),
1114c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                     UnseededNumberDictionary);
1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<JSFunction> Factory::NewFunctionHelper(Handle<String> name,
1119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                              Handle<Object> prototype) {
1120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<SharedFunctionInfo> function_share = NewSharedFunctionInfo(name);
112144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
112244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
112344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateFunction(*isolate()->function_map(),
112444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                          *function_share,
112544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                          *prototype),
112644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      JSFunction);
1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<JSFunction> Factory::NewFunction(Handle<String> name,
1131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        Handle<Object> prototype) {
1132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<JSFunction> fun = NewFunctionHelper(name, prototype);
113344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  fun->set_context(isolate()->context()->global_context());
1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return fun;
1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11386ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<JSFunction> Factory::NewFunctionWithoutPrototypeHelper(
113944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Handle<String> name,
11403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LanguageMode language_mode) {
11416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Handle<SharedFunctionInfo> function_share = NewSharedFunctionInfo(name);
11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Map> map = (language_mode == CLASSIC_MODE)
11433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? isolate()->function_without_prototype_map()
11443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : isolate()->strict_mode_function_without_prototype_map();
114544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
114644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     isolate()->heap()->AllocateFunction(
114744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                         *map,
11486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                         *function_share,
11496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                         *the_hole_value()),
11506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                     JSFunction);
11516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
11526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
11536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
115444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockHandle<JSFunction> Factory::NewFunctionWithoutPrototype(
115544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Handle<String> name,
11563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LanguageMode language_mode) {
11573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<JSFunction> fun =
11583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      NewFunctionWithoutPrototypeHelper(name, language_mode);
115944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  fun->set_context(isolate()->context()->global_context());
11606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return fun;
11616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
11626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
11636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1164e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarkeHandle<Object> Factory::ToObject(Handle<Object> object) {
116544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(), object->ToObject(), Object);
1166e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}
1167e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1168e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke
1169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::ToObject(Handle<Object> object,
1170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                 Handle<Context> global_context) {
117144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(), object->ToObject(*global_context), Object);
1172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT
1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<DebugInfo> Factory::NewDebugInfo(Handle<SharedFunctionInfo> shared) {
1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Get the original code of the function.
1178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Code> code(shared->code());
1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Create a copy of the code before allocating the debug info object to avoid
1181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // allocation while setting up the debug info object.
1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Code> original_code(*Factory::CopyCode(code));
1183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Allocate initial fixed array for active break points before allocating the
1185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // debug info object to avoid allocation while setting up the debug info
1186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // object.
1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<FixedArray> break_points(
118844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      NewFixedArray(Debug::kEstimatedNofBreakPointsInFunction));
1189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Create and set up the debug info object. Debug info contains function, a
1191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // copy of the original code, the executing code and initial fixed array for
1192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // active break points.
1193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<DebugInfo> debug_info =
119444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Handle<DebugInfo>::cast(NewStruct(DEBUG_INFO_TYPE));
1195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debug_info->set_shared(*shared);
1196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debug_info->set_original_code(*original_code);
1197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debug_info->set_code(*code);
1198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  debug_info->set_break_points(*break_points);
1199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Link debug info to function.
1201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  shared->set_debug_info(*debug_info);
1202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return debug_info;
1204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
1206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<JSObject> Factory::NewArgumentsObject(Handle<Object> callee,
1209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                             int length) {
121044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(
121144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate(),
121244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate()->heap()->AllocateArgumentsObject(*callee, length), JSObject);
1213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<JSFunction> Factory::CreateApiFunction(
1217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<FunctionTemplateInfo> obj, ApiInstanceType instance_type) {
121844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Code> code = isolate()->builtins()->HandleApiCall();
121944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Code> construct_stub = isolate()->builtins()->JSConstructStubApi();
1220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int internal_field_count = 0;
1222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!obj->instance_template()->IsUndefined()) {
1223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<ObjectTemplateInfo> instance_template =
1224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Handle<ObjectTemplateInfo>(
1225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            ObjectTemplateInfo::cast(obj->instance_template()));
1226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    internal_field_count =
1227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Smi::cast(instance_template->internal_field_count())->value();
1228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int instance_size = kPointerSize * internal_field_count;
1231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InstanceType type = INVALID_TYPE;
1232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (instance_type) {
1233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JavaScriptObject:
1234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      type = JS_OBJECT_TYPE;
1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      instance_size += JSObject::kHeaderSize;
1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case InnerGlobalObject:
1238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      type = JS_GLOBAL_OBJECT_TYPE;
1239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      instance_size += JSGlobalObject::kSize;
1240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case OuterGlobalObject:
1242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      type = JS_GLOBAL_PROXY_TYPE;
1243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      instance_size += JSGlobalProxy::kSize;
1244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
1246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(type != INVALID_TYPE);
1249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<JSFunction> result =
125144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      NewFunction(Factory::empty_symbol(),
125244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                  type,
125344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                  instance_size,
125444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                  code,
125544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                  true);
1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Set class name.
1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Object> class_name = Handle<Object>(obj->class_name());
1258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (class_name->IsString()) {
1259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    result->shared()->set_instance_class_name(*class_name);
1260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    result->shared()->set_name(*class_name);
1261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Map> map = Handle<Map>(result->initial_map());
1264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Mark as undetectable if needed.
1266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (obj->undetectable()) {
1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    map->set_is_undetectable();
1268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Mark as hidden for the __proto__ accessor if needed.
1271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (obj->hidden_prototype()) {
1272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    map->set_is_hidden_prototype();
1273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Mark as needs_access_check if needed.
1276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (obj->needs_access_check()) {
1277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    map->set_is_access_check_needed(true);
1278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Set interceptor information in the map.
1281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!obj->named_property_handler()->IsUndefined()) {
1282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    map->set_has_named_interceptor();
1283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!obj->indexed_property_handler()->IsUndefined()) {
1285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    map->set_has_indexed_interceptor();
1286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Set instance call-as-function information in the map.
1289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!obj->instance_call_handler()->IsUndefined()) {
1290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    map->set_has_instance_call_handler();
1291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result->shared()->set_function_data(*obj);
1294e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  result->shared()->set_construct_stub(*construct_stub);
1295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result->shared()->DontAdaptArguments();
1296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Recursively copy parent templates' accessors, 'data' may be modified.
1298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<DescriptorArray> array =
1299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Handle<DescriptorArray>(map->instance_descriptors());
1300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  while (true) {
1301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<Object> props = Handle<Object>(obj->property_accessors());
1302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (!props->IsUndefined()) {
130344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      array = CopyAppendCallbackDescriptors(array, props);
1304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<Object> parent = Handle<Object>(obj->parent_template());
1306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (parent->IsUndefined()) break;
1307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    obj = Handle<FunctionTemplateInfo>::cast(parent);
1308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!array->IsEmpty()) {
1310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    map->set_instance_descriptors(*array);
1311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(result->shared()->IsApiFunction());
1314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
1315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<MapCache> Factory::NewMapCache(int at_least_space_for) {
131944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
132044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     MapCache::Allocate(at_least_space_for), MapCache);
1321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13245913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMUST_USE_RESULT static MaybeObject* UpdateMapCacheWith(Context* context,
13255913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck                                                       FixedArray* keys,
13265913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck                                                       Map* map) {
13275913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  Object* result;
13285913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  { MaybeObject* maybe_result =
13295913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck        MapCache::cast(context->map_cache())->Put(keys, map);
13305913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck    if (!maybe_result->ToObject(&result)) return maybe_result;
13315913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  }
13325913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  context->set_map_cache(MapCache::cast(result));
1333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
1334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<MapCache> Factory::AddToMapCache(Handle<Context> context,
1338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        Handle<FixedArray> keys,
1339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        Handle<Map> map) {
134044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CALL_HEAP_FUNCTION(isolate(),
134144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                     UpdateMapCacheWith(*context, *keys, *map), MapCache);
1342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Map> Factory::ObjectLiteralMapFromCache(Handle<Context> context,
1346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                               Handle<FixedArray> keys) {
1347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (context->map_cache()->IsUndefined()) {
1348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Allocate the new map cache for the global context.
1349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Handle<MapCache> new_cache = NewMapCache(24);
1350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    context->set_map_cache(*new_cache);
1351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Check to see whether there is a matching element in the cache.
1353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<MapCache> cache =
1354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Handle<MapCache>(MapCache::cast(context->map_cache()));
1355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Object> result = Handle<Object>(cache->Lookup(*keys));
1356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (result->IsMap()) return Handle<Map>::cast(result);
1357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Create a new map and add it to the cache.
1358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Map> map =
1359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      CopyMap(Handle<Map>(context->object_function()->initial_map()),
1360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              keys->length());
1361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  AddToMapCache(context, keys, map);
1362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Handle<Map>(map);
1363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Factory::SetRegExpAtomData(Handle<JSRegExp> regexp,
1367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                JSRegExp::Type type,
1368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                Handle<String> source,
1369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                JSRegExp::Flags flags,
1370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                Handle<Object> data) {
1371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<FixedArray> store = NewFixedArray(JSRegExp::kAtomDataSize);
1372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kTagIndex, Smi::FromInt(type));
1374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kSourceIndex, *source);
1375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kFlagsIndex, Smi::FromInt(flags.value()));
1376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kAtomPatternIndex, *data);
1377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  regexp->set_data(*store);
1378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Factory::SetRegExpIrregexpData(Handle<JSRegExp> regexp,
1381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                    JSRegExp::Type type,
1382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                    Handle<String> source,
1383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                    JSRegExp::Flags flags,
1384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                    int capture_count) {
1385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<FixedArray> store = NewFixedArray(JSRegExp::kIrregexpDataSize);
1386257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Smi* uninitialized = Smi::FromInt(JSRegExp::kUninitializedValue);
1387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kTagIndex, Smi::FromInt(type));
1388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kSourceIndex, *source);
1389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kFlagsIndex, Smi::FromInt(flags.value()));
1390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  store->set(JSRegExp::kIrregexpASCIICodeIndex, uninitialized);
1391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  store->set(JSRegExp::kIrregexpUC16CodeIndex, uninitialized);
1392257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  store->set(JSRegExp::kIrregexpASCIICodeSavedIndex, uninitialized);
1393257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  store->set(JSRegExp::kIrregexpUC16CodeSavedIndex, uninitialized);
1394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kIrregexpMaxRegisterCountIndex, Smi::FromInt(0));
1395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  store->set(JSRegExp::kIrregexpCaptureCountIndex,
1396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             Smi::FromInt(capture_count));
1397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  regexp->set_data(*store);
1398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Factory::ConfigureInstance(Handle<FunctionTemplateInfo> desc,
1403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                Handle<JSObject> instance,
1404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                bool* pending_exception) {
1405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Configure the instance by adding the properties specified by the
1406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // instance template.
1407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Handle<Object> instance_template = Handle<Object>(desc->instance_template());
1408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!instance_template->IsUndefined()) {
1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Execution::ConfigureInstance(instance,
1410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                 instance_template,
1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                 pending_exception);
1412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    *pending_exception = false;
1414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
14183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> Factory::GlobalConstantFor(Handle<String> name) {
14193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Heap* h = isolate()->heap();
14203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (name->Equals(h->undefined_symbol())) return undefined_value();
14213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (name->Equals(h->nan_symbol())) return nan_value();
14223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (name->Equals(h->infinity_symbol())) return infinity_value();
14233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Handle<Object>::null();
14243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14273ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> Factory::ToBoolean(bool value) {
14283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Handle<Object>(value
14293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        ? isolate()->heap()->true_value()
14303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        : isolate()->heap()->false_value());
14313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
1435