Debugger: Use async request in expression window.

- ExpressionEvaluationWindow now uses the aforementioned
  request interface to ask the debugger core to perform evaluation
  on its behalf, rather than doing so itself directly.

The remaining users of the expression evaluator will be adjusted in
following commits.
This commit is contained in:
Rene Gollent
2014-10-28 23:30:02 -04:00
parent 2d5794a1a3
commit d1ae01d79b
3 changed files with 80 additions and 23 deletions
@@ -12,6 +12,8 @@
#include <StringView.h> #include <StringView.h>
#include <TextControl.h> #include <TextControl.h>
#include "AutoLocker.h"
#include "MessageCodes.h" #include "MessageCodes.h"
#include "SourceLanguage.h" #include "SourceLanguage.h"
#include "UserInterface.h" #include "UserInterface.h"
@@ -19,36 +21,44 @@
enum { enum {
MSG_CHANGE_EVALUATION_TYPE = 'chet' MSG_CHANGE_EVALUATION_TYPE = 'chet',
MSG_EXPRESSION_EVALUATED = 'exev'
}; };
ExpressionEvaluationWindow::ExpressionEvaluationWindow( ExpressionEvaluationWindow::ExpressionEvaluationWindow(
SourceLanguage* language, UserInterfaceListener* listener, ::Team* team, SourceLanguage* language, UserInterfaceListener* listener,
BHandler* target) BHandler* target)
: :
BWindow(BRect(), "Evaluate Expression", B_FLOATING_WINDOW, BWindow(BRect(), "Evaluate Expression", B_FLOATING_WINDOW,
B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE), B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE),
fTeam(team),
fLanguage(language), fLanguage(language),
fListener(listener), fListener(listener),
fCloseTarget(target), fCloseTarget(target),
fCurrentEvaluationType(B_INT64_TYPE) fCurrentEvaluationType(B_INT64_TYPE)
{ {
fLanguage->AcquireReference(); fLanguage->AcquireReference();
AutoLocker< ::Team> teamLocker(fTeam);
fTeam->AddListener(this);
} }
ExpressionEvaluationWindow::~ExpressionEvaluationWindow() ExpressionEvaluationWindow::~ExpressionEvaluationWindow()
{ {
fLanguage->ReleaseReference(); fLanguage->ReleaseReference();
AutoLocker< ::Team> teamLocker(fTeam);
fTeam->RemoveListener(this);
} }
ExpressionEvaluationWindow* ExpressionEvaluationWindow*
ExpressionEvaluationWindow::Create(SourceLanguage* language, ExpressionEvaluationWindow::Create(::Team* team, SourceLanguage* language,
UserInterfaceListener* listener, BHandler* target) UserInterfaceListener* listener, BHandler* target)
{ {
ExpressionEvaluationWindow* self = new ExpressionEvaluationWindow( ExpressionEvaluationWindow* self = new ExpressionEvaluationWindow(team,
language, listener, target); language, listener, target);
try { try {
@@ -149,6 +159,26 @@ ExpressionEvaluationWindow::_BuildTypesMenu()
} }
void
ExpressionEvaluationWindow::ExpressionEvaluated(
const Team::ExpressionEvaluationEvent& event)
{
BMessage message(MSG_EXPRESSION_EVALUATED);
message.AddString("expression", event.GetExpression());
message.AddInt32("result", event.GetResult());
BReference<Value> reference;
Value* value = event.GetValue();
if (value != NULL) {
message.AddPointer("value", value);
reference.SetTo(value);
}
if (PostMessage(&message) == B_OK)
reference.Detach();
}
void void
ExpressionEvaluationWindow::Show() ExpressionEvaluationWindow::Show()
{ {
@@ -176,22 +206,8 @@ ExpressionEvaluationWindow::MessageReceived(BMessage* message)
if (fExpressionInput->TextView()->TextLength() == 0) if (fExpressionInput->TextView()->TextLength() == 0)
break; break;
Value* value = NULL; fListener->ExpressionEvaluationRequested(fLanguage,
BString outputText; fExpressionInput->TextView()->Text(), fCurrentEvaluationType);
status_t error = fLanguage->EvaluateExpression(
fExpressionInput->TextView()->Text(), fCurrentEvaluationType,
value);
if (error != B_OK) {
if (value != NULL)
value->ToString(outputText);
else {
outputText.SetToFormat("Failed to evaluate expression: %s",
strerror(error));
}
} else
value->ToString(outputText);
fExpressionOutput->SetText(outputText);
break; break;
} }
@@ -201,6 +217,39 @@ ExpressionEvaluationWindow::MessageReceived(BMessage* message)
break; break;
} }
case MSG_EXPRESSION_EVALUATED:
{
BString expression;
if (message->FindString("expression", &expression) != B_OK)
break;
if (expression != fExpressionInput->TextView()->Text())
break;
Value* value = NULL;
BReference<Value> reference;
if (message->FindPointer("value",
reinterpret_cast<void**>(&value)) == B_OK) {
reference.SetTo(value, true);
}
BString outputText;
if (value != NULL)
value->ToString(outputText);
else {
status_t result;
if (message->FindInt32("result", &result) != B_OK)
result = B_ERROR;
outputText.SetToFormat("Failed to evaluate expression: %s",
strerror(result));
}
fExpressionOutput->SetText(outputText);
break;
}
default: default:
BWindow::MessageReceived(message); BWindow::MessageReceived(message);
break; break;
@@ -8,21 +8,23 @@
#include <Window.h> #include <Window.h>
#include "Team.h"
#include "types/Types.h" #include "types/Types.h"
class BMenu; class BMenu;
class BButton; class BButton;
class BStringView; class BStringView;
class BTextControl; class BTextControl;
class Team;
class SourceLanguage; class SourceLanguage;
class UserInterfaceListener; class UserInterfaceListener;
class ExpressionEvaluationWindow : public BWindow class ExpressionEvaluationWindow : public BWindow, private Team::Listener
{ {
public: public:
ExpressionEvaluationWindow( ExpressionEvaluationWindow(
::Team* team,
SourceLanguage* language, SourceLanguage* language,
UserInterfaceListener* listener, UserInterfaceListener* listener,
BHandler* target); BHandler* target);
@@ -30,6 +32,7 @@ public:
~ExpressionEvaluationWindow(); ~ExpressionEvaluationWindow();
static ExpressionEvaluationWindow* Create( static ExpressionEvaluationWindow* Create(
::Team* team,
SourceLanguage* language, SourceLanguage* language,
UserInterfaceListener* listener, UserInterfaceListener* listener,
BHandler* target); BHandler* target);
@@ -45,8 +48,13 @@ private:
void _Init(); void _Init();
BMenu* _BuildTypesMenu(); BMenu* _BuildTypesMenu();
// Team::Listener
virtual void ExpressionEvaluated(
const Team::ExpressionEvaluationEvent&
event);
private: private:
::Team* fTeam;
SourceLanguage* fLanguage; SourceLanguage* fLanguage;
BTextControl* fExpressionInput; BTextControl* fExpressionInput;
BStringView* fExpressionOutput; BStringView* fExpressionOutput;
@@ -356,7 +356,7 @@ TeamWindow::MessageReceived(BMessage* message)
BReference<SourceLanguage> languageReference(language, BReference<SourceLanguage> languageReference(language,
true); true);
fExpressionWindow = ExpressionEvaluationWindow::Create( fExpressionWindow = ExpressionEvaluationWindow::Create(
language, fListener, this); fTeam, language, fListener, this);
if (fExpressionWindow != NULL) if (fExpressionWindow != NULL)
fExpressionWindow->Show(); fExpressionWindow->Show();
} catch (...) { } catch (...) {