⛏️ index : haiku.git

/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Copyright 2013-2014, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */


#include "UserBreakpoint.h"

#include "Function.h"
#include "FunctionID.h"
#include "LocatableFile.h"


// #pragma mark - UserBreakpointLocation


UserBreakpointLocation::UserBreakpointLocation(FunctionID* functionID,
	LocatableFile* sourceFile, const SourceLocation& sourceLocation,
	target_addr_t relativeAddress)
	:
	fFunctionID(functionID),
	fSourceFile(sourceFile),
	fSourceLocation(sourceLocation),
	fRelativeAddress(relativeAddress)
{
	fFunctionID->AcquireReference();
	if (fSourceFile != NULL)
		fSourceFile->AcquireReference();
}


UserBreakpointLocation::UserBreakpointLocation(
	const UserBreakpointLocation& other)
	:
	fFunctionID(other.fFunctionID),
	fSourceFile(other.fSourceFile),
	fSourceLocation(other.fSourceLocation),
	fRelativeAddress(other.fRelativeAddress)
{
	fFunctionID->AcquireReference();
	if (fSourceFile != NULL)
		fSourceFile->AcquireReference();
}


UserBreakpointLocation::~UserBreakpointLocation()
{
	fFunctionID->ReleaseReference();
	if (fSourceFile != NULL)
		fSourceFile->ReleaseReference();
}


UserBreakpointLocation&
UserBreakpointLocation::operator=(
	const UserBreakpointLocation& other)
{
	other.fFunctionID->AcquireReference();
	if (other.fSourceFile != NULL)
		other.fSourceFile->AcquireReference();

	fFunctionID->ReleaseReference();
	if (fSourceFile != NULL)
		fSourceFile->ReleaseReference();

	fFunctionID = other.fFunctionID;
	fSourceFile = other.fSourceFile;
	fSourceLocation = other.fSourceLocation;
	fRelativeAddress = other.fRelativeAddress;

	return *this;
}


// #pragma mark - UserBreakpointInstance


UserBreakpointInstance::UserBreakpointInstance(UserBreakpoint* userBreakpoint,
	target_addr_t address)
	:
	fAddress(address),
	fUserBreakpoint(userBreakpoint),
	fBreakpoint(NULL)
{
}


void
UserBreakpointInstance::SetBreakpoint(Breakpoint* breakpoint)
{
	fBreakpoint = breakpoint;
}


// #pragma mark - UserBreakpoint


UserBreakpoint::UserBreakpoint(const UserBreakpointLocation& location)
	:
	fLocation(location),
	fValid(false),
	fEnabled(false),
	fHidden(false),
	fConditionExpression()
{
}


UserBreakpoint::~UserBreakpoint()
{
	for (int32 i = 0; UserBreakpointInstance* instance = fInstances.ItemAt(i);
			i++) {
		delete instance;
	}
}


int32
UserBreakpoint::CountInstances() const
{
	return fInstances.CountItems();
}


UserBreakpointInstance*
UserBreakpoint::InstanceAt(int32 index) const
{
	return fInstances.ItemAt(index);
}


bool
UserBreakpoint::AddInstance(UserBreakpointInstance* instance)
{
	return fInstances.AddItem(instance);
}


void
UserBreakpoint::RemoveInstance(UserBreakpointInstance* instance)
{
	fInstances.RemoveItem(instance);
}


UserBreakpointInstance*
UserBreakpoint::RemoveInstanceAt(int32 index)
{
	return fInstances.RemoveItemAt(index);
}


void
UserBreakpoint::SetValid(bool valid)
{
	fValid = valid;
}


void
UserBreakpoint::SetEnabled(bool enabled)
{
	fEnabled = enabled;
}


void
UserBreakpoint::SetHidden(bool hidden)
{
	fHidden = hidden;
}


void
UserBreakpoint::SetCondition(const BString& conditionExpression)
{
	fConditionExpression = conditionExpression;
}