JavaScriptCore:
[WebKit-https.git] / JavaScriptCore / kjs / MarkStack.h
1 // -*- mode: c++; c-basic-offset: 4 -*-
2 /*
3  *  Copyright (C) 2007 Apple Inc. All rights reserved.
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Library General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Library General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Library General Public License
16  *  along with this library; see the file COPYING.LIB.  If not, write to
17  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  *  Boston, MA 02110-1301, USA.
19  *
20  */
21
22 #ifndef MarkStack_h
23 #define MarkStack_h
24
25 #include <wtf/Vector.h>
26 #include "collector.h"
27 #include "value.h"
28 #include <stdio.h>
29
30 namespace KJS {
31
32     class MarkStack {
33     public:
34         void push(JSValue* value)
35         {
36             if (value->marked())
37                 return;
38             JSCell* cell = value->asCell();
39             Collector::markCell(cell);
40             if (!Collector::cellMayHaveRefs(cell))
41                 return;
42             ASSERT(m_stack.size() < m_stack.capacity());
43             m_stack.uncheckedAppend(cell);
44         }
45
46         void push(JSCell* cell)
47         {
48             if (cell->marked())
49                 return;
50             Collector::markCell(cell);
51             if (!Collector::cellMayHaveRefs(cell))
52                 return;
53             ASSERT(m_stack.size() < m_stack.capacity());
54             m_stack.uncheckedAppend(cell);
55         }
56
57         void pushAtom(JSValue* value)
58         {
59             if (value->marked())
60                 return;
61             JSCell* cell = value->asCell();
62             Collector::markCell(cell);
63         }
64
65         void pushAtom(JSCell* cell)
66         {
67             if (cell->marked())
68                 return;
69             Collector::markCell(cell);
70         }
71
72         JSCell* pop()
73         {
74             ASSERT(m_stack.size() > 0);
75             JSCell* cell = m_stack.last();
76             m_stack.removeLast();
77             return cell;
78         }
79
80         bool isEmpty()
81         {
82             return m_stack.isEmpty();
83         }
84
85         void reserveCapacity(size_t size) 
86         {
87             m_stack.reserveCapacity(size);
88         }
89
90     private:
91         Vector<JSCell*> m_stack;
92     };
93
94 }
95
96 #endif // MarkStack_h