summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2013-12-26 17:51:50 +0100
committerJay Berkenbilt <ejb@ql.org>2013-12-26 17:51:50 +0100
commitc9a9fe9c2f8837bdfdd2b0e58fce9a82b0a64881 (patch)
treefa63cf3a4d687879b4d5796da0676171931d05ea
parent0b6127558d94a8b5ea1cdaca2c58e5b5a0cd1472 (diff)
downloadqpdf-c9a9fe9c2f8837bdfdd2b0e58fce9a82b0a64881.tar.zst
Avoid traversing same object twice when copying objects
This is a performance fix. The output is unchanged. Fixes #28.
-rw-r--r--ChangeLog8
-rw-r--r--libqpdf/QPDF.cc5
-rw-r--r--qpdf/qpdf.testcov1
3 files changed, 14 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 9835d203..622495b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2013-12-26 Jay Berkenbilt <ejb@ql.org>
+
+ * Bug fix: when copying foreign objects (which occurs during page
+ splitting among other cases), avoid traversing the same object
+ more than once if it appears more than once in the same direct
+ object. This bug is performance-only and does not affect the
+ actual output.
+
2013-12-17 Jay Berkenbilt <ejb@ql.org>
* 5.1.0: release
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index 543b34b7..51f39abd 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -1755,6 +1755,11 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier,
QTC::TC("qpdf", "QPDF loop reserving objects");
return;
}
+ if (obj_copier.object_map.find(foreign_og) != obj_copier.object_map.end())
+ {
+ QTC::TC("qpdf", "QPDF already reserved object");
+ return;
+ }
QTC::TC("qpdf", "QPDF copy indirect");
obj_copier.visiting.insert(foreign_og);
std::map<QPDFObjGen, QPDFObjectHandle>::iterator mapping =
diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov
index e78a4f4a..b1dc2c0a 100644
--- a/qpdf/qpdf.testcov
+++ b/qpdf/qpdf.testcov
@@ -268,3 +268,4 @@ QPDF xref space 2
qpdf pages range omitted at end 0
qpdf pages range omitted in middle 0
qpdf npages 0
+QPDF already reserved object 0