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