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 (...) {