From b310d7c40df5bc574f2879e5cf4dca973df47d2d Mon Sep 17 00:00:00 2001 From: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Date: Wed, 3 Aug 2022 21:11:20 -0700 Subject: [node.js compat] latin1 & ascii encoding for `Buffer` --- src/bun.js/bindings/JSBuffer.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'src') 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(view.characters16()), view.length() * 2); } break; } -- cgit v1.2.3