Merge pull request #21062 from Snuffleupagus/compileIndex-TypedArray

Reduce allocations in `CFFCompiler.prototype.compileIndex` (PR 21053 follow-up)
This commit is contained in:
Jonas Jenwald 2026-04-07 21:47:39 +02:00 committed by GitHub
commit a67b952118
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1898,11 +1898,9 @@ class CFFCompiler {
// If there is no object, just create an index. // If there is no object, just create an index.
if (count === 0) { if (count === 0) {
return [0, 0]; return new Uint8Array(2);
} }
const data = [(count >> 8) & 0xff, count & 0xff];
let lastOffset = 1, let lastOffset = 1,
i; i;
for (i = 0; i < count; ++i) { for (i = 0; i < count; ++i) {
@ -1920,29 +1918,32 @@ class CFFCompiler {
offsetSize = 4; offsetSize = 4;
} }
const data = new Uint8Array(2 + offsetSize * (count + 1) + lastOffset);
let pos = 0;
data[pos++] = (count >> 8) & 0xff;
data[pos++] = count & 0xff;
// Next byte contains the offset size use to reference object in the file // Next byte contains the offset size use to reference object in the file
data.push(offsetSize); data[pos++] = offsetSize;
// Add another offset after this one because we need a new offset // Add another offset after this one because we need a new offset
let relativeOffset = 1; let relativeOffset = 1;
for (i = 0; i < count + 1; i++) { for (i = 0; i < count + 1; i++) {
if (offsetSize === 1) { if (offsetSize === 1) {
data.push(relativeOffset & 0xff); data[pos++] = relativeOffset & 0xff;
} else if (offsetSize === 2) { } else if (offsetSize === 2) {
data.push((relativeOffset >> 8) & 0xff, relativeOffset & 0xff); data[pos++] = (relativeOffset >> 8) & 0xff;
data[pos++] = relativeOffset & 0xff;
} else if (offsetSize === 3) { } else if (offsetSize === 3) {
data.push( data[pos++] = (relativeOffset >> 16) & 0xff;
(relativeOffset >> 16) & 0xff, data[pos++] = (relativeOffset >> 8) & 0xff;
(relativeOffset >> 8) & 0xff, data[pos++] = relativeOffset & 0xff;
relativeOffset & 0xff
);
} else { } else {
data.push( data[pos++] = (relativeOffset >>> 24) & 0xff;
(relativeOffset >>> 24) & 0xff, data[pos++] = (relativeOffset >> 16) & 0xff;
(relativeOffset >> 16) & 0xff, data[pos++] = (relativeOffset >> 8) & 0xff;
(relativeOffset >> 8) & 0xff, data[pos++] = relativeOffset & 0xff;
relativeOffset & 0xff
);
} }
if (objects[i]) { if (objects[i]) {
@ -1952,9 +1953,10 @@ class CFFCompiler {
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
// Notify the tracker where the object will be offset in the data. // Notify the tracker where the object will be offset in the data.
trackers[i]?.offset(data.length); trackers[i]?.offset(pos);
data.push(...objects[i]); data.set(objects[i], pos);
pos += objects[i].length;
} }
return data; return data;
} }