2  * Copyright (C) 2013, 2014 Apple Inc. All rights reserved. 
   4  * Redistribution and use in source and binary forms, with or without 
   5  * modification, are permitted provided that the following conditions 
   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. 
  13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 
  14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
  15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 
  17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
  18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
  19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
  20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
  21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
  22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
  23  * THE POSSIBILITY OF SUCH DAMAGE. 
  26 #ifndef DFGDesiredWriteBarriers_h 
  27 #define DFGDesiredWriteBarriers_h 
  29 #include "WriteBarrier.h" 
  30 #include <wtf/Vector.h> 
  37 class ScriptExecutable
; 
  40 struct InlineCallFrame
; 
  44 class DesiredWriteBarrier 
{ 
  48         InlineCallFrameExecutableType
, 
  50     DesiredWriteBarrier(Type
, CodeBlock
*, unsigned index
, JSCell
* owner
); 
  51     DesiredWriteBarrier(Type
, CodeBlock
*, InlineCallFrame
*, JSCell
* owner
); 
  55     void visitChildren(SlotVisitor
&); 
  60     CodeBlock
* m_codeBlock
; 
  63         InlineCallFrame
* inlineCallFrame
; 
  67 class DesiredWriteBarriers 
{ 
  69     DesiredWriteBarriers(); 
  70     ~DesiredWriteBarriers(); 
  72     DesiredWriteBarrier
& add(DesiredWriteBarrier::Type type
, CodeBlock
* codeBlock
, unsigned index
, JSCell
* owner
) 
  74         m_barriers
.append(DesiredWriteBarrier(type
, codeBlock
, index
, owner
)); 
  75         return m_barriers
.last(); 
  77     DesiredWriteBarrier
& add(DesiredWriteBarrier::Type type
, CodeBlock
* codeBlock
, InlineCallFrame
* inlineCallFrame
, JSCell
* owner
) 
  79         m_barriers
.append(DesiredWriteBarrier(type
, codeBlock
, inlineCallFrame
, owner
)); 
  80         return m_barriers
.last(); 
  85     void visitChildren(SlotVisitor
&); 
  88     Vector
<DesiredWriteBarrier
> m_barriers
; 
  91 inline void initializeLazyWriteBarrierForInlineCallFrameExecutable(DesiredWriteBarriers
& barriers
, WriteBarrier
<ScriptExecutable
>& barrier
, CodeBlock
* codeBlock
, InlineCallFrame
* inlineCallFrame
, JSCell
* owner
, ScriptExecutable
* value
) 
  93     DesiredWriteBarrier
& desiredBarrier 
= barriers
.add(DesiredWriteBarrier::InlineCallFrameExecutableType
, codeBlock
, inlineCallFrame
, owner
); 
  94     barrier 
= WriteBarrier
<ScriptExecutable
>(desiredBarrier
, value
); 
  97 inline void initializeLazyWriteBarrierForConstant(DesiredWriteBarriers
& barriers
, WriteBarrier
<Unknown
>& barrier
, CodeBlock
* codeBlock
, unsigned index
, JSCell
* owner
, JSValue value
) 
  99     DesiredWriteBarrier
& desiredBarrier 
= barriers
.add(DesiredWriteBarrier::ConstantType
, codeBlock
, index
, owner
); 
 100     barrier 
= WriteBarrier
<Unknown
>(desiredBarrier
, value
); 
 103 } } // namespace JSC::DFG 
 105 #endif // ENABLE(DFG_JIT) 
 107 #endif // DFGDesiredWriteBarriers_h