Index: core/fpdfapi/parser/cpdf_dictionary.cpp |
diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp |
index 3621dbc1b734dc1a4bdd2d860d94bea07ef377cc..40877539b53e23eda1561d5a78dc71133f88c54f 100644 |
--- a/core/fpdfapi/parser/cpdf_dictionary.cpp |
+++ b/core/fpdfapi/parser/cpdf_dictionary.cpp |
@@ -26,12 +26,12 @@ CPDF_Dictionary::CPDF_Dictionary(const CFX_WeakPtr<CFX_ByteStringPool>& pPool) |
: m_pPool(pPool) {} |
CPDF_Dictionary::~CPDF_Dictionary() { |
- // Mark the object as deleted so that it will not be deleted again |
- // in case of cyclic references. |
+ // Mark the object as deleted so that it will not be deleted again, |
+ // and break cyclic references. |
m_ObjNum = kInvalidObjNum; |
- for (const auto& it : m_Map) { |
- if (it.second && it.second->GetObjNum() != kInvalidObjNum) |
- delete it.second; |
+ for (auto& it : m_Map) { |
+ if (it.second && it.second->GetObjNum() == kInvalidObjNum) |
+ it.second.release(); |
} |
} |
@@ -67,10 +67,9 @@ std::unique_ptr<CPDF_Object> CPDF_Dictionary::CloneNonCyclic( |
pVisited->insert(this); |
auto pCopy = pdfium::MakeUnique<CPDF_Dictionary>(m_pPool); |
for (const auto& it : *this) { |
- CPDF_Object* value = it.second; |
- if (!pdfium::ContainsKey(*pVisited, value)) { |
+ if (!pdfium::ContainsKey(*pVisited, it.second.get())) { |
pCopy->m_Map.insert(std::make_pair( |
- it.first, value->CloneNonCyclic(bDirect, pVisited).release())); |
+ it.first, it.second->CloneNonCyclic(bDirect, pVisited))); |
} |
} |
return std::move(pCopy); |
@@ -78,7 +77,7 @@ std::unique_ptr<CPDF_Object> CPDF_Dictionary::CloneNonCyclic( |
CPDF_Object* CPDF_Dictionary::GetObjectFor(const CFX_ByteString& key) const { |
auto it = m_Map.find(key); |
- return it != m_Map.end() ? it->second : nullptr; |
+ return it != m_Map.end() ? it->second.get() : nullptr; |
} |
CPDF_Object* CPDF_Dictionary::GetDirectObjectFor( |
@@ -173,23 +172,16 @@ bool CPDF_Dictionary::IsSignatureDict() const { |
return pType && pType->GetString() == "Sig"; |
} |
-void CPDF_Dictionary::SetFor(const CFX_ByteString& key, CPDF_Object* pObj) { |
- CHECK(!pObj || pObj->IsInline()); |
- auto it = m_Map.find(key); |
- if (it == m_Map.end()) { |
- if (pObj) |
- m_Map.insert(std::make_pair(MaybeIntern(key), pObj)); |
- return; |
+CPDF_Object* CPDF_Dictionary::SetFor(const CFX_ByteString& key, |
+ std::unique_ptr<CPDF_Object> pObj) { |
+ if (!pObj) { |
+ m_Map.erase(key); |
+ return nullptr; |
} |
- |
- if (it->second == pObj) |
- return; |
- delete it->second; |
- |
- if (pObj) |
- it->second = pObj; |
- else |
- m_Map.erase(it); |
+ ASSERT(pObj->IsInline()); |
+ CPDF_Object* pRet = pObj.get(); |
+ m_Map[MaybeIntern(key)] = std::move(pObj); |
+ return pRet; |
} |
void CPDF_Dictionary::ConvertToIndirectObjectFor( |
@@ -199,18 +191,12 @@ void CPDF_Dictionary::ConvertToIndirectObjectFor( |
if (it == m_Map.end() || it->second->IsReference()) |
return; |
- CPDF_Object* pObj = |
- pHolder->AddIndirectObject(pdfium::WrapUnique(it->second)); |
- it->second = new CPDF_Reference(pHolder, pObj->GetObjNum()); |
+ CPDF_Object* pObj = pHolder->AddIndirectObject(std::move(it->second)); |
+ it->second = pdfium::MakeUnique<CPDF_Reference>(pHolder, pObj->GetObjNum()); |
} |
void CPDF_Dictionary::RemoveFor(const CFX_ByteString& key) { |
- auto it = m_Map.find(key); |
- if (it == m_Map.end()) |
- return; |
- |
- delete it->second; |
- m_Map.erase(it); |
+ m_Map.erase(key); |
} |
void CPDF_Dictionary::ReplaceKey(const CFX_ByteString& oldkey, |
@@ -223,70 +209,28 @@ void CPDF_Dictionary::ReplaceKey(const CFX_ByteString& oldkey, |
if (new_it == old_it) |
return; |
- if (new_it != m_Map.end()) { |
- delete new_it->second; |
- new_it->second = old_it->second; |
- } else { |
- m_Map.insert(std::make_pair(MaybeIntern(newkey), old_it->second)); |
- } |
+ m_Map[MaybeIntern(newkey)] = std::move(old_it->second); |
m_Map.erase(old_it); |
} |
-void CPDF_Dictionary::SetIntegerFor(const CFX_ByteString& key, int i) { |
- SetFor(key, new CPDF_Number(i)); |
-} |
- |
-void CPDF_Dictionary::SetNameFor(const CFX_ByteString& key, |
- const CFX_ByteString& name) { |
- SetFor(key, new CPDF_Name(GetByteStringPool(), name)); |
-} |
- |
-void CPDF_Dictionary::SetStringFor(const CFX_ByteString& key, |
- const CFX_ByteString& str) { |
- SetFor(key, new CPDF_String(GetByteStringPool(), str, false)); |
-} |
- |
-void CPDF_Dictionary::SetReferenceFor(const CFX_ByteString& key, |
- CPDF_IndirectObjectHolder* pDoc, |
- uint32_t objnum) { |
- SetFor(key, new CPDF_Reference(pDoc, objnum)); |
-} |
- |
-void CPDF_Dictionary::SetReferenceFor(const CFX_ByteString& key, |
- CPDF_IndirectObjectHolder* pDoc, |
- CPDF_Object* pObj) { |
- ASSERT(!pObj->IsInline()); |
- SetFor(key, new CPDF_Reference(pDoc, pObj->GetObjNum())); |
-} |
- |
-void CPDF_Dictionary::SetNumberFor(const CFX_ByteString& key, FX_FLOAT f) { |
- SetFor(key, new CPDF_Number(f)); |
-} |
- |
-void CPDF_Dictionary::SetBooleanFor(const CFX_ByteString& key, bool bValue) { |
- SetFor(key, new CPDF_Boolean(bValue)); |
-} |
- |
void CPDF_Dictionary::SetRectFor(const CFX_ByteString& key, |
const CFX_FloatRect& rect) { |
- CPDF_Array* pArray = new CPDF_Array; |
+ CPDF_Array* pArray = SetNewFor<CPDF_Array>(key); |
pArray->AddNew<CPDF_Number>(rect.left); |
pArray->AddNew<CPDF_Number>(rect.bottom); |
pArray->AddNew<CPDF_Number>(rect.right); |
pArray->AddNew<CPDF_Number>(rect.top); |
- SetFor(key, pArray); |
} |
void CPDF_Dictionary::SetMatrixFor(const CFX_ByteString& key, |
const CFX_Matrix& matrix) { |
- CPDF_Array* pArray = new CPDF_Array; |
+ CPDF_Array* pArray = SetNewFor<CPDF_Array>(key); |
pArray->AddNew<CPDF_Number>(matrix.a); |
pArray->AddNew<CPDF_Number>(matrix.b); |
pArray->AddNew<CPDF_Number>(matrix.c); |
pArray->AddNew<CPDF_Number>(matrix.d); |
pArray->AddNew<CPDF_Number>(matrix.e); |
pArray->AddNew<CPDF_Number>(matrix.f); |
- SetFor(key, pArray); |
} |
CFX_ByteString CPDF_Dictionary::MaybeIntern(const CFX_ByteString& str) { |