void MarkedArgumentBuffer::slowAppend(JSValue v) { int newCapacity = m_capacity * 4; EncodedJSValue* newBuffer = new EncodedJSValue[newCapacity]; for (int i = 0; i < m_capacity; ++i) newBuffer[i] = m_buffer[i]; if (EncodedJSValue* base = mallocBase()) delete [] base; m_buffer = newBuffer; m_capacity = newCapacity; slotFor(m_size) = JSValue::encode(v); ++m_size; if (m_markSet) return; // As long as our size stays within our Vector's inline // capacity, all our values are allocated on the stack, and // therefore don't need explicit marking. Once our size exceeds // our Vector's inline capacity, though, our values move to the // heap, where they do need explicit marking. for (int i = 0; i < m_size; ++i) { Heap* heap = Heap::heap(JSValue::decode(slotFor(i))); if (!heap) continue; m_markSet = &heap->markListSet(); m_markSet->add(this); break; } }
void MarkedArgumentBuffer::slowAppend(JSValue v) { int newCapacity = (Checked<int>(m_capacity) * 2).unsafeGet(); size_t size = (Checked<size_t>(newCapacity) * sizeof(EncodedJSValue)).unsafeGet(); EncodedJSValue* newBuffer = static_cast<EncodedJSValue*>(fastMalloc(size)); for (int i = 0; i < m_capacity; ++i) newBuffer[i] = m_buffer[i]; if (EncodedJSValue* base = mallocBase()) fastFree(base); m_buffer = newBuffer; m_capacity = newCapacity; slotFor(m_size) = JSValue::encode(v); ++m_size; if (m_markSet) return; // As long as our size stays within our Vector's inline // capacity, all our values are allocated on the stack, and // therefore don't need explicit marking. Once our size exceeds // our Vector's inline capacity, though, our values move to the // heap, where they do need explicit marking. for (int i = 0; i < m_size; ++i) { Heap* heap = Heap::heap(JSValue::decode(slotFor(i))); if (!heap) continue; m_markSet = &heap->markListSet(); m_markSet->add(this); break; } }