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 "bootstrapper.h" 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "code-stubs.h" 32257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "stub-cache.h" 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "factory.h" 34b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#include "gdb-jit.h" 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "macro-assembler.h" 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkebool CodeStub::FindCodeInCache(Code** code_out) { 4144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Heap* heap = Isolate::Current()->heap(); 4244f0eee88ff00398ff7f715fab053374d808c90dSteve Block int index = heap->code_stubs()->FindEntry(GetKey()); 43c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch if (index != UnseededNumberDictionary::kNotFound) { 4444f0eee88ff00398ff7f715fab053374d808c90dSteve Block *code_out = Code::cast(heap->code_stubs()->ValueAt(index)); 45e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return true; 46d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 47e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return false; 48e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 49d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 51e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid CodeStub::GenerateCode(MacroAssembler* masm) { 52e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Update the static counter each time a new code stub is generated. 5344f0eee88ff00398ff7f715fab053374d808c90dSteve Block masm->isolate()->counters()->code_stubs()->Increment(); 54086aeeaae12517475c22695a200be45495516549Ben Murdoch 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Nested stubs are not allowed for leaves. 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AllowStubCallsScope allow_scope(masm, false); 57086aeeaae12517475c22695a200be45495516549Ben Murdoch 58e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Generate the code for the stub. 59e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke masm->set_generating_stub(true); 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NoCurrentFrameScope scope(masm); 61e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke Generate(masm); 62e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 65589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochSmartArrayPointer<const char> CodeStub::GetName() { 663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch char buffer[100]; 673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch NoAllocationStringAllocator allocator(buffer, 683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static_cast<unsigned>(sizeof(buffer))); 693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch StringStream stream(&allocator); 703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch PrintName(&stream); 713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return stream.ToCString(); 723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 75e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid CodeStub::RecordCodeGeneration(Code* code, MacroAssembler* masm) { 76e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke code->set_major_key(MajorKey()); 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate = masm->isolate(); 79589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch SmartArrayPointer<const char> name = GetName(); 803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch PROFILE(isolate, CodeCreateEvent(Logger::STUB_TAG, code, *name)); 813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch GDBJIT(AddCode(GDBJITInterface::STUB, *name, code)); 8244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Counters* counters = isolate->counters(); 8344f0eee88ff00398ff7f715fab053374d808c90dSteve Block counters->total_stubs_code_size()->Increment(code->instruction_size()); 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DISASSEMBLER 86e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke if (FLAG_print_code_stubs) { 873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch code->Disassemble(*name); 88e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke PrintF("\n"); 89e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 91e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 92e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 93e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 946ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockint CodeStub::GetCodeKind() { 956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return Code::STUB; 966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 99e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarkeHandle<Code> CodeStub::GetCode() { 10044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate = Isolate::Current(); 10144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Factory* factory = isolate->factory(); 10244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Heap* heap = isolate->heap(); 103e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke Code* code; 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (UseSpecialCache() 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? FindCodeInSpecialCache(&code) 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : FindCodeInCache(&code)) { 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(IsPregenerated() == code->is_pregenerated()); 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Handle<Code>(code); 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch { 11244f0eee88ff00398ff7f715fab053374d808c90dSteve Block HandleScope scope(isolate); 113e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 114e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Generate the new code. 1158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch MacroAssembler masm(isolate, NULL, 256); 116e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke GenerateCode(&masm); 117e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 118e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Create the code object. 119e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke CodeDesc desc; 120e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke masm.GetCode(&desc); 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 122e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Copy the generated code into a heap object. 1236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Code::Flags flags = Code::ComputeFlags( 1246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static_cast<Code::Kind>(GetCodeKind()), 1256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block GetICState()); 12644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Code> new_object = factory->NewCode( 12744f0eee88ff00398ff7f715fab053374d808c90dSteve Block desc, flags, masm.CodeObject(), NeedsImmovableCode()); 128e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke RecordCodeGeneration(*new_object, &masm); 1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FinishCode(new_object); 1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (UseSpecialCache()) { 1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AddToSpecialCache(new_object); 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Update the dictionary and the root in Heap. 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<UnseededNumberDictionary> dict = 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch factory->DictionaryAtNumberPut( 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<UnseededNumberDictionary>(heap->code_stubs()), 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GetKey(), 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new_object); 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap->public_set_code_stubs(*dict); 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 142e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke code = *new_object; 143e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 144e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Activate(code); 14644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!NeedsImmovableCode() || heap->lo_space()->Contains(code)); 14744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Handle<Code>(code, isolate); 148e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 149e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 150e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 1513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuconst char* CodeStub::MajorName(CodeStub::Major major_key, 1523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bool allow_unknown_keys) { 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (major_key) { 1543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#define DEF_CASE(name) case name: return #name "Stub"; 155d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block CODE_STUB_LIST(DEF_CASE) 156d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block#undef DEF_CASE 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block default: 1583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!allow_unknown_keys) { 1593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu UNREACHABLE(); 1603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return NULL; 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid CodeStub::PrintName(StringStream* stream) { 1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("%s", MajorName(MajorKey(), false)); 1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid ICCompareStub::AddToSpecialCache(Handle<Code> new_object) { 1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(*known_map_ != NULL); 1733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Isolate* isolate = new_object->GetIsolate(); 1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Factory* factory = isolate->factory(); 1753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Map::UpdateCodeCache(known_map_, 1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch factory->compare_ic_symbol(), 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new_object); 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool ICCompareStub::FindCodeInSpecialCache(Code** code_out) { 1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Isolate* isolate = known_map_->GetIsolate(); 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Factory* factory = isolate->factory(); 1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Code::Flags flags = Code::ComputeFlags( 1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static_cast<Code::Kind>(GetCodeKind()), 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNINITIALIZED); 1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Object> probe( 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch known_map_->FindInCodeCache(*factory->compare_ic_symbol(), flags)); 1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (probe->IsCode()) { 1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *code_out = Code::cast(*probe); 1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true; 1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false; 1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochint ICCompareStub::MinorKey() { 198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return OpField::encode(op_ - Token::EQ) | StateField::encode(state_); 199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid ICCompareStub::Generate(MacroAssembler* masm) { 203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (state_) { 204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case CompareIC::UNINITIALIZED: 205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch GenerateMiss(masm); 206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case CompareIC::SMIS: 208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch GenerateSmis(masm); 209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case CompareIC::HEAP_NUMBERS: 211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch GenerateHeapNumbers(masm); 212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 213257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case CompareIC::STRINGS: 214257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch GenerateStrings(masm); 215257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch break; 216257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case CompareIC::SYMBOLS: 217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch GenerateSymbols(masm); 218257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch break; 219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case CompareIC::OBJECTS: 220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch GenerateObjects(masm); 221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case CompareIC::KNOWN_OBJECTS: 2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(*known_map_ != NULL); 2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GenerateKnownObjects(masm); 2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: 227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid InstanceofStub::PrintName(StringStream* stream) { 233086aeeaae12517475c22695a200be45495516549Ben Murdoch const char* args = ""; 234086aeeaae12517475c22695a200be45495516549Ben Murdoch if (HasArgsInRegisters()) { 235086aeeaae12517475c22695a200be45495516549Ben Murdoch args = "_REGS"; 236086aeeaae12517475c22695a200be45495516549Ben Murdoch } 237086aeeaae12517475c22695a200be45495516549Ben Murdoch 238086aeeaae12517475c22695a200be45495516549Ben Murdoch const char* inline_check = ""; 239086aeeaae12517475c22695a200be45495516549Ben Murdoch if (HasCallSiteInlineCheck()) { 240086aeeaae12517475c22695a200be45495516549Ben Murdoch inline_check = "_INLINE"; 241086aeeaae12517475c22695a200be45495516549Ben Murdoch } 242086aeeaae12517475c22695a200be45495516549Ben Murdoch 243086aeeaae12517475c22695a200be45495516549Ben Murdoch const char* return_true_false_object = ""; 244086aeeaae12517475c22695a200be45495516549Ben Murdoch if (ReturnTrueFalseObject()) { 245086aeeaae12517475c22695a200be45495516549Ben Murdoch return_true_false_object = "_TRUEFALSE"; 246086aeeaae12517475c22695a200be45495516549Ben Murdoch } 247086aeeaae12517475c22695a200be45495516549Ben Murdoch 2483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add("InstanceofStub%s%s%s", 2493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch args, 2503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline_check, 2513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return_true_false_object); 252086aeeaae12517475c22695a200be45495516549Ben Murdoch} 253086aeeaae12517475c22695a200be45495516549Ben Murdoch 254086aeeaae12517475c22695a200be45495516549Ben Murdoch 2553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSEntryStub::FinishCode(Handle<Code> code) { 2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<FixedArray> handler_table = 2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch code->GetIsolate()->factory()->NewFixedArray(1, TENURED); 2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch handler_table->set(0, Smi::FromInt(handler_offset_)); 2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch code->set_handler_table(*handler_table); 2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid KeyedLoadElementStub::Generate(MacroAssembler* masm) { 2643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch switch (elements_kind_) { 265589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case FAST_ELEMENTS: 2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case FAST_SMI_ONLY_ELEMENTS: 2673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch KeyedLoadStubCompiler::GenerateLoadFastElement(masm); 2683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 269589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case FAST_DOUBLE_ELEMENTS: 2703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch KeyedLoadStubCompiler::GenerateLoadFastDoubleElement(masm); 2713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 272589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_BYTE_ELEMENTS: 273589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 274589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_SHORT_ELEMENTS: 275589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 276589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_INT_ELEMENTS: 277589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_INT_ELEMENTS: 278589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_FLOAT_ELEMENTS: 279589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_DOUBLE_ELEMENTS: 280589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_PIXEL_ELEMENTS: 2813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch KeyedLoadStubCompiler::GenerateLoadExternalArray(masm, elements_kind_); 2823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 283589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case DICTIONARY_ELEMENTS: 2843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch KeyedLoadStubCompiler::GenerateLoadDictionaryElement(masm); 2853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 286589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case NON_STRICT_ARGUMENTS_ELEMENTS: 2873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch UNREACHABLE(); 2883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 2893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 290257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 292257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid KeyedStoreElementStub::Generate(MacroAssembler* masm) { 2943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch switch (elements_kind_) { 295589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case FAST_ELEMENTS: 2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case FAST_SMI_ONLY_ELEMENTS: { 2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch KeyedStoreStubCompiler::GenerateStoreFastElement(masm, 2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch is_js_array_, 2993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements_kind_, 3003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch grow_mode_); 3013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 3023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 303589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case FAST_DOUBLE_ELEMENTS: 3043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(masm, 3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch is_js_array_, 3063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch grow_mode_); 3073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 308589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_BYTE_ELEMENTS: 309589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 310589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_SHORT_ELEMENTS: 311589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 312589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_INT_ELEMENTS: 313589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_UNSIGNED_INT_ELEMENTS: 314589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_FLOAT_ELEMENTS: 315589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_DOUBLE_ELEMENTS: 316589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case EXTERNAL_PIXEL_ELEMENTS: 3173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch KeyedStoreStubCompiler::GenerateStoreExternalArray(masm, elements_kind_); 3183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 319589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case DICTIONARY_ELEMENTS: 3203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch KeyedStoreStubCompiler::GenerateStoreDictionaryElement(masm); 3213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 322589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case NON_STRICT_ARGUMENTS_ELEMENTS: 3233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch UNREACHABLE(); 3243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break; 3253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 326257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 328257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid ArgumentsAccessStub::PrintName(StringStream* stream) { 3303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("ArgumentsAccessStub_"); 3313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch switch (type_) { 3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case READ_ELEMENT: stream->Add("ReadElement"); break; 3333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case NEW_NON_STRICT_FAST: stream->Add("NewNonStrictFast"); break; 3343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case NEW_NON_STRICT_SLOW: stream->Add("NewNonStrictSlow"); break; 3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case NEW_STRICT: stream->Add("NewStrict"); break; 3363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 337257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid CallFunctionStub::PrintName(StringStream* stream) { 3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("CallFunctionStub_Args%d", argc_); 3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (ReceiverMightBeImplicit()) stream->Add("_Implicit"); 3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (RecordCallTarget()) stream->Add("_Recording"); 3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid CallConstructStub::PrintName(StringStream* stream) { 3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("CallConstructStub"); 3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (RecordCallTarget()) stream->Add("_Recording"); 3505d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch} 3515d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 3525d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 35369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid ToBooleanStub::PrintName(StringStream* stream) { 35469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch stream->Add("ToBooleanStub_"); 35569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch types_.Print(stream); 35669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 35769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 35869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 35969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid ToBooleanStub::Types::Print(StringStream* stream) const { 36069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (IsEmpty()) stream->Add("None"); 36169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (Contains(UNDEFINED)) stream->Add("Undefined"); 36269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (Contains(BOOLEAN)) stream->Add("Bool"); 36369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (Contains(NULL_TYPE)) stream->Add("Null"); 36469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (Contains(SMI)) stream->Add("Smi"); 36569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (Contains(SPEC_OBJECT)) stream->Add("SpecObject"); 36669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (Contains(STRING)) stream->Add("String"); 36769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (Contains(HEAP_NUMBER)) stream->Add("HeapNumber"); 36869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 36969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 37069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 37169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid ToBooleanStub::Types::TraceTransition(Types to) const { 37269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (!FLAG_trace_ic) return; 37369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch char buffer[100]; 37469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch NoAllocationStringAllocator allocator(buffer, 37569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static_cast<unsigned>(sizeof(buffer))); 37669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch StringStream stream(&allocator); 37769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch stream.Add("[ToBooleanIC ("); 37869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Print(&stream); 37969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch stream.Add("->"); 38069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch to.Print(&stream); 38169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch stream.Add(")]\n"); 38269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch stream.OutputToStdOut(); 38369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 38469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 38569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 38669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool ToBooleanStub::Types::Record(Handle<Object> object) { 38769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (object->IsUndefined()) { 38869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Add(UNDEFINED); 38969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return false; 39069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else if (object->IsBoolean()) { 39169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Add(BOOLEAN); 39269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return object->IsTrue(); 39369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else if (object->IsNull()) { 39469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Add(NULL_TYPE); 39569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return false; 39669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else if (object->IsSmi()) { 39769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Add(SMI); 39869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Smi::cast(*object)->value() != 0; 39969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else if (object->IsSpecObject()) { 40069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Add(SPEC_OBJECT); 40169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return !object->IsUndetectableObject(); 40269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else if (object->IsString()) { 40369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Add(STRING); 40469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return !object->IsUndetectableObject() && 40569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch String::cast(*object)->length() != 0; 40669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else if (object->IsHeapNumber()) { 40769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(!object->IsUndetectableObject()); 40869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Add(HEAP_NUMBER); 40969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch double value = HeapNumber::cast(*object)->value(); 41069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return value != 0 && !isnan(value); 41169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else { 41269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // We should never see an internal object at runtime here! 41369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch UNREACHABLE(); 41469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return true; 41569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 41669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 41769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 41869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 41969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool ToBooleanStub::Types::NeedsMap() const { 42069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Contains(ToBooleanStub::SPEC_OBJECT) 42169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch || Contains(ToBooleanStub::STRING) 42269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch || Contains(ToBooleanStub::HEAP_NUMBER); 42369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 42469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 42569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 42669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool ToBooleanStub::Types::CanBeUndetectable() const { 42769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Contains(ToBooleanStub::SPEC_OBJECT) 42869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch || Contains(ToBooleanStub::STRING); 42969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 43069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 43169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid ElementsTransitionAndStoreStub::Generate(MacroAssembler* masm) { 4333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Label fail; 4343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!FLAG_trace_elements_transitions) { 4353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to_ == FAST_ELEMENTS) { 4363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (from_ == FAST_SMI_ONLY_ELEMENTS) { 4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsTransitionGenerator::GenerateSmiOnlyToObject(masm); 4383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (from_ == FAST_DOUBLE_ELEMENTS) { 4393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsTransitionGenerator::GenerateDoubleToObject(masm, &fail); 4403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch KeyedStoreStubCompiler::GenerateStoreFastElement(masm, 4443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch is_jsarray_, 4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FAST_ELEMENTS, 4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch grow_mode_); 4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (from_ == FAST_SMI_ONLY_ELEMENTS && to_ == FAST_DOUBLE_ELEMENTS) { 4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsTransitionGenerator::GenerateSmiOnlyToDouble(masm, &fail); 4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(masm, 4503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch is_jsarray_, 4513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch grow_mode_); 4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch masm->bind(&fail); 4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch KeyedStoreIC::GenerateRuntimeSetProperty(masm, strict_mode_); 4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 461