diff options
Diffstat (limited to 'core/fpdfapi/parser/cpdf_array.cpp')
-rw-r--r-- | core/fpdfapi/parser/cpdf_array.cpp | 82 |
1 files changed, 27 insertions, 55 deletions
diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp index f8ec46acc9..3edb3bb0ef 100644 --- a/core/fpdfapi/parser/cpdf_array.cpp +++ b/core/fpdfapi/parser/cpdf_array.cpp @@ -19,12 +19,11 @@ CPDF_Array::CPDF_Array() {} CPDF_Array::~CPDF_Array() { - // Mark the object as deleted so that it will not be deleted again - // in case of cyclic references. + // Break cycles for cyclic references. m_ObjNum = kInvalidObjNum; for (auto& it : m_Objects) { - if (it && it->GetObjNum() != kInvalidObjNum) - delete it; + if (it && it->GetObjNum() == kInvalidObjNum) + it.release(); } } @@ -53,11 +52,9 @@ std::unique_ptr<CPDF_Object> CPDF_Array::CloneNonCyclic( std::set<const CPDF_Object*>* pVisited) const { pVisited->insert(this); auto pCopy = pdfium::MakeUnique<CPDF_Array>(); - for (CPDF_Object* value : m_Objects) { - if (!pdfium::ContainsKey(*pVisited, value)) { - pCopy->m_Objects.push_back( - value->CloneNonCyclic(bDirect, pVisited).release()); - } + for (const auto& pValue : m_Objects) { + if (!pdfium::ContainsKey(*pVisited, pValue.get())) + pCopy->m_Objects.push_back(pValue->CloneNonCyclic(bDirect, pVisited)); } return std::move(pCopy); } @@ -87,7 +84,7 @@ CFX_Matrix CPDF_Array::GetMatrix() { CPDF_Object* CPDF_Array::GetObjectAt(size_t i) const { if (i >= m_Objects.size()) return nullptr; - return m_Objects[i]; + return m_Objects[i].get(); } CPDF_Object* CPDF_Array::GetDirectObjectAt(size_t i) const { @@ -140,9 +137,6 @@ void CPDF_Array::RemoveAt(size_t i, size_t nCount) { if (nCount <= 0 || nCount > m_Objects.size() - i) return; - for (size_t j = 0; j < nCount; ++j) - delete m_Objects[i + j]; - m_Objects.erase(m_Objects.begin() + i, m_Objects.begin() + i + nCount); } @@ -151,67 +145,45 @@ void CPDF_Array::ConvertToIndirectObjectAt(size_t i, if (i >= m_Objects.size()) return; - CPDF_Object* pObj = m_Objects[i]; - if (!pObj || pObj->IsReference()) + if (!m_Objects[i] || m_Objects[i]->IsReference()) return; - CPDF_Object* pNew = pHolder->AddIndirectObject(pdfium::WrapUnique(pObj)); - m_Objects[i] = new CPDF_Reference(pHolder, pNew->GetObjNum()); + CPDF_Object* pNew = pHolder->AddIndirectObject(std::move(m_Objects[i])); + m_Objects[i] = pdfium::MakeUnique<CPDF_Reference>(pHolder, pNew->GetObjNum()); } -void CPDF_Array::SetAt(size_t i, CPDF_Object* pObj) { +CPDF_Object* CPDF_Array::SetAt(size_t i, std::unique_ptr<CPDF_Object> pObj) { ASSERT(IsArray()); - CHECK(!pObj || pObj->IsInline()); + ASSERT(!pObj || pObj->IsInline()); if (i >= m_Objects.size()) { ASSERT(false); - return; + return nullptr; } - delete m_Objects[i]; - m_Objects[i] = pObj; + CPDF_Object* pRet = pObj.get(); + m_Objects[i] = std::move(pObj); + return pRet; } -void CPDF_Array::InsertAt(size_t index, CPDF_Object* pObj) { +CPDF_Object* CPDF_Array::InsertAt(size_t index, + std::unique_ptr<CPDF_Object> pObj) { ASSERT(IsArray()); CHECK(!pObj || pObj->IsInline()); + CPDF_Object* pRet = pObj.get(); if (index >= m_Objects.size()) { // Allocate space first. - m_Objects.resize(index + 1, nullptr); - m_Objects[index] = pObj; + m_Objects.resize(index + 1); + m_Objects[index] = std::move(pObj); } else { // Directly insert. - m_Objects.insert(m_Objects.begin() + index, pObj); + m_Objects.insert(m_Objects.begin() + index, std::move(pObj)); } + return pRet; } -void CPDF_Array::Add(CPDF_Object* pObj) { +CPDF_Object* CPDF_Array::Add(std::unique_ptr<CPDF_Object> pObj) { ASSERT(IsArray()); CHECK(!pObj || pObj->IsInline()); - m_Objects.push_back(pObj); -} - -void CPDF_Array::AddName(const CFX_ByteString& str) { - Add(new CPDF_Name(str)); -} - -void CPDF_Array::AddString(const CFX_ByteString& str) { - Add(new CPDF_String(str, false)); -} - -void CPDF_Array::AddInteger(int i) { - Add(new CPDF_Number(i)); -} - -void CPDF_Array::AddNumber(FX_FLOAT f) { - Add(new CPDF_Number(f)); -} - -void CPDF_Array::AddReference(CPDF_IndirectObjectHolder* pDoc, - uint32_t objnum) { - Add(new CPDF_Reference(pDoc, objnum)); -} - -void CPDF_Array::AddReference(CPDF_IndirectObjectHolder* pDoc, - CPDF_Object* pObj) { - ASSERT(!pObj->IsInline()); - Add(new CPDF_Reference(pDoc, pObj->GetObjNum())); + CPDF_Object* pRet = pObj.get(); + m_Objects.push_back(std::move(pObj)); + return pRet; } |