#pragma once
#include "DebuggerPrimitives.h"
#include <wtf/FastMalloc.h>
#include <wtf/Noncopyable.h>
#include <wtf/Ref.h>
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
#include <wtf/text/WTFString.h>
namespace JSC {
class Debugger;
class JSGlobalObject;
class Breakpoint : public RefCounted<Breakpoint> {
WTF_MAKE_NONCOPYABLE(Breakpoint);
WTF_MAKE_FAST_ALLOCATED;
public:
struct Action {
enum class Type : uint8_t {
Log,
Evaluate,
Sound,
Probe,
};
Action(Type);
Type type;
String data;
BreakpointActionID id { noBreakpointActionID };
};
using ActionsVector = Vector<Action>;
JS_EXPORT_PRIVATE static Ref<Breakpoint> create(BreakpointID, const String& condition = nullString(), ActionsVector&& = { }, bool autoContinue = false, size_t ignoreCount = 0);
BreakpointID id() const { return m_id; }
SourceID sourceID() const { return m_sourceID; }
unsigned lineNumber() const { return m_lineNumber; }
unsigned columnNumber() const { return m_columnNumber; }
const String& condition() const { return m_condition; }
const ActionsVector& actions() const { return m_actions; }
bool isAutoContinue() const { return m_autoContinue; }
void resetHitCount() { m_hitCount = 0; }
bool link(SourceID, unsigned lineNumber, unsigned columnNumber);
bool isLinked() const { return m_sourceID != noSourceID; }
bool resolve(unsigned lineNumber, unsigned columnNumber);
bool isResolved() const { return m_resolved; }
bool shouldPause(Debugger&, JSGlobalObject*);
private:
Breakpoint(BreakpointID, String condition = nullString(), ActionsVector&& = { }, bool autoContinue = false, size_t ignoreCount = 0);
BreakpointID m_id { noBreakpointID };
SourceID m_sourceID { noSourceID };
unsigned m_lineNumber { 0 };
unsigned m_columnNumber { 0 };
bool m_resolved { false };
String m_condition;
ActionsVector m_actions;
bool m_autoContinue { false };
size_t m_ignoreCount { 0 };
size_t m_hitCount { 0 };
};
using BreakpointsVector = Vector<Ref<JSC::Breakpoint>>;
}