aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-08-03 21:11:20 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-08-03 21:11:20 -0700
commitb310d7c40df5bc574f2879e5cf4dca973df47d2d (patch)
treee29997c57b3c63c8c057d67d8ccfea671eaafc26
parent290fb7f7e721d0ed39a4e360e92f121cad6ca680 (diff)
downloadbun-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.cpp15
-rw-r--r--test/bun.js/buffer.test.js14
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();
});