/*
 * Copyright (C) 2013, 2014 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. AND ITS CONTRIBUTORS ``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 ITS 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.
 */

#pragma once

#include <wtf/Vector.h>

#if ENABLE(DFG_JIT)

namespace JSC { 

class CodeBlock;
class ScriptExecutable;
class SlotVisitor;
class Structure;
class VM;

namespace DFG {

class CommonData;

class DesiredTransition {
public:
    DesiredTransition(CodeBlock*, CodeBlock* codeOriginOwner, Structure*, Structure*);

    void reallyAdd(VM&, CommonData*);
    
    void visitChildren(SlotVisitor&);

private:
    CodeBlock* m_codeBlock;
    CodeBlock* m_codeOriginOwner;
    Structure* m_oldStructure;
    Structure* m_newStructure;
};

class DesiredTransitions {
public:
    DesiredTransitions();
    ~DesiredTransitions();

    void addLazily(CodeBlock*, CodeBlock* codeOriginOwner, Structure*, Structure*);
    void reallyAdd(VM&, CommonData*);
    void visitChildren(SlotVisitor&);

private:
    Vector<DesiredTransition> m_transitions;
};

} } // namespace JSC::DFG

#endif // ENABLE(DFG_JIT)
