/* * Copyright (C) 2009 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MacroAssemblerCodeRef_h #define MacroAssemblerCodeRef_h #include #include "ExecutableAllocator.h" #include "PassRefPtr.h" #include "RefPtr.h" #include "UnusedParam.h" #if ENABLE(ASSEMBLER) namespace JSC { // FunctionPtr: // // FunctionPtr should be used to wrap pointers to C/C++ functions in JSC // (particularly, the stub functions). class FunctionPtr { public: FunctionPtr() : m_value(0) { } template explicit FunctionPtr(FunctionType* value) : m_value(reinterpret_cast(value)) { ASSERT(m_value); } void* value() const { return m_value; } void* executableAddress() const { return m_value; } private: void* m_value; }; // ReturnAddressPtr: // // ReturnAddressPtr should be used to wrap return addresses generated by processor // 'call' instructions exectued in JIT code. We use return addresses to look up // exception and optimization information, and to repatch the call instruction // that is the source of the return address. class ReturnAddressPtr { public: ReturnAddressPtr() : m_value(0) { } explicit ReturnAddressPtr(void* value) : m_value(value) { ASSERT(m_value); } void* value() const { return m_value; } private: void* m_value; }; // MacroAssemblerCodePtr: // // MacroAssemblerCodePtr should be used to wrap pointers to JIT generated code. class MacroAssemblerCodePtr { public: MacroAssemblerCodePtr() : m_value(0) { } explicit MacroAssemblerCodePtr(void* value) : m_value(value) { ASSERT(m_value); } explicit MacroAssemblerCodePtr(ReturnAddressPtr ra) : m_value(ra.value()) { ASSERT(m_value); } void* executableAddress() const { return m_value; } void* dataLocation() const { ASSERT(m_value); return m_value; } private: void* m_value; }; // MacroAssemblerCodeRef: // // A reference to a section of JIT generated code. A CodeRef consists of a // pointer to the code, and a ref pointer to the pool from within which it // was allocated. class MacroAssemblerCodeRef { public: MacroAssemblerCodeRef() #ifndef NDEBUG : m_size(0) #endif { } MacroAssemblerCodeRef(void* code, PassRefPtr executablePool, size_t size) : m_code(code) , m_executablePool(executablePool) { #ifndef NDEBUG m_size = size; #else UNUSED_PARAM(size); #endif } MacroAssemblerCodePtr m_code; RefPtr m_executablePool; #ifndef NDEBUG size_t m_size; #endif }; } // namespace JSC #endif // ENABLE(ASSEMBLER) #endif // MacroAssemblerCodeRef_h