aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bun.js/bindings/JSBuffer.cpp16
-rw-r--r--src/bun.js/webcore/encoding.zig19
-rw-r--r--test/bun.js/buffer.test.js11
3 files changed, 34 insertions, 12 deletions
diff --git a/src/bun.js/bindings/JSBuffer.cpp b/src/bun.js/bindings/JSBuffer.cpp
index daca67676..5b41949c4 100644
--- a/src/bun.js/bindings/JSBuffer.cpp
+++ b/src/bun.js/bindings/JSBuffer.cpp
@@ -28,6 +28,7 @@
#include "wtf/GetPtr.h"
#include "wtf/PointerPreparations.h"
#include "wtf/URL.h"
+#include "wtf/text/WTFString.h"
#include "JavaScriptCore/BuiltinNames.h"
#include "JSBufferEncodingType.h"
@@ -270,7 +271,6 @@ static inline JSC::EncodedJSValue constructBufferFromStringAndEncoding(JSC::JSGl
break;
}
- case WebCore::BufferEncodingType::latin1:
case WebCore::BufferEncodingType::ascii: {
if (view.is8Bit()) {
result = Bun__encoding__constructFromLatin1AsASCII(lexicalGlobalObject, view.characters8(), view.length());
@@ -279,6 +279,14 @@ static inline JSC::EncodedJSValue constructBufferFromStringAndEncoding(JSC::JSGl
}
break;
}
+ case WebCore::BufferEncodingType::latin1: {
+ if (view.is8Bit()) {
+ result = Bun__encoding__constructFromLatin1AsASCII(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()) {
@@ -1094,12 +1102,16 @@ static inline JSC::EncodedJSValue jsBufferPrototypeFunction_toStringBody(JSC::JS
break;
}
- case WebCore::BufferEncodingType::latin1:
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::ucs2:
case WebCore::BufferEncodingType::utf16le: {
ret = Bun__encoding__toStringUTF16(castedThis->typedVector() + offset, length, lexicalGlobalObject);
diff --git a/src/bun.js/webcore/encoding.zig b/src/bun.js/webcore/encoding.zig
index 690b2e86d..b3bea11e5 100644
--- a/src/bun.js/webcore/encoding.zig
+++ b/src/bun.js/webcore/encoding.zig
@@ -838,9 +838,6 @@ pub const Encoder = struct {
export fn Bun__encoding__toStringASCII(input: [*]const u8, len: usize, globalObject: *JSC.JSGlobalObject) JSValue {
return toString(input, len, globalObject, .ascii);
}
- export fn Bun__encoding__toStringLatin1(input: [*]const u8, len: usize, globalObject: *JSC.JSGlobalObject) JSValue {
- return toString(input, len, globalObject, .latin1);
- }
export fn Bun__encoding__toStringHex(input: [*]const u8, len: usize, globalObject: *JSC.JSGlobalObject) JSValue {
return toString(input, len, globalObject, .hex);
@@ -866,7 +863,7 @@ pub const Encoder = struct {
const allocator = VirtualMachine.vm.allocator;
switch (comptime encoding) {
- .latin1, .ascii => {
+ .ascii => {
var to = allocator.alloc(u8, len) catch return ZigString.init("Out of memory").toErrorInstance(global);
@memcpy(to.ptr, input_ptr, to.len);
@@ -878,6 +875,13 @@ pub const Encoder = struct {
return ZigString.init(to).toExternalValue(global);
},
+ .latin1 => {
+ var to = allocator.alloc(u8, len) catch return ZigString.init("Out of memory").toErrorInstance(global);
+
+ @memcpy(to.ptr, input_ptr, to.len);
+
+ return ZigString.init(to).toExternalValue(global);
+ },
.buffer, .utf8 => {
// JSC only supports UTF-16 strings for non-ascii text
const converted = strings.toUTF16Alloc(allocator, input, false) catch return ZigString.init("Out of memory").toErrorInstance(global);
@@ -1109,12 +1113,8 @@ pub const Encoder = struct {
},
.latin1, .ascii => {
var to = allocator.alloc(u8, len) catch return &[_]u8{};
- @memcpy(to.ptr, input, len);
- // Hoping this gets auto vectorized
- for (to[0..len]) |c, i| {
- to[i] = @as(u8, @truncate(u7, c));
- }
+ @memcpy(to.ptr, input, len);
return to;
},
@@ -1257,7 +1257,6 @@ pub const Encoder = struct {
_ = Bun__encoding__toStringUTF16;
_ = Bun__encoding__toStringUTF8;
_ = Bun__encoding__toStringASCII;
- _ = Bun__encoding__toStringLatin1;
_ = Bun__encoding__toStringHex;
_ = Bun__encoding__toStringBase64;
_ = Bun__encoding__toStringURLSafeBase64;
diff --git a/test/bun.js/buffer.test.js b/test/bun.js/buffer.test.js
index d1854d89a..e611c558d 100644
--- a/test/bun.js/buffer.test.js
+++ b/test/bun.js/buffer.test.js
@@ -161,6 +161,17 @@ it("Buffer.from", () => {
gc();
});
+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("$"));
+ gc();
+});
+
it("Buffer.equals", () => {
var a = new Uint8Array(10);
a[2] = 1;