Remove orphan tracking for CPDF parser objects.
They are now reference counted, so explicit orphan tracking
is no longer required.
Change-Id: I7e8422305c63886f6b9a4060148341f0761334fd
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/53891
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp
index 345a8ae..b2e1b54 100644
--- a/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp
+++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp
@@ -70,9 +70,6 @@
pObj->SetObjNum(++m_LastObjNum);
auto& obj_holder = m_IndirectObjs[m_LastObjNum];
- if (obj_holder)
- m_OrphanObjs.push_back(std::move(obj_holder));
-
obj_holder = std::move(pObj);
return obj_holder.Get();
}
@@ -90,7 +87,6 @@
return false;
pObj->SetObjNum(objnum);
- AddOrphan(std::move(obj_holder));
obj_holder = std::move(pObj);
m_LastObjNum = std::max(m_LastObjNum, objnum);
return true;
@@ -103,8 +99,3 @@
m_IndirectObjs.erase(it);
}
-
-void CPDF_IndirectObjectHolder::AddOrphan(RetainPtr<CPDF_Object> pObject) {
- if (pObject)
- m_OrphanObjs.push_back(std::move(pObject));
-}
diff --git a/core/fpdfapi/parser/cpdf_indirect_object_holder.h b/core/fpdfapi/parser/cpdf_indirect_object_holder.h
index 36735bd..1887cc8 100644
--- a/core/fpdfapi/parser/cpdf_indirect_object_holder.h
+++ b/core/fpdfapi/parser/cpdf_indirect_object_holder.h
@@ -63,11 +63,6 @@
bool ReplaceIndirectObjectIfHigherGeneration(uint32_t objnum,
RetainPtr<CPDF_Object> pObj);
- // Takes ownership of |pObj|, persist it for life of the indirect object
- // holder (typically so that unowned pointers to it remain valid). No-op
- // if |pObj| is NULL.
- void AddOrphan(RetainPtr<CPDF_Object> pObj);
-
uint32_t GetLastObjNum() const { return m_LastObjNum; }
void SetLastObjNum(uint32_t objnum) { m_LastObjNum = objnum; }
@@ -84,7 +79,6 @@
private:
uint32_t m_LastObjNum;
std::map<uint32_t, RetainPtr<CPDF_Object>> m_IndirectObjs;
- std::vector<RetainPtr<CPDF_Object>> m_OrphanObjs;
WeakPtr<ByteStringPool> m_pByteStringPool;
};
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index e3f2bd8..bd3b020 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -240,17 +240,13 @@
if (!pClone)
return false;
- m_pForm->GetDocument()->AddOrphan(
- m_pDict->RemoveFor(pdfium::form_fields::kV));
m_pDict->SetFor(pdfium::form_fields::kV, std::move(pClone));
if (pRV) {
- m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("RV"));
m_pDict->SetFor("RV", pDV->Clone());
}
} else {
- m_pForm->GetDocument()->AddOrphan(
- m_pDict->RemoveFor(pdfium::form_fields::kV));
- m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("RV"));
+ m_pDict->RemoveFor(pdfium::form_fields::kV);
+ m_pDict->RemoveFor("RV");
}
if (notify == NotificationOption::kNotify)
NotifyAfterValueChange();
@@ -394,15 +390,13 @@
}
ByteString key(bDefault ? pdfium::form_fields::kDV
: pdfium::form_fields::kV);
- m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor(key));
m_pDict->SetNewFor<CPDF_String>(key, csValue);
int iIndex = FindOption(csValue);
if (iIndex < 0) {
if (m_Type == kRichText && !bDefault) {
- m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("RV"));
m_pDict->SetFor("RV", m_pDict->GetObjectFor(key)->Clone());
}
- m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("I"));
+ m_pDict->RemoveFor("I");
} else {
if (!bDefault) {
ClearSelection(NotificationOption::kDoNotNotify);
@@ -520,9 +514,8 @@
if (!NotifyListOrComboBoxBeforeChange(csValue))
return false;
}
- m_pForm->GetDocument()->AddOrphan(
- m_pDict->RemoveFor(pdfium::form_fields::kV));
- m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("I"));
+ m_pDict->RemoveFor(pdfium::form_fields::kV);
+ m_pDict->RemoveFor("I");
if (notify == NotificationOption::kNotify)
NotifyListOrComboBoxAfterChange();
return true;
@@ -619,17 +612,15 @@
return;
if (GetType() != kListBox) {
- m_pForm->GetDocument()->AddOrphan(
- m_pDict->RemoveFor(pdfium::form_fields::kV));
- m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("I"));
+ m_pDict->RemoveFor(pdfium::form_fields::kV);
+ m_pDict->RemoveFor("I");
return;
}
SelectOption(index, false, NotificationOption::kDoNotNotify);
if (pValue->IsString()) {
if (pValue->GetUnicodeText() == opt_value) {
- m_pForm->GetDocument()->AddOrphan(
- m_pDict->RemoveFor(pdfium::form_fields::kV));
+ m_pDict->RemoveFor(pdfium::form_fields::kV);
}
return;
}
@@ -643,8 +634,6 @@
pArray->AddNew<CPDF_String>(GetOptionValue(i));
}
if (pArray->size() > 0) {
- m_pForm->GetDocument()->AddOrphan(
- m_pDict->RemoveFor(pdfium::form_fields::kV));
m_pDict->SetFor(pdfium::form_fields::kV, std::move(pArray));
}
}
@@ -882,7 +871,7 @@
if (bSelected)
pArray->AddNew<CPDF_Number>(iOptIndex);
if (pArray->IsEmpty())
- m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("I"));
+ m_pDict->RemoveFor("I");
}
if (notify == NotificationOption::kNotify)
NotifyListOrComboBoxAfterChange();
diff --git a/fpdfsdk/cpdfsdk_baannot.cpp b/fpdfsdk/cpdfsdk_baannot.cpp
index 8bc4eb3..459b9d3 100644
--- a/fpdfsdk/cpdfsdk_baannot.cpp
+++ b/fpdfsdk/cpdfsdk_baannot.cpp
@@ -55,10 +55,7 @@
void CPDFSDK_BAAnnot::SetRect(const CFX_FloatRect& rect) {
ASSERT(rect.right - rect.left >= 1.0f);
ASSERT(rect.top - rect.bottom >= 1.0f);
- CPDF_Dictionary* pDict = GetAnnotDict();
- m_pAnnot->GetDocument()->AddOrphan(
- pDict->RemoveFor(pdfium::annotation::kRect));
- pDict->SetRectFor(pdfium::annotation::kRect, rect);
+ GetAnnotDict()->SetRectFor(pdfium::annotation::kRect, rect);
}
CFX_FloatRect CPDFSDK_BAAnnot::GetRect() const {
@@ -102,8 +99,9 @@
void CPDFSDK_BAAnnot::SetAnnotName(const WideString& sName) {
CPDF_Dictionary* pDict = GetAnnotDict();
- m_pAnnot->GetDocument()->AddOrphan(pDict->RemoveFor(pdfium::annotation::kNM));
- if (!sName.IsEmpty())
+ if (sName.IsEmpty())
+ pDict->RemoveFor(pdfium::annotation::kNM);
+ else
pDict->SetNewFor<CPDF_String>(pdfium::annotation::kNM, sName);
}
@@ -112,10 +110,8 @@
}
void CPDFSDK_BAAnnot::SetFlags(uint32_t nFlags) {
- CPDF_Dictionary* pDict = GetAnnotDict();
- m_pAnnot->GetDocument()->AddOrphan(pDict->RemoveFor(pdfium::annotation::kF));
- pDict->SetNewFor<CPDF_Number>(pdfium::annotation::kF,
- static_cast<int>(nFlags));
+ GetAnnotDict()->SetNewFor<CPDF_Number>(pdfium::annotation::kF,
+ static_cast<int>(nFlags));
}
uint32_t CPDFSDK_BAAnnot::GetFlags() const {
@@ -124,8 +120,9 @@
void CPDFSDK_BAAnnot::SetAppState(const ByteString& str) {
CPDF_Dictionary* pDict = GetAnnotDict();
- m_pAnnot->GetDocument()->AddOrphan(pDict->RemoveFor(pdfium::annotation::kAS));
- if (!str.IsEmpty())
+ if (str.IsEmpty())
+ pDict->RemoveFor(pdfium::annotation::kAS);
+ else
pDict->SetNewFor<CPDF_String>(pdfium::annotation::kAS, str, false);
}
@@ -142,7 +139,6 @@
CPDF_Dictionary* pBSDict = GetAnnotDict()->GetDictFor("BS");
if (!pBSDict)
pBSDict = GetAnnotDict()->SetNewFor<CPDF_Dictionary>("BS");
- m_pAnnot->GetDocument()->AddOrphan(pBSDict->RemoveFor("W"));
pBSDict->SetNewFor<CPDF_Number>("W", nWidth);
}
}
@@ -184,7 +180,6 @@
default:
return;
}
- m_pAnnot->GetDocument()->AddOrphan(pBSDict->RemoveFor("S"));
pBSDict->SetNewFor<CPDF_Name>("S", name);
}
diff --git a/fpdfsdk/pwl/cpwl_appstream.cpp b/fpdfsdk/pwl/cpwl_appstream.cpp
index e2b12da..3087b3b 100644
--- a/fpdfsdk/pwl/cpwl_appstream.cpp
+++ b/fpdfsdk/pwl/cpwl_appstream.cpp
@@ -1945,8 +1945,7 @@
}
void CPWL_AppStream::Remove(const ByteString& sAPType) {
- CPDF_Document* doc = widget_->GetPageView()->GetPDFDocument();
- doc->AddOrphan(dict_->RemoveFor(sAPType));
+ dict_->RemoveFor(sAPType);
}
ByteString CPWL_AppStream::GetBackgroundAppStream() const {