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 <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 (...) {
|
||||||
|
|||||||
Reference in New Issue
Block a user