Index: core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp |
diff --git a/core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp |
index 33f45a53bf1003227fc9a93dfccef077697108b7..32f44199bfa73bebb1e991be20b25a0df51746ec 100644 |
--- a/core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp |
+++ b/core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp |
@@ -9,39 +9,27 @@ |
#include "core/fpdfapi/fpdf_parser/include/cpdf_object.h" |
#include "core/fpdfapi/fpdf_parser/include/cpdf_parser.h" |
-CPDF_IndirectObjectHolder::CPDF_IndirectObjectHolder(CPDF_Parser* pParser) |
- : m_pParser(pParser), m_LastObjNum(0) { |
- if (pParser) |
- m_LastObjNum = m_pParser->GetLastObjNum(); |
-} |
+CPDF_IndirectObjectHolder::CPDF_IndirectObjectHolder() : m_LastObjNum(0) {} |
CPDF_IndirectObjectHolder::~CPDF_IndirectObjectHolder() { |
for (const auto& pair : m_IndirectObjs) |
pair.second->Destroy(); |
} |
-CPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObject(uint32_t objnum) { |
+CPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObject( |
+ uint32_t objnum) const { |
if (objnum == 0) |
return nullptr; |
auto it = m_IndirectObjs.find(objnum); |
- if (it != m_IndirectObjs.end()) |
- return it->second->GetObjNum() != CPDF_Object::kInvalidObjNum ? it->second |
- : nullptr; |
- |
- if (!m_pParser) |
- return nullptr; |
+ return it != m_IndirectObjs.end() ? it->second : nullptr; |
+} |
- CPDF_Object* pObj = m_pParser->ParseIndirectObject(this, objnum); |
- if (!pObj) |
+CPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObjectIfValid( |
+ uint32_t objnum) { |
+ CPDF_Object* pObj = GetIndirectObject(objnum); |
+ if (pObj && pObj->GetObjNum() == CPDF_Object::kInvalidObjNum) |
return nullptr; |
- |
- pObj->m_ObjNum = objnum; |
- m_LastObjNum = std::max(m_LastObjNum, objnum); |
- if (m_IndirectObjs[objnum]) |
- m_IndirectObjs[objnum]->Destroy(); |
- |
- m_IndirectObjs[objnum] = pObj; |
return pObj; |
} |
@@ -50,36 +38,41 @@ uint32_t CPDF_IndirectObjectHolder::AddIndirectObject(CPDF_Object* pObj) { |
return pObj->m_ObjNum; |
m_LastObjNum++; |
- m_IndirectObjs[m_LastObjNum] = pObj; |
pObj->m_ObjNum = m_LastObjNum; |
+ ReplaceIndirectObject(pObj); |
return m_LastObjNum; |
} |
void CPDF_IndirectObjectHolder::ReleaseIndirectObject(uint32_t objnum) { |
- auto it = m_IndirectObjs.find(objnum); |
- if (it == m_IndirectObjs.end() || |
- it->second->GetObjNum() == CPDF_Object::kInvalidObjNum) { |
+ CPDF_Object* pObj = GetIndirectObjectIfValid(objnum); |
Tom Sepez
2016/08/17 17:04:13
Might this then cause a parse that didn't happen b
dsinclair
2016/08/17 18:16:44
Good catch. Fixed.
|
+ if (!pObj) |
return; |
- } |
- it->second->Destroy(); |
- m_IndirectObjs.erase(it); |
+ |
+ pObj->Destroy(); |
+ m_IndirectObjs.erase(objnum); |
} |
-bool CPDF_IndirectObjectHolder::InsertIndirectObject(uint32_t objnum, |
- CPDF_Object* pObj) { |
+bool CPDF_IndirectObjectHolder::ReplaceIndirectObjectIfHigherGeneration( |
+ uint32_t objnum, |
+ CPDF_Object* pObj) { |
if (!objnum || !pObj) |
return false; |
- auto it = m_IndirectObjs.find(objnum); |
- if (it != m_IndirectObjs.end()) { |
- if (pObj->GetGenNum() <= it->second->GetGenNum()) { |
- pObj->Destroy(); |
- return false; |
- } |
- it->second->Destroy(); |
+ CPDF_Object* pOldObj = GetIndirectObject(objnum); |
+ if (pOldObj && pObj->GetGenNum() <= pOldObj->GetGenNum()) { |
+ pObj->Destroy(); |
+ return false; |
} |
+ |
pObj->m_ObjNum = objnum; |
- m_IndirectObjs[objnum] = pObj; |
- m_LastObjNum = std::max(m_LastObjNum, objnum); |
+ ReplaceIndirectObject(pObj); |
return true; |
} |
+ |
+void CPDF_IndirectObjectHolder::ReplaceIndirectObject(CPDF_Object* pObj) { |
+ m_LastObjNum = std::max(m_LastObjNum, pObj->m_ObjNum); |
+ if (m_IndirectObjs[pObj->m_ObjNum]) |
+ m_IndirectObjs[pObj->m_ObjNum]->Destroy(); |
+ |
+ m_IndirectObjs[pObj->m_ObjNum] = pObj; |
+} |