1/* 2 * Copyright (C) 2012 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "JITThunks.h" 28 29#if ENABLE(JIT) 30 31#include "Executable.h" 32#include "JIT.h" 33#include "VM.h" 34#include "Operations.h" 35 36namespace JSC { 37 38JITThunks::JITThunks() 39 : m_hostFunctionStubMap(adoptPtr(new HostFunctionStubMap)) 40{ 41} 42 43JITThunks::~JITThunks() 44{ 45} 46 47MacroAssemblerCodePtr JITThunks::ctiNativeCall(VM* vm) 48{ 49#if ENABLE(LLINT) 50 if (!vm->canUseJIT()) 51 return MacroAssemblerCodePtr::createLLIntCodePtr(llint_native_call_trampoline); 52#endif 53 return ctiStub(vm, nativeCallGenerator).code(); 54} 55MacroAssemblerCodePtr JITThunks::ctiNativeConstruct(VM* vm) 56{ 57#if ENABLE(LLINT) 58 if (!vm->canUseJIT()) 59 return MacroAssemblerCodePtr::createLLIntCodePtr(llint_native_construct_trampoline); 60#endif 61 return ctiStub(vm, nativeConstructGenerator).code(); 62} 63 64MacroAssemblerCodeRef JITThunks::ctiStub(VM* vm, ThunkGenerator generator) 65{ 66 CTIStubMap::AddResult entry = m_ctiStubMap.add(generator, MacroAssemblerCodeRef()); 67 if (entry.isNewEntry) 68 entry.iterator->value = generator(vm); 69 return entry.iterator->value; 70} 71 72NativeExecutable* JITThunks::hostFunctionStub(VM* vm, NativeFunction function, NativeFunction constructor) 73{ 74 if (NativeExecutable* nativeExecutable = m_hostFunctionStubMap->get(std::make_pair(function, constructor))) 75 return nativeExecutable; 76 77 NativeExecutable* nativeExecutable = NativeExecutable::create(*vm, JIT::compileCTINativeCall(vm, function), function, MacroAssemblerCodeRef::createSelfManagedCodeRef(ctiNativeConstruct(vm)), constructor, NoIntrinsic); 78 weakAdd(*m_hostFunctionStubMap, std::make_pair(function, constructor), PassWeak<NativeExecutable>(nativeExecutable)); 79 return nativeExecutable; 80} 81 82NativeExecutable* JITThunks::hostFunctionStub(VM* vm, NativeFunction function, ThunkGenerator generator, Intrinsic intrinsic) 83{ 84 if (NativeExecutable* nativeExecutable = m_hostFunctionStubMap->get(std::make_pair(function, &callHostFunctionAsConstructor))) 85 return nativeExecutable; 86 87 MacroAssemblerCodeRef code; 88 if (generator) { 89 if (vm->canUseJIT()) 90 code = generator(vm); 91 else 92 code = MacroAssemblerCodeRef(); 93 } else 94 code = JIT::compileCTINativeCall(vm, function); 95 96 NativeExecutable* nativeExecutable = NativeExecutable::create(*vm, code, function, MacroAssemblerCodeRef::createSelfManagedCodeRef(ctiNativeConstruct(vm)), callHostFunctionAsConstructor, intrinsic); 97 weakAdd(*m_hostFunctionStubMap, std::make_pair(function, &callHostFunctionAsConstructor), PassWeak<NativeExecutable>(nativeExecutable)); 98 return nativeExecutable; 99} 100 101void JITThunks::clearHostFunctionStubs() 102{ 103 m_hostFunctionStubMap.clear(); 104} 105 106} // namespace JSC 107 108#endif // ENABLE(JIT) 109