2
1
mirror of https://github.com/qpdf/qpdf.git synced 2025-02-09 15:18:29 +00:00

Refactor Qbjects::update_table

Decompose into new methods update_entry and Entry::update.
This commit is contained in:
m-holger 2024-10-14 11:11:24 +01:00
parent 55bca1a117
commit 6408c5c364
2 changed files with 31 additions and 16 deletions

View File

@ -1562,8 +1562,7 @@ Objects::resolve(int id, int gen)
// has to be resolved during object parsing, such as stream length. // has to be resolved during object parsing, such as stream length.
QTC::TC("qpdf", "QPDF recursion loop in resolve"); QTC::TC("qpdf", "QPDF recursion loop in resolve");
qpdf.warn(qpdf.damagedPDF("", "loop detected resolving object " + og.unparse(' '))); qpdf.warn(qpdf.damagedPDF("", "loop detected resolving object " + og.unparse(' ')));
update_table(id, gen, QPDF_Null::create()); return update_table(id, gen, QPDF_Null::create()).get();
return table[id].object.get();
} }
ResolveRecorder rr(&qpdf, og); ResolveRecorder rr(&qpdf, og);
@ -1597,7 +1596,7 @@ Objects::resolve(int id, int gen)
if (unresolved(id, gen)) { if (unresolved(id, gen)) {
// PDF spec says unknown objects resolve to the null object. // PDF spec says unknown objects resolve to the null object.
QTC::TC("qpdf", "QPDF resolve failure to null"); QTC::TC("qpdf", "QPDF resolve failure to null");
update_table(id, gen, QPDF_Null::create()); return update_table(id, gen, QPDF_Null::create()).get();
} }
return table[id].object.get(); return table[id].object.get();
@ -1716,19 +1715,32 @@ Objects::~Objects()
} }
} }
void std::shared_ptr<QPDFObject>
Objects::update_table(int id, int gen, const std::shared_ptr<QPDFObject>& obj) Objects::Entry::update(int a_gen, const std::shared_ptr<QPDFObject>& obj)
{ {
obj->make_indirect(qpdf, id, gen); if (*this) {
auto& e = table[id]; if (gen != a_gen) {
if (e) {
if (e.gen != gen) {
throw std::logic_error("Internal eror in Objects::update_table"); throw std::logic_error("Internal eror in Objects::update_table");
} }
e.object->assign(obj); object->assign(obj);
} else { } else {
e = Entry(gen, obj); gen = a_gen;
object = obj;
} }
return object;
}
std::shared_ptr<QPDFObject>
Objects::update_entry(Entry& e, int id, int gen, const std::shared_ptr<QPDFObject>& obj)
{
obj->make_indirect(qpdf, id, gen);
return e.update(gen, obj);
}
std::shared_ptr<QPDFObject>
Objects::update_table(int id, int gen, const std::shared_ptr<QPDFObject>& obj)
{
return update_entry(table[id], id, gen, obj);
} }
bool bool
@ -1781,9 +1793,7 @@ Objects::initialize()
std::shared_ptr<QPDFObject> std::shared_ptr<QPDFObject>
Objects::make_indirect(std::shared_ptr<QPDFObject> const& obj) Objects::make_indirect(std::shared_ptr<QPDFObject> const& obj)
{ {
auto next = next_id(); return update_table(next_id(), 0, obj);
update_table(next, 0, obj);
return table[next].object;
} }
std::shared_ptr<QPDFObject> std::shared_ptr<QPDFObject>
@ -1853,7 +1863,7 @@ Objects::replace(int id, int gen, QPDFObjectHandle oh)
if (e && e.gen < gen) { if (e && e.gen < gen) {
erase(id, gen); erase(id, gen);
} }
update_table(id, gen, oh.getObj()); update_entry(e, id, gen, oh.getObj());
} }
void void

View File

@ -523,6 +523,8 @@ class QPDF::Objects
return static_cast<bool>(object); return static_cast<bool>(object);
} }
std::shared_ptr<QPDFObject> update(int gen, const std::shared_ptr<QPDFObject>& obj);
int gen{0}; int gen{0};
std::shared_ptr<QPDFObject> object; std::shared_ptr<QPDFObject> object;
}; // Entry }; // Entry
@ -531,7 +533,10 @@ class QPDF::Objects
bool unresolved(int id, int gen); bool unresolved(int id, int gen);
int next_id(); int next_id();
void update_table(int id, int gen, std::shared_ptr<QPDFObject> const& object); std::shared_ptr<QPDFObject>
update_entry(Entry& e, int id, int gen, const std::shared_ptr<QPDFObject>& obj);
std::shared_ptr<QPDFObject>
update_table(int id, int gen, std::shared_ptr<QPDFObject> const& object);
QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>& input, int obj); QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>& input, int obj);
void resolveObjectsInStream(int obj_stream_number); void resolveObjectsInStream(int obj_stream_number);