From d1ae01d79bdc373430525116dffe171b000fcc6d Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Tue, 28 Oct 2014 23:18:42 -0400 Subject: [PATCH] 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. --- .../ExpressionEvaluationWindow.cpp | 89 ++++++++++++++----- .../team_window/ExpressionEvaluationWindow.h | 12 ++- .../gui/team_window/TeamWindow.cpp | 2 +- 3 files changed, 80 insertions(+), 23 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp index a17cfc4e75..446d68ca72 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.cpp @@ -12,6 +12,8 @@ #include #include +#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 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 reference; + if (message->FindPointer("value", + reinterpret_cast(&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; diff --git a/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.h b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.h index 74c6e822e5..4740132537 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.h +++ b/src/apps/debugger/user_interface/gui/team_window/ExpressionEvaluationWindow.h @@ -8,21 +8,23 @@ #include +#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; diff --git a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp index 47ea50030c..1eda3b8040 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp @@ -356,7 +356,7 @@ TeamWindow::MessageReceived(BMessage* message) BReference languageReference(language, true); fExpressionWindow = ExpressionEvaluationWindow::Create( - language, fListener, this); + fTeam, language, fListener, this); if (fExpressionWindow != NULL) fExpressionWindow->Show(); } catch (...) {