]> git.saurik.com Git - apple/javascriptcore.git/blame - runtime/ArgList.h
JavaScriptCore-1218.33.tar.gz
[apple/javascriptcore.git] / runtime / ArgList.h
CommitLineData
9dae56ea
A
1/*
2 * Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
f9bf01c6 3 * Copyright (C) 2003, 2007, 2008, 2009 Apple Inc. All rights reserved.
9dae56ea
A
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 ArgList_h
23#define ArgList_h
24
14957cd0 25#include "CallFrame.h"
9dae56ea 26#include "Register.h"
9dae56ea 27#include <wtf/HashSet.h>
9dae56ea
A
28#include <wtf/Vector.h>
29
30namespace JSC {
f9bf01c6 31
93a37866
A
32class SlotVisitor;
33
34class MarkedArgumentBuffer {
35 WTF_MAKE_NONCOPYABLE(MarkedArgumentBuffer);
36 friend class VM;
37 friend class ArgList;
38
39private:
40 static const size_t inlineCapacity = 8;
41 typedef HashSet<MarkedArgumentBuffer*> ListSet;
42
43public:
44 // Constructor for a read-write list, to which you may append values.
45 // FIXME: Remove all clients of this API, then remove this API.
46 MarkedArgumentBuffer()
47 : m_size(0)
48 , m_capacity(inlineCapacity)
49 , m_buffer(&m_inlineBuffer[m_capacity - 1])
50 , m_markSet(0)
51 {
52 }
53
54 ~MarkedArgumentBuffer()
55 {
56 if (m_markSet)
57 m_markSet->remove(this);
58
59 if (EncodedJSValue* base = mallocBase())
60 delete [] base;
61 }
62
63 size_t size() const { return m_size; }
64 bool isEmpty() const { return !m_size; }
65
66 JSValue at(int i) const
67 {
68 if (i >= m_size)
69 return jsUndefined();
70
71 return JSValue::decode(slotFor(i));
72 }
73
74 void clear()
75 {
76 m_size = 0;
77 }
78
79 void append(JSValue v)
80 {
81 if (m_size >= m_capacity)
82 return slowAppend(v);
83
84 slotFor(m_size) = JSValue::encode(v);
85 ++m_size;
86 }
87
88 void removeLast()
89 {
90 ASSERT(m_size);
91 m_size--;
92 }
93
94 JSValue last()
95 {
96 ASSERT(m_size);
97 return JSValue::decode(slotFor(m_size - 1));
98 }
ba379fdc 99
93a37866 100 static void markLists(HeapRootVisitor&, ListSet&);
9dae56ea 101
93a37866
A
102private:
103 JS_EXPORT_PRIVATE void slowAppend(JSValue);
9dae56ea 104
93a37866
A
105 EncodedJSValue& slotFor(int item) const
106 {
107 return m_buffer[-item];
108 }
6fe7ccc8 109
93a37866
A
110 EncodedJSValue* mallocBase()
111 {
112 if (m_capacity == static_cast<int>(inlineCapacity))
113 return 0;
114 return &slotFor(m_capacity - 1);
115 }
6fe7ccc8 116
93a37866
A
117 int m_size;
118 int m_capacity;
119 EncodedJSValue m_inlineBuffer[inlineCapacity];
120 EncodedJSValue* m_buffer;
121 ListSet* m_markSet;
122
123private:
124 // Prohibits new / delete, which would break GC.
125 void* operator new(size_t size)
126 {
127 return fastMalloc(size);
128 }
129 void operator delete(void* p)
130 {
131 fastFree(p);
132 }
133
134 void* operator new[](size_t);
135 void operator delete[](void*);
136
137 void* operator new(size_t, void*);
138 void operator delete(void*, size_t);
139};
140
141class ArgList {
142 friend class JIT;
143public:
144 ArgList()
145 : m_args(0)
146 , m_argCount(0)
147 {
148 }
149
150 ArgList(ExecState* exec)
151 : m_args(reinterpret_cast<JSValue*>(&exec[CallFrame::argumentOffset(0)]))
152 , m_argCount(exec->argumentCount())
153 {
154 }
155
156 ArgList(const MarkedArgumentBuffer& args)
157 : m_args(reinterpret_cast<JSValue*>(args.m_buffer))
158 , m_argCount(args.size())
159 {
160 }
161
162 JSValue at(int i) const
163 {
164 if (i >= m_argCount)
165 return jsUndefined();
166 return m_args[-i];
167 }
168
169 bool isEmpty() const { return !m_argCount; }
170 size_t size() const { return m_argCount; }
ba379fdc 171
93a37866 172 JS_EXPORT_PRIVATE void getSlice(int startIndex, ArgList& result) const;
ba379fdc 173
93a37866
A
174private:
175 JSValue* m_args;
176 int m_argCount;
177};
ba379fdc 178
9dae56ea
A
179} // namespace JSC
180
181#endif // ArgList_h