JITStubRoutineSet.h [plain text]
#pragma once
#include "JITStubRoutine.h"
#include <wtf/FastMalloc.h>
#include <wtf/HashMap.h>
#include <wtf/Range.h>
#include <wtf/Vector.h>
using WTF::Range;
namespace JSC {
class GCAwareJITStubRoutine;
class SlotVisitor;
#if ENABLE(JIT)
class JITStubRoutineSet {
WTF_MAKE_NONCOPYABLE(JITStubRoutineSet);
WTF_MAKE_FAST_ALLOCATED;
public:
JITStubRoutineSet();
~JITStubRoutineSet();
void add(GCAwareJITStubRoutine*);
void clearMarks();
void mark(void* candidateAddress)
{
uintptr_t address = removeCodePtrTag<uintptr_t>(candidateAddress);
if (!m_range.contains(address))
return;
markSlow(address);
}
void prepareForConservativeScan();
void deleteUnmarkedJettisonedStubRoutines();
void traceMarkedStubRoutines(SlotVisitor&);
private:
void markSlow(uintptr_t address);
struct Routine {
uintptr_t startAddress;
GCAwareJITStubRoutine* routine;
};
Vector<Routine> m_routines;
Range<uintptr_t> m_range { 0, 0 };
};
#else // !ENABLE(JIT)
class JITStubRoutineSet {
WTF_MAKE_NONCOPYABLE(JITStubRoutineSet);
WTF_MAKE_FAST_ALLOCATED;
public:
JITStubRoutineSet() { }
~JITStubRoutineSet() { }
void add(GCAwareJITStubRoutine*) { }
void clearMarks() { }
void mark(void*) { }
void prepareForConservativeScan() { }
void deleteUnmarkedJettisonedStubRoutines() { }
void traceMarkedStubRoutines(SlotVisitor&) { }
};
#endif // !ENABLE(JIT)
}