Skip to content

Commit

Permalink
perf(ext/web/encoding): avoid copy in decode (#16364)
Browse files Browse the repository at this point in the history
  • Loading branch information
marcosc90 authored Oct 23, 2022
1 parent 45ac6e6 commit 0e1167d
Showing 1 changed file with 6 additions and 11 deletions.
17 changes: 6 additions & 11 deletions ext/web/08_text_encoding.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
StringPrototypeCharCodeAt,
StringPrototypeSlice,
TypedArrayPrototypeSubarray,
TypedArrayPrototypeSlice,
Uint8Array,
Uint32Array,
} = window.__bootstrap.primordials;
Expand Down Expand Up @@ -404,27 +403,23 @@
*/
function decode(bytes, encoding) {
const BOMEncoding = BOMSniff(bytes);
let start = 0;
if (BOMEncoding !== null) {
encoding = BOMEncoding;
if (BOMEncoding === "UTF-8") start = 3;
else start = 2;
const start = BOMEncoding === "UTF-8" ? 3 : 2;
bytes = TypedArrayPrototypeSubarray(bytes, start);
}
return new TextDecoder(encoding).decode(
TypedArrayPrototypeSlice(bytes, start),
);
return new TextDecoder(encoding).decode(bytes);
}

/**
* @param {Uint8Array} bytes
*/
function BOMSniff(bytes) {
const BOM = TypedArrayPrototypeSubarray(bytes, 0, 3);
if (BOM[0] === 0xEF && BOM[1] === 0xBB && BOM[2] === 0xBF) {
if (bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {
return "UTF-8";
}
if (BOM[0] === 0xFE && BOM[1] === 0xFF) return "UTF-16BE";
if (BOM[0] === 0xFF && BOM[1] === 0xFE) return "UTF-16LE";
if (bytes[0] === 0xFE && bytes[1] === 0xFF) return "UTF-16BE";
if (bytes[0] === 0xFF && bytes[1] === 0xFE) return "UTF-16LE";
return null;
}

Expand Down

0 comments on commit 0e1167d

Please sign in to comment.