From feab8604c927c28a78fc1efb8a15328c5acb8371 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Tue, 28 Oct 2014 22:47:28 -0400 Subject: [PATCH] Debugger: Add job for expression evaluation. --- .../debugger/jobs/ExpressionEvaluationJob.cpp | 64 +++++++++++++++++++ src/apps/debugger/jobs/Jobs.h | 28 +++++++- 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/apps/debugger/jobs/ExpressionEvaluationJob.cpp diff --git a/src/apps/debugger/jobs/ExpressionEvaluationJob.cpp b/src/apps/debugger/jobs/ExpressionEvaluationJob.cpp new file mode 100644 index 0000000000..ea42f19a6c --- /dev/null +++ b/src/apps/debugger/jobs/ExpressionEvaluationJob.cpp @@ -0,0 +1,64 @@ +/* + * Copyright 2014, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ + +#include "Jobs.h" + +#include + +#include + +#include "SourceLanguage.h" +#include "StackFrame.h" +#include "Team.h" +#include "Value.h" + + +ExpressionEvaluationJob::ExpressionEvaluationJob(Team* team, + SourceLanguage* language, const char* expression, type_code resultType, + StackFrame* frame) + : + fKey(expression, JOB_TYPE_EVALUATE_EXPRESSION), + fTeam(team), + fLanguage(language), + fExpression(expression), + fResultType(resultType), + fFrame(frame) +{ + fLanguage->AcquireReference(); + if (fFrame != NULL) + fFrame->AcquireReference(); +} + + +ExpressionEvaluationJob::~ExpressionEvaluationJob() +{ + fLanguage->ReleaseReference(); + if (fFrame != NULL) + fFrame->ReleaseReference(); +} + + +const JobKey& +ExpressionEvaluationJob::Key() const +{ + return fKey; +} + + +status_t +ExpressionEvaluationJob::Do() +{ + Value* value = NULL; + status_t result = fLanguage->EvaluateExpression(fExpression, fResultType, + value); + BReference reference; + if (value != NULL) + reference.SetTo(value, true); + + AutoLocker teamLocker(fTeam); + fTeam->NotifyExpressionEvaluated(fExpression.String(), result, value); + + return B_OK; +} diff --git a/src/apps/debugger/jobs/Jobs.h b/src/apps/debugger/jobs/Jobs.h index bc5df71558..7a01f870e0 100644 --- a/src/apps/debugger/jobs/Jobs.h +++ b/src/apps/debugger/jobs/Jobs.h @@ -6,6 +6,7 @@ #ifndef JOBS_H #define JOBS_H +#include #include "ImageDebugInfoLoadingState.h" #include "ImageDebugInfoProvider.h" @@ -20,6 +21,7 @@ class DebuggerInterface; class Function; class FunctionInstance; class Image; +class SourceLanguage; class StackFrame; class StackFrameValues; class Team; @@ -29,6 +31,7 @@ class TeamTypeInformation; class Thread; class Type; class TypeComponentPath; +class Value; class ValueLocation; class ValueNode; class ValueNodeChild; @@ -45,7 +48,8 @@ enum { JOB_TYPE_LOAD_SOURCE_CODE, JOB_TYPE_GET_STACK_FRAME_VALUE, JOB_TYPE_RESOLVE_VALUE_NODE_VALUE, - JOB_TYPE_GET_MEMORY_BLOCK + JOB_TYPE_GET_MEMORY_BLOCK, + JOB_TYPE_EVALUATE_EXPRESSION }; @@ -226,4 +230,26 @@ private: }; +class ExpressionEvaluationJob : public Job { +public: + ExpressionEvaluationJob(Team* team, + SourceLanguage* language, + const char* expression, + type_code resultType, + StackFrame* frame); + virtual ~ExpressionEvaluationJob(); + + virtual const JobKey& Key() const; + virtual status_t Do(); + +private: + SimpleJobKey fKey; + Team* fTeam; + SourceLanguage* fLanguage; + BString fExpression; + type_code fResultType; + StackFrame* fFrame; +}; + + #endif // JOBS_H