| Index: core/fpdfapi/parser/cpdf_dictionary.cpp
|
| diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp
|
| index aab7422b3c913befaa2be4e1d0039fcaede80ae9..435eee72487070495748855743b9449b769d4839 100644
|
| --- a/core/fpdfapi/parser/cpdf_dictionary.cpp
|
| +++ b/core/fpdfapi/parser/cpdf_dictionary.cpp
|
| @@ -27,11 +27,11 @@ CPDF_Dictionary::CPDF_Dictionary(const CFX_WeakPtr<CFX_ByteStringPool>& pPool)
|
|
|
| CPDF_Dictionary::~CPDF_Dictionary() {
|
| // Mark the object as deleted so that it will not be deleted again
|
| - // in case of cyclic references.
|
| + // in case of cyclic references, then break cycles.
|
| m_ObjNum = kInvalidObjNum;
|
| - for (const auto& it : m_Map) {
|
| - if (it.second && it.second->GetObjNum() != kInvalidObjNum)
|
| - it.second->Release();
|
| + for (auto& it : m_Map) {
|
| + if (it.second && it.second->GetObjNum() == kInvalidObjNum)
|
| + it.second.release();
|
| }
|
| }
|
|
|
| @@ -65,20 +65,19 @@ CPDF_Object* CPDF_Dictionary::CloneNonCyclic(
|
| bool bDirect,
|
| std::set<const CPDF_Object*>* pVisited) const {
|
| pVisited->insert(this);
|
| - CPDF_Dictionary* pCopy = new CPDF_Dictionary(m_pPool);
|
| + UniqueDictionary pCopy = UniqueDictionary(new CPDF_Dictionary(m_pPool));
|
| for (const auto& it : *this) {
|
| - CPDF_Object* value = it.second;
|
| - if (!pdfium::ContainsKey(*pVisited, value)) {
|
| - pCopy->m_Map.insert(
|
| - std::make_pair(it.first, value->CloneNonCyclic(bDirect, pVisited)));
|
| + if (!pdfium::ContainsKey(*pVisited, it.second.get())) {
|
| + pCopy->m_Map[it.first] =
|
| + UniqueObject(it.second->CloneNonCyclic(bDirect, pVisited));
|
| }
|
| }
|
| - return pCopy;
|
| + return pCopy.release();
|
| }
|
|
|
| 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(
|
| @@ -174,22 +173,12 @@ bool CPDF_Dictionary::IsSignatureDict() const {
|
| }
|
|
|
| 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));
|
| + if (!pObj) {
|
| + m_Map.erase(key);
|
| return;
|
| }
|
| -
|
| - if (it->second == pObj)
|
| - return;
|
| - it->second->Release();
|
| -
|
| - if (pObj)
|
| - it->second = pObj;
|
| - else
|
| - m_Map.erase(it);
|
| + ASSERT(pObj->IsInline());
|
| + m_Map[key] = UniqueObject(pObj);
|
| }
|
|
|
| void CPDF_Dictionary::ConvertToIndirectObjectFor(
|
| @@ -199,35 +188,24 @@ void CPDF_Dictionary::ConvertToIndirectObjectFor(
|
| if (it == m_Map.end() || it->second->IsReference())
|
| return;
|
|
|
| - uint32_t objnum = pHolder->AddIndirectObject(it->second);
|
| - it->second = new CPDF_Reference(pHolder, objnum);
|
| + uint32_t objnum = pHolder->AddIndirectObject(it->second.release());
|
| + it->second = UniqueReference(new CPDF_Reference(pHolder, objnum));
|
| }
|
|
|
| void CPDF_Dictionary::RemoveFor(const CFX_ByteString& key) {
|
| - auto it = m_Map.find(key);
|
| - if (it == m_Map.end())
|
| - return;
|
| -
|
| - it->second->Release();
|
| - m_Map.erase(it);
|
| + m_Map.erase(key);
|
| }
|
|
|
| void CPDF_Dictionary::ReplaceKey(const CFX_ByteString& oldkey,
|
| const CFX_ByteString& newkey) {
|
| - auto old_it = m_Map.find(oldkey);
|
| - if (old_it == m_Map.end())
|
| + if (oldkey == newkey)
|
| return;
|
|
|
| - auto new_it = m_Map.find(newkey);
|
| - if (new_it == old_it)
|
| + auto old_it = m_Map.find(oldkey);
|
| + if (old_it == m_Map.end())
|
| return;
|
|
|
| - if (new_it != m_Map.end()) {
|
| - new_it->second->Release();
|
| - new_it->second = old_it->second;
|
| - } else {
|
| - m_Map.insert(std::make_pair(MaybeIntern(newkey), old_it->second));
|
| - }
|
| + m_Map[newkey] = std::move(old_it->second);
|
| m_Map.erase(old_it);
|
| }
|
|
|
|
|