From 27fae2b55e835a41277df78f090d4baf6fe05c1e Mon Sep 17 00:00:00 2001 From: m-holger Date: Tue, 2 Aug 2022 22:57:33 +0100 Subject: Remove QPDF::ObjectChanged Also change QPDF::replaceObject and QPDF::swapObjects such that the QPDFObject assigned to an og in the obj_cache is never replaced; only QPDFObject::value is updated. --- libqpdf/QPDF.cc | 34 +++------------------------------- libqpdf/QPDFObjectHandle.cc | 4 +--- 2 files changed, 4 insertions(+), 34 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 22f62a8b..000dab5d 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -223,7 +223,6 @@ QPDF::Members::Members() : immediate_copy_from(false), in_parse(false), parsed(false), - ever_replaced_objects(false), first_xref_item_offset(0), uncompressed_after_compressed(false) { @@ -1928,28 +1927,6 @@ QPDF::readObjectAtOffset( return oh; } -bool -QPDF::objectChanged(QPDFObjGen const& og, std::shared_ptr& oph) -{ - // See if the object cached at og, if any, is the one passed in. - // QPDFObjectHandle uses this to detect outdated handles to - // replaced or swapped objects. This is a somewhat expensive check - // because it happens with every dereference of a - // QPDFObjectHandle. To reduce the hit somewhat, short-circuit the - // check if we never called a function that replaces an object - // already in cache. It is important for functions that do this to - // set ever_replaced_objects = true. - - if (!this->m->ever_replaced_objects) { - return false; - } - auto c = this->m->obj_cache.find(og); - if (c == this->m->obj_cache.end()) { - return true; - } - return (c->second.object.get() != oph.get()); -} - std::shared_ptr QPDF::resolve(QPDFObjGen const& og) { @@ -2207,14 +2184,12 @@ QPDF::replaceObject(QPDFObjGen const& og, QPDFObjectHandle oh) throw std::logic_error( "QPDF::replaceObject called with indirect object handle"); } - // Force new object to appear in the cache resolve(og); // Replace the object in the object cache - this->m->ever_replaced_objects = true; - this->m->obj_cache[og] = - ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1); + m->obj_cache[og].object->assign( + QPDFObjectHandle::ObjAccessor::getObject(oh)); } void @@ -2536,10 +2511,7 @@ QPDF::swapObjects(QPDFObjGen const& og1, QPDFObjGen const& og2) // cache. resolve(og1); resolve(og2); - ObjCache t = this->m->obj_cache[og1]; - this->m->ever_replaced_objects = true; - this->m->obj_cache[og1] = this->m->obj_cache[og2]; - this->m->obj_cache[og2] = t; + m->obj_cache[og1].object->swapWith(m->obj_cache[og2].object); } unsigned long long diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 72a35390..32988b53 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -2611,9 +2611,7 @@ QPDFObjectHandle::dereference() if (!this->initialized) { return false; } - if ((this->obj->getTypeCode() == QPDFObject::ot_unresolved) || - (getObjectID() && - QPDF::Resolver::objectChanged(this->qpdf, getObjGen(), this->obj))) { + if (this->obj->getTypeCode() == QPDFObject::ot_unresolved) { this->obj = QPDF::Resolver::resolve(this->qpdf, getObjGen()); } return true; -- cgit v1.2.3-54-g00ecf