mirror of
https://github.com/darlinghq/darling-JavaScriptCore.git
synced 2025-04-09 02:10:43 +00:00
111 lines
3.9 KiB
C++
111 lines
3.9 KiB
C++
/*
|
|
* Copyright (C) 2008-2017 Apple Inc. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of Apple Inc. ("Apple") nor the names of
|
|
* its contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
|
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#if ENABLE(C_LOOP)
|
|
|
|
#include "Register.h"
|
|
#include <wtf/Noncopyable.h>
|
|
#include <wtf/PageReservation.h>
|
|
|
|
namespace JSC {
|
|
|
|
class CodeBlockSet;
|
|
class ConservativeRoots;
|
|
class JITStubRoutineSet;
|
|
class VM;
|
|
class LLIntOffsetsExtractor;
|
|
|
|
class CLoopStack {
|
|
WTF_MAKE_NONCOPYABLE(CLoopStack);
|
|
public:
|
|
// Allow 8k of excess registers before we start trying to reap the stack
|
|
static constexpr ptrdiff_t maxExcessCapacity = 8 * 1024;
|
|
|
|
CLoopStack(VM&);
|
|
~CLoopStack();
|
|
|
|
bool ensureCapacityFor(Register* newTopOfStack);
|
|
|
|
bool containsAddress(Register* address) { return (lowAddress() <= address && address < highAddress()); }
|
|
static size_t committedByteCount();
|
|
|
|
void gatherConservativeRoots(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&);
|
|
void sanitizeStack();
|
|
|
|
inline void* currentStackPointer();
|
|
void setCurrentStackPointer(void* sp) { m_currentStackPointer = sp; }
|
|
|
|
size_t size() const { return highAddress() - lowAddress(); }
|
|
|
|
void setSoftReservedZoneSize(size_t);
|
|
bool isSafeToRecurse() const;
|
|
|
|
private:
|
|
Register* lowAddress() const
|
|
{
|
|
return m_end;
|
|
}
|
|
|
|
Register* highAddress() const
|
|
{
|
|
return reinterpret_cast_ptr<Register*>(static_cast<char*>(m_reservation.base()) + m_reservation.size());
|
|
}
|
|
|
|
Register* reservationTop() const
|
|
{
|
|
char* reservationTop = static_cast<char*>(m_reservation.base());
|
|
return reinterpret_cast_ptr<Register*>(reservationTop);
|
|
}
|
|
|
|
bool grow(Register* newTopOfStack);
|
|
void releaseExcessCapacity();
|
|
void addToCommittedByteCount(long);
|
|
|
|
void setCLoopStackLimit(Register* newTopOfStack);
|
|
|
|
VM& m_vm;
|
|
CallFrame*& m_topCallFrame;
|
|
|
|
// The following is always true:
|
|
// reservationTop() <= m_commitTop <= m_end <= m_currentStackPointer <= highAddress()
|
|
Register* m_end; // lowest address of JS allocatable stack memory.
|
|
Register* m_commitTop; // lowest address of committed memory.
|
|
PageReservation m_reservation;
|
|
void* m_lastStackPointer;
|
|
void* m_currentStackPointer;
|
|
ptrdiff_t m_softReservedZoneSizeInRegisters;
|
|
|
|
friend class LLIntOffsetsExtractor;
|
|
};
|
|
|
|
} // namespace JSC
|
|
|
|
#endif // ENABLE(C_LOOP)
|