Commit 7bbd8b30d099f6ede57d7fa84d5e1e4b1cdca1a1

Authored by m-holger
1 parent 59b25578

Refactor `NNTreeIterator::resetLimits`: replace `getArrayNItems` and `getArrayIt…

…em` with `size` and subscript operators, remove redundant debug traces, simplify loop logic, and improve readability.
libqpdf/NNTree.cc
@@ -160,35 +160,31 @@ NNTreeIterator::increment(bool backward) @@ -160,35 +160,31 @@ NNTreeIterator::increment(bool backward)
160 void 160 void
161 NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list<PathElement>::iterator parent) 161 NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list<PathElement>::iterator parent)
162 { 162 {
163 - bool done = false;  
164 - while (!done) { 163 + while (true) {
165 if (parent == path.end()) { 164 if (parent == path.end()) {
166 - QTC::TC("qpdf", "NNTree remove limits from root");  
167 a_node.removeKey("/Limits"); 165 a_node.removeKey("/Limits");
168 - done = true;  
169 break; 166 break;
170 } 167 }
171 auto kids = a_node.getKey("/Kids"); 168 auto kids = a_node.getKey("/Kids");
172 - int nkids = kids.isArray() ? kids.getArrayNItems() : 0; 169 + size_t nkids = kids.isArray() ? kids.size() : 0;
173 auto items = a_node.getKey(impl.details.itemsKey()); 170 auto items = a_node.getKey(impl.details.itemsKey());
174 - int nitems = items.isArray() ? items.getArrayNItems() : 0; 171 + size_t nitems = items.size();
175 172
176 bool changed = true; 173 bool changed = true;
177 QPDFObjectHandle first; 174 QPDFObjectHandle first;
178 QPDFObjectHandle last; 175 QPDFObjectHandle last;
179 if (nitems >= 2) { 176 if (nitems >= 2) {
180 - first = items.getArrayItem(0);  
181 - last = items.getArrayItem((nitems - 1) & ~1); 177 + first = items[0];
  178 + last = items[(nitems - 1u) & ~1u];
182 } else if (nkids > 0) { 179 } else if (nkids > 0) {
183 - auto first_kid = kids.getArrayItem(0);  
184 - auto last_kid = kids.getArrayItem(nkids - 1); 180 + auto first_kid = kids[0];
  181 + auto last_kid = kids[nkids - 1u];
185 if (first_kid.isDictionary() && last_kid.isDictionary()) { 182 if (first_kid.isDictionary() && last_kid.isDictionary()) {
186 auto first_limits = first_kid.getKey("/Limits"); 183 auto first_limits = first_kid.getKey("/Limits");
187 auto last_limits = last_kid.getKey("/Limits"); 184 auto last_limits = last_kid.getKey("/Limits");
188 - if (first_limits.isArray() && (first_limits.getArrayNItems() >= 2) &&  
189 - last_limits.isArray() && (last_limits.getArrayNItems() >= 2)) {  
190 - first = first_limits.getArrayItem(0);  
191 - last = last_limits.getArrayItem(1); 185 + if (first_limits.size() >= 2 && last_limits.size() >= 2) {
  186 + first = first_limits[0];
  187 + last = last_limits[1];
192 } 188 }
193 } 189 }
194 } 190 }
@@ -197,13 +193,12 @@ NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list&lt;PathElement&gt;::ite @@ -197,13 +193,12 @@ NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list&lt;PathElement&gt;::ite
197 limits.appendItem(first); 193 limits.appendItem(first);
198 limits.appendItem(last); 194 limits.appendItem(last);
199 auto olimits = a_node.getKey("/Limits"); 195 auto olimits = a_node.getKey("/Limits");
200 - if (olimits.isArray() && (olimits.getArrayNItems() == 2)) {  
201 - auto ofirst = olimits.getArrayItem(0);  
202 - auto olast = olimits.getArrayItem(1); 196 + if (olimits.size() == 2) {
  197 + auto ofirst = olimits[0];
  198 + auto olast = olimits[1];
203 if (impl.details.keyValid(ofirst) && impl.details.keyValid(olast) && 199 if (impl.details.keyValid(ofirst) && impl.details.keyValid(olast) &&
204 (impl.details.compareKeys(first, ofirst) == 0) && 200 (impl.details.compareKeys(first, ofirst) == 0) &&
205 (impl.details.compareKeys(last, olast) == 0)) { 201 (impl.details.compareKeys(last, olast) == 0)) {
206 - QTC::TC("qpdf", "NNTree limits didn't change");  
207 changed = false; 202 changed = false;
208 } 203 }
209 } 204 }
@@ -211,12 +206,11 @@ NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list&lt;PathElement&gt;::ite @@ -211,12 +206,11 @@ NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list&lt;PathElement&gt;::ite
211 a_node.replaceKey("/Limits", limits); 206 a_node.replaceKey("/Limits", limits);
212 } 207 }
213 } else { 208 } else {
214 - QTC::TC("qpdf", "NNTree unable to determine limits");  
215 impl.warn(a_node, "unable to determine limits"); 209 impl.warn(a_node, "unable to determine limits");
216 } 210 }
217 211
218 if (!changed || parent == path.begin()) { 212 if (!changed || parent == path.begin()) {
219 - done = true; 213 + break;
220 } else { 214 } else {
221 a_node = parent->node; 215 a_node = parent->node;
222 --parent; 216 --parent;
qpdf/qpdf.testcov
@@ -522,13 +522,10 @@ QPDFPageObjectHelper::forEachXObject 3 @@ -522,13 +522,10 @@ QPDFPageObjectHelper::forEachXObject 3
522 NNTree skip invalid kid 0 522 NNTree skip invalid kid 0
523 NNTree skip item at end of short items 0 523 NNTree skip item at end of short items 0
524 NNTree skip invalid key 0 524 NNTree skip invalid key 0
525 -NNTree unable to determine limits 0  
526 NNTree repair 0 525 NNTree repair 0
527 -NNTree limits didn't change 0  
528 NNTree increment end() 0 526 NNTree increment end() 0
529 NNTree insertAfter inserts first 0 527 NNTree insertAfter inserts first 0
530 NNTree erased last kid/item in tree 1 528 NNTree erased last kid/item in tree 1
531 -NNTree remove limits from root 0  
532 QPDFPageObjectHelper unresolved names 0 529 QPDFPageObjectHelper unresolved names 0
533 QPDFPageObjectHelper resolving unresolved 0 530 QPDFPageObjectHelper resolving unresolved 0
534 QPDFFileSpecObjectHelper empty compat_name 0 531 QPDFFileSpecObjectHelper empty compat_name 0