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:
@@ -12,6 +12,8 @@
|
||||
#include <StringView.h>
|
||||
#include <TextControl.h>
|
||||
|
||||
#include "AutoLocker.h"
|
||||
|
||||
#include "MessageCodes.h"
|
||||
#include "SourceLanguage.h"
|
||||
#include "UserInterface.h"
|
||||
@@ -19,36 +21,44 @@
|
||||
|
||||
|
||||
enum {
|
||||
MSG_CHANGE_EVALUATION_TYPE = 'chet'
|
||||
MSG_CHANGE_EVALUATION_TYPE = 'chet',
|
||||
MSG_EXPRESSION_EVALUATED = 'exev'
|
||||
};
|
||||
|
||||
|
||||
ExpressionEvaluationWindow::ExpressionEvaluationWindow(
|
||||
SourceLanguage* language, UserInterfaceListener* listener,
|
||||
::Team* team, SourceLanguage* language, UserInterfaceListener* listener,
|
||||
BHandler* target)
|
||||
:
|
||||
BWindow(BRect(), "Evaluate Expression", B_FLOATING_WINDOW,
|
||||
B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE),
|
||||
fTeam(team),
|
||||
fLanguage(language),
|
||||
fListener(listener),
|
||||
fCloseTarget(target),
|
||||
fCurrentEvaluationType(B_INT64_TYPE)
|
||||
{
|
||||
fLanguage->AcquireReference();
|
||||
|
||||
AutoLocker< ::Team> teamLocker(fTeam);
|
||||
fTeam->AddListener(this);
|
||||
}
|
||||
|
||||
|
||||
ExpressionEvaluationWindow::~ExpressionEvaluationWindow()
|
||||
{
|
||||
fLanguage->ReleaseReference();
|
||||
|
||||
AutoLocker< ::Team> teamLocker(fTeam);
|
||||
fTeam->RemoveListener(this);
|
||||
}
|
||||
|
||||
|
||||
ExpressionEvaluationWindow*
|
||||
ExpressionEvaluationWindow::Create(SourceLanguage* language,
|
||||
ExpressionEvaluationWindow::Create(::Team* team, SourceLanguage* language,
|
||||
UserInterfaceListener* listener, BHandler* target)
|
||||
{
|
||||
ExpressionEvaluationWindow* self = new ExpressionEvaluationWindow(
|
||||
ExpressionEvaluationWindow* self = new ExpressionEvaluationWindow(team,
|
||||
language, listener, target);
|
||||
|
||||
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
|
||||
ExpressionEvaluationWindow::Show()
|
||||
{
|
||||
@@ -176,22 +206,8 @@ ExpressionEvaluationWindow::MessageReceived(BMessage* message)
|
||||
if (fExpressionInput->TextView()->TextLength() == 0)
|
||||
break;
|
||||
|
||||
Value* value = NULL;
|
||||
BString outputText;
|
||||
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);
|
||||
fListener->ExpressionEvaluationRequested(fLanguage,
|
||||
fExpressionInput->TextView()->Text(), fCurrentEvaluationType);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -201,6 +217,39 @@ ExpressionEvaluationWindow::MessageReceived(BMessage* message)
|
||||
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:
|
||||
BWindow::MessageReceived(message);
|
||||
break;
|
||||
|
||||
@@ -8,21 +8,23 @@
|
||||
|
||||
#include <Window.h>
|
||||
|
||||
#include "Team.h"
|
||||
#include "types/Types.h"
|
||||
|
||||
|
||||
class BMenu;
|
||||
class BButton;
|
||||
class BStringView;
|
||||
class BTextControl;
|
||||
class Team;
|
||||
class SourceLanguage;
|
||||
class UserInterfaceListener;
|
||||
|
||||
|
||||
class ExpressionEvaluationWindow : public BWindow
|
||||
class ExpressionEvaluationWindow : public BWindow, private Team::Listener
|
||||
{
|
||||
public:
|
||||
ExpressionEvaluationWindow(
|
||||
::Team* team,
|
||||
SourceLanguage* language,
|
||||
UserInterfaceListener* listener,
|
||||
BHandler* target);
|
||||
@@ -30,6 +32,7 @@ public:
|
||||
~ExpressionEvaluationWindow();
|
||||
|
||||
static ExpressionEvaluationWindow* Create(
|
||||
::Team* team,
|
||||
SourceLanguage* language,
|
||||
UserInterfaceListener* listener,
|
||||
BHandler* target);
|
||||
@@ -45,8 +48,13 @@ private:
|
||||
void _Init();
|
||||
BMenu* _BuildTypesMenu();
|
||||
|
||||
// Team::Listener
|
||||
virtual void ExpressionEvaluated(
|
||||
const Team::ExpressionEvaluationEvent&
|
||||
event);
|
||||
|
||||
private:
|
||||
::Team* fTeam;
|
||||
SourceLanguage* fLanguage;
|
||||
BTextControl* fExpressionInput;
|
||||
BStringView* fExpressionOutput;
|
||||
|
||||
@@ -356,7 +356,7 @@ TeamWindow::MessageReceived(BMessage* message)
|
||||
BReference<SourceLanguage> languageReference(language,
|
||||
true);
|
||||
fExpressionWindow = ExpressionEvaluationWindow::Create(
|
||||
language, fListener, this);
|
||||
fTeam, language, fListener, this);
|
||||
if (fExpressionWindow != NULL)
|
||||
fExpressionWindow->Show();
|
||||
} catch (...) {
|
||||
|
||||
Reference in New Issue
Block a user