Index: core/fpdfapi/parser/cpdf_array.cpp |
diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp |
index f8ec46acc9da7578f7284f8cf6917c00952c49c1..3edb3bb0efa958cfc53d0775a092a74befe5279a 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; |
} |