Merge pull request #11076 from Snuffleupagus/XRef-fetch-isRef/cache
Replace the `XRef.cache` Array with a Map instead
This commit is contained in:
commit
852fc955bd
@ -1043,8 +1043,7 @@ var XRef = (function XRefClosure() {
|
|||||||
this.pdfManager = pdfManager;
|
this.pdfManager = pdfManager;
|
||||||
this.entries = [];
|
this.entries = [];
|
||||||
this.xrefstms = Object.create(null);
|
this.xrefstms = Object.create(null);
|
||||||
// prepare the XRef cache
|
this._cacheMap = new Map(); // Prepare the XRef cache.
|
||||||
this.cache = [];
|
|
||||||
this.stats = {
|
this.stats = {
|
||||||
streamTypes: Object.create(null),
|
streamTypes: Object.create(null),
|
||||||
fontTypes: Object.create(null),
|
fontTypes: Object.create(null),
|
||||||
@ -1626,19 +1625,20 @@ var XRef = (function XRefClosure() {
|
|||||||
},
|
},
|
||||||
|
|
||||||
fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) {
|
fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) {
|
||||||
if (!isRef(obj)) {
|
if (obj instanceof Ref) {
|
||||||
return obj;
|
return this.fetch(obj, suppressEncryption);
|
||||||
}
|
}
|
||||||
return this.fetch(obj, suppressEncryption);
|
return obj;
|
||||||
},
|
},
|
||||||
|
|
||||||
fetch: function XRef_fetch(ref, suppressEncryption) {
|
fetch: function XRef_fetch(ref, suppressEncryption) {
|
||||||
if (!isRef(ref)) {
|
if (!(ref instanceof Ref)) {
|
||||||
throw new Error('ref object is not a reference');
|
throw new Error('ref object is not a reference');
|
||||||
}
|
}
|
||||||
var num = ref.num;
|
const num = ref.num;
|
||||||
if (num in this.cache) {
|
|
||||||
var cacheEntry = this.cache[num];
|
if (this._cacheMap.has(num)) {
|
||||||
|
const cacheEntry = this._cacheMap.get(num);
|
||||||
// In documents with Object Streams, it's possible that cached `Dict`s
|
// In documents with Object Streams, it's possible that cached `Dict`s
|
||||||
// have not been assigned an `objId` yet (see e.g. issue3115r.pdf).
|
// have not been assigned an `objId` yet (see e.g. issue3115r.pdf).
|
||||||
if (cacheEntry instanceof Dict && !cacheEntry.objId) {
|
if (cacheEntry instanceof Dict && !cacheEntry.objId) {
|
||||||
@ -1646,12 +1646,11 @@ var XRef = (function XRefClosure() {
|
|||||||
}
|
}
|
||||||
return cacheEntry;
|
return cacheEntry;
|
||||||
}
|
}
|
||||||
|
let xrefEntry = this.getEntry(num);
|
||||||
|
|
||||||
var xrefEntry = this.getEntry(num);
|
if (xrefEntry === null) { // The referenced entry can be free.
|
||||||
|
this._cacheMap.set(num, xrefEntry);
|
||||||
// the referenced entry can be free
|
return xrefEntry;
|
||||||
if (xrefEntry === null) {
|
|
||||||
return (this.cache[num] = null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xrefEntry.uncompressed) {
|
if (xrefEntry.uncompressed) {
|
||||||
@ -1709,7 +1708,7 @@ var XRef = (function XRefClosure() {
|
|||||||
xrefEntry = parser.getObj();
|
xrefEntry = parser.getObj();
|
||||||
}
|
}
|
||||||
if (!isStream(xrefEntry)) {
|
if (!isStream(xrefEntry)) {
|
||||||
this.cache[num] = xrefEntry;
|
this._cacheMap.set(num, xrefEntry);
|
||||||
}
|
}
|
||||||
return xrefEntry;
|
return xrefEntry;
|
||||||
},
|
},
|
||||||
@ -1757,7 +1756,7 @@ var XRef = (function XRefClosure() {
|
|||||||
num = nums[i];
|
num = nums[i];
|
||||||
var entry = this.entries[num];
|
var entry = this.entries[num];
|
||||||
if (entry && entry.offset === tableOffset && entry.gen === i) {
|
if (entry && entry.offset === tableOffset && entry.gen === i) {
|
||||||
this.cache[num] = entries[i];
|
this._cacheMap.set(num, entries[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xrefEntry = entries[xrefEntry.gen];
|
xrefEntry = entries[xrefEntry.gen];
|
||||||
@ -1768,10 +1767,10 @@ var XRef = (function XRefClosure() {
|
|||||||
},
|
},
|
||||||
|
|
||||||
async fetchIfRefAsync(obj, suppressEncryption) {
|
async fetchIfRefAsync(obj, suppressEncryption) {
|
||||||
if (!isRef(obj)) {
|
if (obj instanceof Ref) {
|
||||||
return obj;
|
return this.fetchAsync(obj, suppressEncryption);
|
||||||
}
|
}
|
||||||
return this.fetchAsync(obj, suppressEncryption);
|
return obj;
|
||||||
},
|
},
|
||||||
|
|
||||||
async fetchAsync(ref, suppressEncryption) {
|
async fetchAsync(ref, suppressEncryption) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user