diff options
author | 2022-08-03 21:11:20 -0700 | |
---|---|---|
committer | 2022-08-03 21:11:20 -0700 | |
commit | b310d7c40df5bc574f2879e5cf4dca973df47d2d (patch) | |
tree | e29997c57b3c63c8c057d67d8ccfea671eaafc26 | |
parent | 290fb7f7e721d0ed39a4e360e92f121cad6ca680 (diff) | |
download | bun-b310d7c40df5bc574f2879e5cf4dca973df47d2d.tar.gz bun-b310d7c40df5bc574f2879e5cf4dca973df47d2d.tar.zst bun-b310d7c40df5bc574f2879e5cf4dca973df47d2d.zip |
[node.js compat] latin1 & ascii encoding for `Buffer`
-rw-r--r-- | src/bun.js/bindings/JSBuffer.cpp | 15 | ||||
-rw-r--r-- | test/bun.js/buffer.test.js | 14 |
2 files changed, 17 insertions, 12 deletions
diff --git a/src/bun.js/bindings/JSBuffer.cpp b/src/bun.js/bindings/JSBuffer.cpp index 570d5f73e..7cbd1faac 100644 --- a/src/bun.js/bindings/JSBuffer.cpp +++ b/src/bun.js/bindings/JSBuffer.cpp @@ -201,13 +201,13 @@ static inline JSC::EncodedJSValue jsBufferConstructorFunction_allocUnsafeBody(JS RELEASE_AND_RETURN(throwScope, JSBuffer__bufferFromLength(lexicalGlobalObject, length)); } -EncodedJSValue JSBuffer__bufferFromPointerAndLength(JSC::JSGlobalObject* lexicalGlobalObject, char* ptr, unsigned int length) +EncodedJSValue JSBuffer__bufferFromPointerAndLength(JSC::JSGlobalObject* lexicalGlobalObject, const unsigned char* ptr, unsigned int length) { JSC::JSUint8Array* uint8Array; if (LIKELY(length > 0)) { - auto buffer = ArrayBuffer::createFromBytes(ptr, length, nullptr); + auto buffer = ArrayBuffer::create(ptr, length); uint8Array = JSC::JSUint8Array::create(lexicalGlobalObject, lexicalGlobalObject->typedArrayStructure(JSC::TypeUint8), WTFMove(buffer), 0, length); } else { @@ -273,7 +273,8 @@ static inline JSC::EncodedJSValue constructBufferFromStringAndEncoding(JSC::JSGl case WebCore::BufferEncodingType::ascii: { if (view.is8Bit()) { - result = Bun__encoding__constructFromLatin1AsASCII(lexicalGlobalObject, view.characters8(), view.length()); + // ascii is a noop for latin1 + result = JSBuffer__bufferFromPointerAndLength(lexicalGlobalObject, view.characters8(), view.length()); } else { result = Bun__encoding__constructFromUTF16AsASCII(lexicalGlobalObject, view.characters16(), view.length()); } @@ -281,7 +282,9 @@ static inline JSC::EncodedJSValue constructBufferFromStringAndEncoding(JSC::JSGl } case WebCore::BufferEncodingType::latin1: { if (view.is8Bit()) { - result = Bun__encoding__constructFromLatin1AsASCII(lexicalGlobalObject, view.characters8(), view.length()); + // The native encoding is latin1 + // so we don't need to do any conversion. + result = JSBuffer__bufferFromPointerAndLength(lexicalGlobalObject, view.characters8(), view.length()); } else { result = Bun__encoding__constructFromUTF16AsASCII(lexicalGlobalObject, view.characters16(), view.length()); } @@ -292,7 +295,9 @@ static inline JSC::EncodedJSValue constructBufferFromStringAndEncoding(JSC::JSGl if (view.is8Bit()) { result = Bun__encoding__constructFromLatin1AsUTF16(lexicalGlobalObject, view.characters8(), view.length()); } else { - result = Bun__encoding__constructFromUTF16AsUTF16(lexicalGlobalObject, view.characters16(), view.length()); + // The native encoding is UTF-16 + // so we don't need to do any conversion. + result = JSBuffer__bufferFromPointerAndLength(lexicalGlobalObject, reinterpret_cast<const unsigned char*>(view.characters16()), view.length() * 2); } break; } diff --git a/test/bun.js/buffer.test.js b/test/bun.js/buffer.test.js index e611c558d..7a587a0a5 100644 --- a/test/bun.js/buffer.test.js +++ b/test/bun.js/buffer.test.js @@ -162,13 +162,13 @@ it("Buffer.from", () => { }); it("Buffer.from latin1 vs ascii", () => { - const simpleBuffer = Buffer.from('\xa4', 'binary'); - expect(simpleBuffer.toString("latin1").toBe("¤")); - expect(simpleBuffer.toString('ascii').toBe("$")); - - const asciiBuffer = Buffer.from('\xa4', 'ascii'); - expect(asciiBuffer.toString("latin1").toBe("¤")); - expect(asciiBuffer.toString('ascii').toBe("$")); + const simpleBuffer = Buffer.from("\xa4", "binary"); + expect(simpleBuffer.toString("latin1")).toBe("¤"); + expect(simpleBuffer.toString("ascii")).toBe("$"); + gc(); + const asciiBuffer = Buffer.from("\xa4", "ascii"); + expect(asciiBuffer.toString("latin1")).toBe("¤"); + expect(asciiBuffer.toString("ascii")).toBe("$"); gc(); }); |