1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-24 08:09:08 -05:00

perf(ext/web/encoding): avoid copy in decode (#16364)

This commit is contained in:
Marcos Casagrande 2022-10-23 21:09:15 +02:00 committed by GitHub
parent 45ac6e602d
commit 0e1167d12d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -23,7 +23,6 @@
StringPrototypeCharCodeAt, StringPrototypeCharCodeAt,
StringPrototypeSlice, StringPrototypeSlice,
TypedArrayPrototypeSubarray, TypedArrayPrototypeSubarray,
TypedArrayPrototypeSlice,
Uint8Array, Uint8Array,
Uint32Array, Uint32Array,
} = window.__bootstrap.primordials; } = window.__bootstrap.primordials;
@ -404,27 +403,23 @@
*/ */
function decode(bytes, encoding) { function decode(bytes, encoding) {
const BOMEncoding = BOMSniff(bytes); const BOMEncoding = BOMSniff(bytes);
let start = 0;
if (BOMEncoding !== null) { if (BOMEncoding !== null) {
encoding = BOMEncoding; encoding = BOMEncoding;
if (BOMEncoding === "UTF-8") start = 3; const start = BOMEncoding === "UTF-8" ? 3 : 2;
else start = 2; bytes = TypedArrayPrototypeSubarray(bytes, start);
} }
return new TextDecoder(encoding).decode( return new TextDecoder(encoding).decode(bytes);
TypedArrayPrototypeSlice(bytes, start),
);
} }
/** /**
* @param {Uint8Array} bytes * @param {Uint8Array} bytes
*/ */
function BOMSniff(bytes) { function BOMSniff(bytes) {
const BOM = TypedArrayPrototypeSubarray(bytes, 0, 3); if (bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {
if (BOM[0] === 0xEF && BOM[1] === 0xBB && BOM[2] === 0xBF) {
return "UTF-8"; return "UTF-8";
} }
if (BOM[0] === 0xFE && BOM[1] === 0xFF) return "UTF-16BE"; if (bytes[0] === 0xFE && bytes[1] === 0xFF) return "UTF-16BE";
if (BOM[0] === 0xFF && BOM[1] === 0xFE) return "UTF-16LE"; if (bytes[0] === 0xFF && bytes[1] === 0xFE) return "UTF-16LE";
return null; return null;
} }