File 07-Fixed-a-dangling-pointer-deletion-when-moving-PopupMenu-submenus.patch of Package juce
From baebb9d1b5d9f8114ec59b8e1e4eca69ad8f4a8e Mon Sep 17 00:00:00 2001
From: ed <eddavies95@gmail.com>
Date: Thu, 20 Feb 2020 11:59:46 +0000
Subject: [PATCH] Fixed a dangling pointer deletion when moving PopupMenu
submenus
---
.../juce_gui_basics/menus/juce_PopupMenu.cpp | 24 ++++++++-----------
.../juce_gui_basics/menus/juce_PopupMenu.h | 4 ++--
2 files changed, 12 insertions(+), 16 deletions(-)
diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp
index 3e2731791b5..89b822c0638 100644
--- a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp
+++ b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp
@@ -220,9 +220,9 @@ struct MenuWindow : public Component
setOpaque (lf.findColour (PopupMenu::backgroundColourId).isOpaque()
|| ! Desktop::canUseSemiTransparentWindows());
- for (size_t i = 0; i < menu.items.size(); ++i)
+ for (int i = 0; i < menu.items.size(); ++i)
{
- auto& item = menu.items[i];
+ auto& item = menu.items.getReference (i);
if (i + 1 < menu.items.size() || ! item.isSeparator)
items.add (new ItemComponent (item, options.getStandardItemHeight(), *this));
@@ -1282,10 +1282,6 @@ void PopupMenu::HelperClasses::NormalComponentWrapper::getIdealSize (int& idealW
}
//==============================================================================
-PopupMenu::PopupMenu()
-{
-}
-
PopupMenu::PopupMenu (const PopupMenu& other)
: items (other.items),
lookAndFeel (other.lookAndFeel)
@@ -1459,7 +1455,7 @@ void PopupMenu::addItem (Item newItem)
|| newItem.isSeparator || newItem.isSectionHeader
|| newItem.subMenu != nullptr);
- items.push_back (std::move (newItem));
+ items.add (std::move (newItem));
}
void PopupMenu::addItem (String itemText, std::function<void()> action)
@@ -1608,7 +1604,7 @@ void PopupMenu::addSubMenu (String subMenuName, PopupMenu subMenu, bool isActive
void PopupMenu::addSeparator()
{
- if (items.size() > 0 && ! items.back().isSeparator)
+ if (items.size() > 0 && ! items.getLast().isSeparator)
{
Item i;
i.isSeparator = true;
@@ -1713,11 +1709,11 @@ PopupMenu::Options PopupMenu::Options::withPreferredPopupDirection (PopupDirecti
Component* PopupMenu::createWindow (const Options& options,
ApplicationCommandManager** managerOfChosenCommand) const
{
- return items.empty() ? nullptr
- : new HelperClasses::MenuWindow (*this, nullptr, options,
- ! options.getTargetScreenArea().isEmpty(),
- ModifierKeys::currentModifiers.isAnyMouseButtonDown(),
- managerOfChosenCommand);
+ return items.isEmpty() ? nullptr
+ : new HelperClasses::MenuWindow (*this, nullptr, options,
+ ! options.getTargetScreenArea().isEmpty(),
+ ModifierKeys::currentModifiers.isAnyMouseButtonDown(),
+ managerOfChosenCommand);
}
//==============================================================================
@@ -1985,7 +1981,7 @@ bool PopupMenu::MenuItemIterator::next()
if (index.size() == 0 || menus.getLast()->items.size() == 0)
return false;
- currentItem = const_cast<PopupMenu::Item*> (&(menus.getLast()->items[(size_t) index.getLast()]));
+ currentItem = const_cast<PopupMenu::Item*> (&(menus.getLast()->items.getReference (index.getLast())));
if (searchRecursively && currentItem->subMenu != nullptr)
{
diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.h b/modules/juce_gui_basics/menus/juce_PopupMenu.h
index 60bedebfb74..360488f4c4f 100644
--- a/modules/juce_gui_basics/menus/juce_PopupMenu.h
+++ b/modules/juce_gui_basics/menus/juce_PopupMenu.h
@@ -82,7 +82,7 @@ class JUCE_API PopupMenu
public:
//==============================================================================
/** Creates an empty popup menu. */
- PopupMenu();
+ PopupMenu() = default;
/** Creates a copy of another menu. */
PopupMenu (const PopupMenu&);
@@ -820,7 +820,7 @@ class JUCE_API PopupMenu
friend struct HelperClasses;
friend class MenuBarComponent;
- std::vector<Item> items;
+ Array<Item> items;
WeakReference<LookAndFeel> lookAndFeel;
Component* createWindow (const Options&, ApplicationCommandManager**) const;