Remove excessive headers from JavaScriptCore
[WebKit-https.git] / Source / JavaScriptCore / interpreter / CLoopStack.h
1 /*
2  * Copyright (C) 2008-2009, 2013-2014, 2016 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #pragma once
30
31 #if !ENABLE(JIT)
32
33 #include "Register.h"
34 #include <wtf/Noncopyable.h>
35 #include <wtf/PageReservation.h>
36
37 namespace JSC {
38
39     class CodeBlockSet;
40     class ConservativeRoots;
41     class JITStubRoutineSet;
42     class VM;
43     class LLIntOffsetsExtractor;
44
45     class CLoopStack {
46         WTF_MAKE_NONCOPYABLE(CLoopStack);
47     public:
48         // Allow 8k of excess registers before we start trying to reap the stack
49         static const ptrdiff_t maxExcessCapacity = 8 * 1024;
50
51         CLoopStack(VM&);
52         ~CLoopStack();
53         
54         bool ensureCapacityFor(Register* newTopOfStack);
55
56         bool containsAddress(Register* address) { return (lowAddress() <= address && address < highAddress()); }
57         static size_t committedByteCount();
58
59         void gatherConservativeRoots(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&);
60         void sanitizeStack();
61
62         Register* baseOfStack() const
63         {
64             return highAddress() - 1;
65         }
66
67         size_t size() const { return highAddress() - lowAddress(); }
68
69         void setSoftReservedZoneSize(size_t);
70         bool isSafeToRecurse() const;
71         inline Register* topOfStack();
72
73     private:
74
75         Register* lowAddress() const
76         {
77             return m_end + 1;
78         }
79
80         Register* highAddress() const
81         {
82             return reinterpret_cast_ptr<Register*>(static_cast<char*>(m_reservation.base()) + m_reservation.size());
83         }
84
85         inline Register* topOfFrameFor(CallFrame*);
86
87         Register* reservationTop() const
88         {
89             char* reservationTop = static_cast<char*>(m_reservation.base());
90             return reinterpret_cast_ptr<Register*>(reservationTop);
91         }
92
93         bool grow(Register* newTopOfStack);
94         void shrink(Register* newTopOfStack);
95         void releaseExcessCapacity();
96         void addToCommittedByteCount(long);
97
98         void setCLoopStackLimit(Register* newTopOfStack);
99
100         VM& m_vm;
101         CallFrame*& m_topCallFrame;
102         Register* m_end;
103         Register* m_commitTop;
104         PageReservation m_reservation;
105         Register* m_lastStackTop;
106         ptrdiff_t m_softReservedZoneSizeInRegisters;
107
108         friend class LLIntOffsetsExtractor;
109     };
110
111 } // namespace JSC
112
113 #endif // !ENABLE(JIT)