/*
 * Copyright (C) 2015 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.
 */

#include "config.h"
#include "DeferredSourceDump.h"

#include "CodeBlock.h"
#include "CodeBlockWithJITType.h"

namespace JSC {

DeferredSourceDump::DeferredSourceDump(CodeBlock* codeBlock)
    : m_codeBlock(codeBlock)
    , m_rootCodeBlock(nullptr)
    , m_rootJITType(JITCode::None)
{
}

DeferredSourceDump::DeferredSourceDump(CodeBlock* codeBlock, CodeBlock* rootCodeBlock, JITCode::JITType rootJITType, CodeOrigin callerCodeOrigin)
    : m_codeBlock(codeBlock)
    , m_rootCodeBlock(rootCodeBlock)
    , m_rootJITType(rootJITType)
    , m_callerCodeOrigin(callerCodeOrigin)
{
}

void DeferredSourceDump::dump()
{
    bool isInlinedFrame = !!m_rootCodeBlock;
    if (isInlinedFrame)
        dataLog("Inlined ");
    else
        dataLog("Compiled ");
    dataLog(*m_codeBlock);

    if (isInlinedFrame)
        dataLog(" at ", CodeBlockWithJITType(m_rootCodeBlock, m_rootJITType), " ", m_callerCodeOrigin);

    dataLog("\n'''");
    m_codeBlock->dumpSource();
    dataLog("'''\n");
}

} // namespace JSC
