diff options
-rw-r--r-- | src/bun.js/bindings/JSBuffer.cpp | 16 | ||||
-rw-r--r-- | src/bun.js/webcore/encoding.zig | 19 | ||||
-rw-r--r-- | test/bun.js/buffer.test.js | 11 |
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; |