Commit 27fae2b55e835a41277df78f090d4baf6fe05c1e

Authored by m-holger
1 parent 431bd666

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.
include/qpdf/QPDF.hh
@@ -851,12 +851,6 @@ class QPDF @@ -851,12 +851,6 @@ class QPDF
851 { 851 {
852 return qpdf->resolve(og); 852 return qpdf->resolve(og);
853 } 853 }
854 - static bool  
855 - objectChanged(  
856 - QPDF* qpdf, QPDFObjGen const& og, std::shared_ptr<QPDFObject>& oph)  
857 - {  
858 - return qpdf->objectChanged(og, oph);  
859 - }  
860 }; 854 };
861 friend class Resolver; 855 friend class Resolver;
862 856
@@ -1174,7 +1168,6 @@ class QPDF @@ -1174,7 +1168,6 @@ class QPDF
1174 std::string const& description, 1168 std::string const& description,
1175 QPDFObjGen const& exp_og, 1169 QPDFObjGen const& exp_og,
1176 QPDFObjGen& og); 1170 QPDFObjGen& og);
1177 - bool objectChanged(QPDFObjGen const& og, std::shared_ptr<QPDFObject>& oph);  
1178 std::shared_ptr<QPDFObject> resolve(QPDFObjGen const& og); 1171 std::shared_ptr<QPDFObject> resolve(QPDFObjGen const& og);
1179 void resolveObjectsInStream(int obj_stream_number); 1172 void resolveObjectsInStream(int obj_stream_number);
1180 void stopOnError(std::string const& message); 1173 void stopOnError(std::string const& message);
@@ -1729,7 +1722,6 @@ class QPDF @@ -1729,7 +1722,6 @@ class QPDF
1729 bool in_parse; 1722 bool in_parse;
1730 bool parsed; 1723 bool parsed;
1731 std::set<int> resolved_object_streams; 1724 std::set<int> resolved_object_streams;
1732 - bool ever_replaced_objects;  
1733 1725
1734 // Linearization data 1726 // Linearization data
1735 qpdf_offset_t first_xref_item_offset; // actual value from file 1727 qpdf_offset_t first_xref_item_offset; // actual value from file
libqpdf/QPDF.cc
@@ -223,7 +223,6 @@ QPDF::Members::Members() : @@ -223,7 +223,6 @@ QPDF::Members::Members() :
223 immediate_copy_from(false), 223 immediate_copy_from(false),
224 in_parse(false), 224 in_parse(false),
225 parsed(false), 225 parsed(false),
226 - ever_replaced_objects(false),  
227 first_xref_item_offset(0), 226 first_xref_item_offset(0),
228 uncompressed_after_compressed(false) 227 uncompressed_after_compressed(false)
229 { 228 {
@@ -1928,28 +1927,6 @@ QPDF::readObjectAtOffset( @@ -1928,28 +1927,6 @@ QPDF::readObjectAtOffset(
1928 return oh; 1927 return oh;
1929 } 1928 }
1930 1929
1931 -bool  
1932 -QPDF::objectChanged(QPDFObjGen const& og, std::shared_ptr<QPDFObject>& oph)  
1933 -{  
1934 - // See if the object cached at og, if any, is the one passed in.  
1935 - // QPDFObjectHandle uses this to detect outdated handles to  
1936 - // replaced or swapped objects. This is a somewhat expensive check  
1937 - // because it happens with every dereference of a  
1938 - // QPDFObjectHandle. To reduce the hit somewhat, short-circuit the  
1939 - // check if we never called a function that replaces an object  
1940 - // already in cache. It is important for functions that do this to  
1941 - // set ever_replaced_objects = true.  
1942 -  
1943 - if (!this->m->ever_replaced_objects) {  
1944 - return false;  
1945 - }  
1946 - auto c = this->m->obj_cache.find(og);  
1947 - if (c == this->m->obj_cache.end()) {  
1948 - return true;  
1949 - }  
1950 - return (c->second.object.get() != oph.get());  
1951 -}  
1952 -  
1953 std::shared_ptr<QPDFObject> 1930 std::shared_ptr<QPDFObject>
1954 QPDF::resolve(QPDFObjGen const& og) 1931 QPDF::resolve(QPDFObjGen const& og)
1955 { 1932 {
@@ -2207,14 +2184,12 @@ QPDF::replaceObject(QPDFObjGen const&amp; og, QPDFObjectHandle oh) @@ -2207,14 +2184,12 @@ QPDF::replaceObject(QPDFObjGen const&amp; og, QPDFObjectHandle oh)
2207 throw std::logic_error( 2184 throw std::logic_error(
2208 "QPDF::replaceObject called with indirect object handle"); 2185 "QPDF::replaceObject called with indirect object handle");
2209 } 2186 }
2210 -  
2211 // Force new object to appear in the cache 2187 // Force new object to appear in the cache
2212 resolve(og); 2188 resolve(og);
2213 2189
2214 // Replace the object in the object cache 2190 // Replace the object in the object cache
2215 - this->m->ever_replaced_objects = true;  
2216 - this->m->obj_cache[og] =  
2217 - ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1); 2191 + m->obj_cache[og].object->assign(
  2192 + QPDFObjectHandle::ObjAccessor::getObject(oh));
2218 } 2193 }
2219 2194
2220 void 2195 void
@@ -2536,10 +2511,7 @@ QPDF::swapObjects(QPDFObjGen const&amp; og1, QPDFObjGen const&amp; og2) @@ -2536,10 +2511,7 @@ QPDF::swapObjects(QPDFObjGen const&amp; og1, QPDFObjGen const&amp; og2)
2536 // cache. 2511 // cache.
2537 resolve(og1); 2512 resolve(og1);
2538 resolve(og2); 2513 resolve(og2);
2539 - ObjCache t = this->m->obj_cache[og1];  
2540 - this->m->ever_replaced_objects = true;  
2541 - this->m->obj_cache[og1] = this->m->obj_cache[og2];  
2542 - this->m->obj_cache[og2] = t; 2514 + m->obj_cache[og1].object->swapWith(m->obj_cache[og2].object);
2543 } 2515 }
2544 2516
2545 unsigned long long 2517 unsigned long long
libqpdf/QPDFObjectHandle.cc
@@ -2611,9 +2611,7 @@ QPDFObjectHandle::dereference() @@ -2611,9 +2611,7 @@ QPDFObjectHandle::dereference()
2611 if (!this->initialized) { 2611 if (!this->initialized) {
2612 return false; 2612 return false;
2613 } 2613 }
2614 - if ((this->obj->getTypeCode() == QPDFObject::ot_unresolved) ||  
2615 - (getObjectID() &&  
2616 - QPDF::Resolver::objectChanged(this->qpdf, getObjGen(), this->obj))) { 2614 + if (this->obj->getTypeCode() == QPDFObject::ot_unresolved) {
2617 this->obj = QPDF::Resolver::resolve(this->qpdf, getObjGen()); 2615 this->obj = QPDF::Resolver::resolve(this->qpdf, getObjGen());
2618 } 2616 }
2619 return true; 2617 return true;