aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/JSBuffer.cpp
diff options
context:
space:
mode:
authorGravatar Zilin Zhu <zhuzilinallen@gmail.com> 2022-08-29 20:09:47 +0800
committerGravatar GitHub <noreply@github.com> 2022-08-29 05:09:47 -0700
commit34c0f773195eef9c7f62131febee40c267b1ec49 (patch)
treee7af816873b9072930491d5a29d60e9e6e2091a7 /src/bun.js/bindings/JSBuffer.cpp
parent7b628ca09c4335387b4263e6c2bcee2931096cd7 (diff)
downloadbun-34c0f773195eef9c7f62131febee40c267b1ec49.tar.gz
bun-34c0f773195eef9c7f62131febee40c267b1ec49.tar.zst
bun-34c0f773195eef9c7f62131febee40c267b1ec49.zip
chore: Clean buffer C API (#1174)
Diffstat (limited to 'src/bun.js/bindings/JSBuffer.cpp')
-rw-r--r--src/bun.js/bindings/JSBuffer.cpp224
1 files changed, 47 insertions, 177 deletions
diff --git a/src/bun.js/bindings/JSBuffer.cpp b/src/bun.js/bindings/JSBuffer.cpp
index acc024ede..396e643d5 100644
--- a/src/bun.js/bindings/JSBuffer.cpp
+++ b/src/bun.js/bindings/JSBuffer.cpp
@@ -237,74 +237,43 @@ static EncodedJSValue constructFromEncoding(JSGlobalObject* lexicalGlobalObject,
auto view = str->tryGetValue(lexicalGlobalObject);
JSC::EncodedJSValue result;
- switch (encoding) {
- case WebCore::BufferEncodingType::utf8: {
- if (view.is8Bit()) {
- result = Bun__encoding__constructFromLatin1AsUTF8(lexicalGlobalObject, view.characters8(), view.length());
- } else {
- result = Bun__encoding__constructFromUTF16AsUTF8(lexicalGlobalObject, view.characters16(), view.length());
+ if (view.is8Bit()) {
+ switch (encoding) {
+ case WebCore::BufferEncodingType::utf8:
+ case WebCore::BufferEncodingType::ucs2:
+ case WebCore::BufferEncodingType::utf16le:
+ case WebCore::BufferEncodingType::base64:
+ case WebCore::BufferEncodingType::base64url:
+ case WebCore::BufferEncodingType::hex: {
+ result = Bun__encoding__constructFromLatin1(lexicalGlobalObject, view.characters8(), view.length(), static_cast<uint8_t>(encoding));
+ break;
}
- break;
- }
-
- case WebCore::BufferEncodingType::ascii: {
- if (view.is8Bit()) {
- // ascii is a noop for latin1
+ case WebCore::BufferEncodingType::ascii: // ascii is a noop for latin1
+ case WebCore::BufferEncodingType::latin1: { // 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());
+ break;
}
- break;
- }
- case WebCore::BufferEncodingType::latin1: {
- if (view.is8Bit()) {
- // 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());
}
- break;
- }
- case WebCore::BufferEncodingType::ucs2:
- case WebCore::BufferEncodingType::utf16le: {
- if (view.is8Bit()) {
- result = Bun__encoding__constructFromLatin1AsUTF16(lexicalGlobalObject, view.characters8(), view.length());
- } else {
+ } else {
+ switch (encoding) {
+ case WebCore::BufferEncodingType::utf8:
+ case WebCore::BufferEncodingType::base64:
+ case WebCore::BufferEncodingType::base64url:
+ case WebCore::BufferEncodingType::ascii:
+ case WebCore::BufferEncodingType::latin1: {
+ result = Bun__encoding__constructFromUTF16(lexicalGlobalObject, view.characters16(), view.length(), static_cast<uint8_t>(encoding));
+ break;
+ }
+ case WebCore::BufferEncodingType::ucs2:
+ case WebCore::BufferEncodingType::utf16le: {
// 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;
}
- break;
- }
-
- case WebCore::BufferEncodingType::base64: {
- if (view.is8Bit()) {
- result = Bun__encoding__constructFromLatin1AsBase64(lexicalGlobalObject, view.characters8(), view.length());
- } else {
- result = Bun__encoding__constructFromUTF16AsBase64(lexicalGlobalObject, view.characters16(), view.length());
- }
- break;
- }
-
- case WebCore::BufferEncodingType::base64url: {
- if (view.is8Bit()) {
- result = Bun__encoding__constructFromLatin1AsURLSafeBase64(lexicalGlobalObject, view.characters8(), view.length());
- } else {
- result = Bun__encoding__constructFromUTF16AsURLSafeBase64(lexicalGlobalObject, view.characters16(), view.length());
}
- break;
}
- case WebCore::BufferEncodingType::hex: {
- if (view.is8Bit()) {
- result = Bun__encoding__constructFromLatin1AsHex(lexicalGlobalObject, view.characters8(), view.length());
- } else {
- result = Bun__encoding__constructFromUTF16AsHex(lexicalGlobalObject, view.characters16(), view.length());
- }
- break;
- }
- }
JSC::JSValue decoded = JSC::JSValue::decode(result);
if (UNLIKELY(!result)) {
throwTypeError(lexicalGlobalObject, scope, "An error occurred while decoding the string"_s);
@@ -430,57 +399,18 @@ static inline JSC::EncodedJSValue jsBufferConstructorFunction_byteLengthBody(JSC
int64_t written = 0;
switch (encoding) {
- case WebCore::BufferEncodingType::utf8: {
- if (view.is8Bit()) {
- written = Bun__encoding__byteLengthLatin1AsUTF8(view.characters8(), view.length());
- } else {
- written = Bun__encoding__byteLengthUTF16AsUTF8(view.characters16(), view.length());
- }
- break;
- }
-
+ case WebCore::BufferEncodingType::utf8:
case WebCore::BufferEncodingType::latin1:
- case WebCore::BufferEncodingType::ascii: {
- if (view.is8Bit()) {
- written = Bun__encoding__byteLengthLatin1AsASCII(view.characters8(), view.length());
- } else {
- written = Bun__encoding__byteLengthUTF16AsASCII(view.characters16(), view.length());
- }
- break;
- }
+ case WebCore::BufferEncodingType::ascii:
case WebCore::BufferEncodingType::ucs2:
- case WebCore::BufferEncodingType::utf16le: {
- if (view.is8Bit()) {
- written = Bun__encoding__byteLengthLatin1AsUTF16(view.characters8(), view.length());
- } else {
- written = Bun__encoding__byteLengthUTF16AsUTF16(view.characters16(), view.length());
- }
- break;
- }
-
- case WebCore::BufferEncodingType::base64: {
- if (view.is8Bit()) {
- written = Bun__encoding__byteLengthLatin1AsBase64(view.characters8(), view.length());
- } else {
- written = Bun__encoding__byteLengthUTF16AsBase64(view.characters16(), view.length());
- }
- break;
- }
-
- case WebCore::BufferEncodingType::base64url: {
- if (view.is8Bit()) {
- written = Bun__encoding__byteLengthLatin1AsURLSafeBase64(view.characters8(), view.length());
- } else {
- written = Bun__encoding__byteLengthUTF16AsURLSafeBase64(view.characters16(), view.length());
- }
- break;
- }
-
+ case WebCore::BufferEncodingType::utf16le:
+ case WebCore::BufferEncodingType::base64:
+ case WebCore::BufferEncodingType::base64url:
case WebCore::BufferEncodingType::hex: {
if (view.is8Bit()) {
- written = Bun__encoding__byteLengthLatin1AsHex(view.characters8(), view.length());
+ written = Bun__encoding__byteLengthLatin1(view.characters8(), view.length(), static_cast<uint8_t>(encoding));
} else {
- written = Bun__encoding__byteLengthUTF16AsHex(view.characters16(), view.length());
+ written = Bun__encoding__byteLengthUTF16(view.characters16(), view.length(), static_cast<uint8_t>(encoding));
}
break;
}
@@ -1205,40 +1135,19 @@ static inline JSC::EncodedJSValue jsBufferPrototypeFunction_toStringBody(JSC::JS
JSC::EncodedJSValue ret = 0;
switch (encoding) {
- case WebCore::BufferEncodingType::buffer:
- case WebCore::BufferEncodingType::utf8: {
- ret = Bun__encoding__toStringUTF8(castedThis->typedVector() + offset, length, lexicalGlobalObject);
- break;
- }
-
- case WebCore::BufferEncodingType::ascii: {
- ret = Bun__encoding__toStringASCII(castedThis->typedVector() + offset, length, lexicalGlobalObject);
- break;
- }
-
case WebCore::BufferEncodingType::latin1: {
ret = JSC::JSValue::encode(JSC::jsString(vm, WTF::StringImpl::create(reinterpret_cast<const UChar*>(castedThis->typedVector() + offset), length)));
break;
}
-
+ case WebCore::BufferEncodingType::buffer:
+ case WebCore::BufferEncodingType::utf8:
+ case WebCore::BufferEncodingType::ascii:
case WebCore::BufferEncodingType::ucs2:
- case WebCore::BufferEncodingType::utf16le: {
- ret = Bun__encoding__toStringUTF16(castedThis->typedVector() + offset, length, lexicalGlobalObject);
- break;
- }
-
- case WebCore::BufferEncodingType::base64: {
- ret = Bun__encoding__toStringBase64(castedThis->typedVector() + offset, length, lexicalGlobalObject);
- break;
- }
-
- case WebCore::BufferEncodingType::base64url: {
- ret = Bun__encoding__toStringURLSafeBase64(castedThis->typedVector() + offset, length, lexicalGlobalObject);
- break;
- }
-
+ case WebCore::BufferEncodingType::utf16le:
+ case WebCore::BufferEncodingType::base64:
+ case WebCore::BufferEncodingType::base64url:
case WebCore::BufferEncodingType::hex: {
- ret = Bun__encoding__toStringHex(castedThis->typedVector() + offset, length, lexicalGlobalObject);
+ ret = Bun__encoding__toString(castedThis->typedVector() + offset, length, lexicalGlobalObject, static_cast<uint8_t>(encoding));
break;
}
default: {
@@ -1324,57 +1233,18 @@ static inline JSC::EncodedJSValue jsBufferPrototypeFunction_writeBody(JSC::JSGlo
int64_t written = 0;
switch (encoding) {
- case WebCore::BufferEncodingType::utf8: {
- if (view.is8Bit()) {
- written = Bun__encoding__writeLatin1AsUTF8(view.characters8(), view.length(), castedThis->typedVector() + offset, length);
- } else {
- written = Bun__encoding__writeUTF16AsUTF8(view.characters16(), view.length(), castedThis->typedVector() + offset, length);
- }
- break;
- }
-
+ case WebCore::BufferEncodingType::utf8:
case WebCore::BufferEncodingType::latin1:
- case WebCore::BufferEncodingType::ascii: {
- if (view.is8Bit()) {
- written = Bun__encoding__writeLatin1AsASCII(view.characters8(), view.length(), castedThis->typedVector() + offset, length);
- } else {
- written = Bun__encoding__writeUTF16AsASCII(view.characters16(), view.length(), castedThis->typedVector() + offset, length);
- }
- break;
- }
+ case WebCore::BufferEncodingType::ascii:
case WebCore::BufferEncodingType::ucs2:
- case WebCore::BufferEncodingType::utf16le: {
- if (view.is8Bit()) {
- written = Bun__encoding__writeLatin1AsUTF16(view.characters8(), view.length(), castedThis->typedVector() + offset, length);
- } else {
- written = Bun__encoding__writeUTF16AsUTF16(view.characters16(), view.length(), castedThis->typedVector() + offset, length);
- }
- break;
- }
-
- case WebCore::BufferEncodingType::base64: {
- if (view.is8Bit()) {
- written = Bun__encoding__writeLatin1AsBase64(view.characters8(), view.length(), castedThis->typedVector() + offset, length);
- } else {
- written = Bun__encoding__writeUTF16AsBase64(view.characters16(), view.length(), castedThis->typedVector() + offset, length);
- }
- break;
- }
-
- case WebCore::BufferEncodingType::base64url: {
- if (view.is8Bit()) {
- written = Bun__encoding__writeLatin1AsURLSafeBase64(view.characters8(), view.length(), castedThis->typedVector() + offset, length);
- } else {
- written = Bun__encoding__writeUTF16AsURLSafeBase64(view.characters16(), view.length(), castedThis->typedVector() + offset, length);
- }
- break;
- }
-
+ case WebCore::BufferEncodingType::utf16le:
+ case WebCore::BufferEncodingType::base64:
+ case WebCore::BufferEncodingType::base64url:
case WebCore::BufferEncodingType::hex: {
if (view.is8Bit()) {
- written = Bun__encoding__writeLatin1AsHex(view.characters8(), view.length(), castedThis->typedVector() + offset, length);
+ written = Bun__encoding__writeLatin1(view.characters8(), view.length(), castedThis->typedVector() + offset, length, static_cast<uint8_t>(encoding));
} else {
- written = Bun__encoding__writeUTF16AsHex(view.characters16(), view.length(), castedThis->typedVector() + offset, length);
+ written = Bun__encoding__writeUTF16(view.characters16(), view.length(), castedThis->typedVector() + offset, length, static_cast<uint8_t>(encoding));
}
break;
}