]>
git.saurik.com Git - apple/javascriptcore.git/blob - runtime/ArgList.cpp
2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 Apple Inc. All rights reserved.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
24 #include "HeapRootVisitor.h"
25 #include "JSCJSValue.h"
27 #include "Operations.h"
33 void ArgList::getSlice(int startIndex
, ArgList
& result
) const
35 if (startIndex
<= 0 || startIndex
>= m_argCount
) {
40 result
.m_args
= m_args
- startIndex
;
41 result
.m_argCount
= m_argCount
- startIndex
;
44 void MarkedArgumentBuffer::markLists(HeapRootVisitor
& heapRootVisitor
, ListSet
& markSet
)
46 ListSet::iterator end
= markSet
.end();
47 for (ListSet::iterator it
= markSet
.begin(); it
!= end
; ++it
) {
48 MarkedArgumentBuffer
* list
= *it
;
49 for (int i
= 0; i
< list
->m_size
; ++i
)
50 heapRootVisitor
.visit(reinterpret_cast<JSValue
*>(&list
->slotFor(i
)));
54 void MarkedArgumentBuffer::slowAppend(JSValue v
)
56 int newCapacity
= m_capacity
* 4;
57 EncodedJSValue
* newBuffer
= &(new EncodedJSValue
[newCapacity
])[newCapacity
- 1];
58 for (int i
= 0; i
< m_capacity
; ++i
)
59 newBuffer
[-i
] = m_buffer
[-i
];
61 if (EncodedJSValue
* base
= mallocBase())
65 m_capacity
= newCapacity
;
67 slotFor(m_size
) = JSValue::encode(v
);
73 // As long as our size stays within our Vector's inline
74 // capacity, all our values are allocated on the stack, and
75 // therefore don't need explicit marking. Once our size exceeds
76 // our Vector's inline capacity, though, our values move to the
77 // heap, where they do need explicit marking.
78 for (int i
= 0; i
< m_size
; ++i
) {
79 Heap
* heap
= Heap::heap(JSValue::decode(slotFor(i
)));
83 m_markSet
= &heap
->markListSet();