From f0e4fe66ba05827f544d7f2f1dcb4c88088dc058 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 30 Nov 2013 10:51:28 -0500 Subject: [PATCH] AMTL updates and changes to adapt for them to fix menu crashes (bug 5921, r=psychonic). AMTL: Removes isVoid from AString. Fixes support inserting to Vector at length. --HG-- extra : rebase_source : 02805fad60c2b759a0e2e91c081144854a8e0b54 --- core/MenuStyle_Base.cpp | 10 +++++----- core/MenuStyle_Base.h | 17 ++++++++++++++--- core/logic/HandleSys.cpp | 16 +++++++--------- core/logic/HandleSys.h | 4 ++-- public/amtl/am-string.h | 14 +------------- public/amtl/am-utility.h | 4 ++-- public/amtl/am-vector.h | 15 ++++++++++++--- 7 files changed, 43 insertions(+), 37 deletions(-) diff --git a/core/MenuStyle_Base.cpp b/core/MenuStyle_Base.cpp index c6ea1934..cda17be8 100644 --- a/core/MenuStyle_Base.cpp +++ b/core/MenuStyle_Base.cpp @@ -636,10 +636,10 @@ bool CBaseMenu::AppendItem(const char *info, const ItemDrawInfo &draw) item.info = info; if (draw.display) - item.display = draw.display; + item.display = new ke::AString(draw.display); item.style = draw.style; - m_items.append(item); + m_items.append(ke::Move(item)); return true; } @@ -657,10 +657,10 @@ bool CBaseMenu::InsertItem(unsigned int position, const char *info, const ItemDr CItem item; item.info = info; if (draw.display) - item.display = draw.display; + item.display = new ke::AString(draw.display); item.style = draw.style; - m_items.insert(position, item); + m_items.insert(position, ke::Move(item)); return true; } @@ -685,7 +685,7 @@ const char *CBaseMenu::GetItemInfo(unsigned int position, ItemDrawInfo *draw/* = if (draw) { - draw->display = m_items[position].display.chars(); + draw->display = m_items[position].display->chars(); draw->style = m_items[position].style; } diff --git a/core/MenuStyle_Base.h b/core/MenuStyle_Base.h index 07e35cd3..78a98e54 100644 --- a/core/MenuStyle_Base.h +++ b/core/MenuStyle_Base.h @@ -45,8 +45,6 @@ class CItem public: CItem() { - info.setVoid(); - display.setVoid(); style = 0; access = 0; } @@ -57,11 +55,24 @@ public: style = other->style; access = other->access; } + CItem & operator =(ke::Moveable other) + { + info = ke::Move(other->info); + display = ke::Move(other->display); + style = other->style; + access = other->access; + return *this; + } + public: ke::AString info; - ke::AString display; + ke::AutoPtr display; unsigned int style; unsigned int access; + +private: + CItem(const CItem &other) KE_DELETE; + CItem &operator =(const CItem &other) KE_DELETE; }; class CBaseMenuPlayer diff --git a/core/logic/HandleSys.cpp b/core/logic/HandleSys.cpp index b1aaf85d..2c43b9cc 100644 --- a/core/logic/HandleSys.cpp +++ b/core/logic/HandleSys.cpp @@ -204,10 +204,8 @@ HandleType_t HandleSystem::CreateType(const char *name, pType->dispatch = dispatch; if (name && name[0] != '\0') { - pType->name = name; + pType->name = new ke::AString(name); m_TypeLookup.insert(name, pType); - } else { - pType->name.setVoid(); } pType->opened = 0; @@ -924,8 +922,8 @@ bool HandleSystem::RemoveType(HandleType_t type, IdentityToken_t *ident) pType->dispatch = NULL; /* Remove it from the type cache. */ - if (!pType->name.isVoid()) - m_TypeLookup.remove(pType->name.chars()); + if (pType->name) + m_TypeLookup.remove(pType->name->chars()); return true; } @@ -1050,8 +1048,8 @@ bool HandleSystem::TryAndFreeSomeHandles() continue; /* We may have gaps, it's fine. */ } - if (!m_Types[i].name.isVoid()) - pTypeName = m_Types[i].name.chars(); + if (m_Types[i].name) + pTypeName = m_Types[i].name->chars(); else pTypeName = "ANON"; @@ -1118,8 +1116,8 @@ void HandleSystem::Dump(HANDLE_REPORTER rep) unsigned int size = 0; unsigned int parentIdx; bool bresult; - if (!pType->name.isVoid()) - type = pType->name.chars(); + if (pType->name) + type = pType->name->chars(); if ((parentIdx = m_Handles[i].clone) != 0) { diff --git a/core/logic/HandleSys.h b/core/logic/HandleSys.h index 2b11c112..bf7094ef 100644 --- a/core/logic/HandleSys.h +++ b/core/logic/HandleSys.h @@ -103,11 +103,11 @@ struct QHandleType TypeAccess typeSec; HandleAccess hndlSec; unsigned int opened; - ke::AString name; + ke::AutoPtr name; static inline bool matches(const char *key, const QHandleType *type) { - return type->name.compare(key) == 0; + return type->name && type->name->compare(key) == 0; } }; diff --git a/public/amtl/am-string.h b/public/amtl/am-string.h index 4400a682..1d1b7e2a 100644 --- a/public/amtl/am-string.h +++ b/public/amtl/am-string.h @@ -104,29 +104,17 @@ class AString return chars()[index]; } - void setVoid() { - chars_ = NULL; - length_ = kInvalidLength; - } - - bool isVoid() const { - return length_ == kInvalidLength; - } - size_t length() const { - assert(!isVoid()); return length_; } const char *chars() const { if (!chars_) - return isVoid() ? NULL : ""; + return ""; return chars_; } private: - static const size_t kInvalidLength = (size_t)-1; - void set(const char *str, size_t length) { chars_ = new char[length + 1]; length_ = length; diff --git a/public/amtl/am-utility.h b/public/amtl/am-utility.h index 2936d3b6..20218cf4 100644 --- a/public/amtl/am-utility.h +++ b/public/amtl/am-utility.h @@ -91,7 +91,7 @@ class AutoPtr : t_(t) { } - AutoPtr(Moveable > &other) + AutoPtr(Moveable > other) { t_ = other->t_; other->t_ = NULL; @@ -116,7 +116,7 @@ class AutoPtr t_ = t; return t_; } - T *operator =(Moveable > &other) { + T *operator =(Moveable > other) { delete t_; t_ = other->t_; other->t_ = NULL; diff --git a/public/amtl/am-vector.h b/public/amtl/am-vector.h index d4a49d3b..2e88cc33 100644 --- a/public/amtl/am-vector.h +++ b/public/amtl/am-vector.h @@ -86,14 +86,22 @@ class Vector : public AllocPolicy } // Shift all elements including |at| up by one, and insert |item| at the - // given position. This is a linear-time operation. + // given position. If |at| is one greater than the last usable index, + // i.e. |at == length()|, then this is the same as append(). No other + // invalid indexes are allowed. + // + // This is a linear-time operation. bool insert(size_t at, const T &item) { + if (at == length()) + return append(item); if (!moveUp(at)) return false; new (&data_[at]) T(item); return true; } bool insert(size_t at, Moveable item) { + if (at == length()) + return append(item); if (!moveUp(at)) return false; new (&data_[at]) T(item); @@ -104,7 +112,7 @@ class Vector : public AllocPolicy // element. This is a linear-time operation. void remove(size_t at) { for (size_t i = at; i < length() - 1; i++) - data_[i] = T(Moveable(data_[i + 1])); + data_[i] = Moveable(data_[i + 1]); pop(); } @@ -178,11 +186,12 @@ class Vector : public AllocPolicy } bool moveUp(size_t at) { + assert(at < nitems_); if (!growIfNeeded(1)) return false; nitems_++; for (size_t i = nitems_ - 1; i > at; i--) - data_[i] = T(Moveable(data_[i - 1])); + data_[i] = Moveable(data_[i - 1]); return true; }