diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bun.js/bindings/bindings.zig | 17 | ||||
-rw-r--r-- | src/bun.js/node/types.zig | 30 | ||||
-rw-r--r-- | src/bun.js/webcore/encoding.zig | 8 |
3 files changed, 26 insertions, 29 deletions
diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig index a7bede295..49e0fad23 100644 --- a/src/bun.js/bindings/bindings.zig +++ b/src/bun.js/bindings/bindings.zig @@ -91,6 +91,23 @@ pub const ZigString = extern struct { ptr: [*]const u8, len: usize, + pub const ByteString = union(enum) { + latin1: []const u8, + utf16: []const u16, + }; + + pub inline fn as(this: ZigString) ByteString { + return if (this.is16Bit()) .{ .utf16 = this.utf16SliceAligned() } else .{ .latin1 = this.slice() }; + } + + pub fn encode(this: ZigString, encoding: JSC.Node.Encoding) []u8 { + return switch (this.as()) { + inline else => |repr| switch (encoding) { + inline else => |enc| JSC.WebCore.Encoder.constructFrom(std.meta.Child(@TypeOf(repr)), repr, enc), + }, + }; + } + /// This function is not optimized! pub fn eqlCaseInsensitive(this: ZigString, other: ZigString) bool { var fallback = std.heap.stackFallback(1024, bun.default_allocator); diff --git a/src/bun.js/node/types.zig b/src/bun.js/node/types.zig index 33f6492e7..d25023eb4 100644 --- a/src/bun.js/node/types.zig +++ b/src/bun.js/node/types.zig @@ -417,35 +417,7 @@ pub const SliceOrBuffer = union(Tag) { return fromJS(global, allocator, value); } - const out = brk: { - if (!zig_str.is16Bit()) { - const buf = zig_str.slice(); - break :brk switch (encoding) { - Encoding.utf8 => JSC.WebCore.Encoder.constructFromU8(buf.ptr, buf.len, .utf8), - Encoding.ucs2 => JSC.WebCore.Encoder.constructFromU8(buf.ptr, buf.len, .ucs2), - Encoding.utf16le => JSC.WebCore.Encoder.constructFromU8(buf.ptr, buf.len, .utf16le), - Encoding.latin1 => JSC.WebCore.Encoder.constructFromU8(buf.ptr, buf.len, .latin1), - Encoding.ascii => JSC.WebCore.Encoder.constructFromU8(buf.ptr, buf.len, .ascii), - Encoding.base64 => JSC.WebCore.Encoder.constructFromU8(buf.ptr, buf.len, .base64), - Encoding.hex => JSC.WebCore.Encoder.constructFromU8(buf.ptr, buf.len, .hex), - Encoding.buffer => JSC.WebCore.Encoder.constructFromU8(buf.ptr, buf.len, .buffer), - Encoding.base64url => JSC.WebCore.Encoder.constructFromU8(buf.ptr, buf.len, .base64url), - }; - } else { - const buf = zig_str.utf16SliceAligned(); - break :brk switch (encoding) { - Encoding.utf8 => JSC.WebCore.Encoder.constructFromU16(buf.ptr, buf.len, .utf8), - Encoding.ucs2 => JSC.WebCore.Encoder.constructFromU16(buf.ptr, buf.len, .ucs2), - Encoding.utf16le => JSC.WebCore.Encoder.constructFromU16(buf.ptr, buf.len, .utf16le), - Encoding.latin1 => JSC.WebCore.Encoder.constructFromU16(buf.ptr, buf.len, .latin1), - Encoding.ascii => JSC.WebCore.Encoder.constructFromU16(buf.ptr, buf.len, .ascii), - Encoding.base64 => JSC.WebCore.Encoder.constructFromU16(buf.ptr, buf.len, .base64), - Encoding.hex => JSC.WebCore.Encoder.constructFromU16(buf.ptr, buf.len, .hex), - Encoding.buffer => JSC.WebCore.Encoder.constructFromU16(buf.ptr, buf.len, .buffer), - Encoding.base64url => JSC.WebCore.Encoder.constructFromU16(buf.ptr, buf.len, .base64url), - }; - } - }; + const out = zig_str.encode(encoding); return .{ .string = JSC.ZigString.Slice.from(out, allocator) }; } diff --git a/src/bun.js/webcore/encoding.zig b/src/bun.js/webcore/encoding.zig index dda9c0bc4..f39a082d8 100644 --- a/src/bun.js/webcore/encoding.zig +++ b/src/bun.js/webcore/encoding.zig @@ -1064,6 +1064,14 @@ pub const Encoder = struct { } } + pub fn constructFrom(comptime T: type, input: []const T, comptime encoding: JSC.Node.Encoding) []u8 { + return switch (comptime T) { + u16 => constructFromU16(input.ptr, input.len, encoding), + u8 => constructFromU8(input.ptr, input.len, encoding), + else => @compileError("Unsupported type for constructFrom: " ++ @typeName(T)), + }; + } + pub fn constructFromU8(input: [*]const u8, len: usize, comptime encoding: JSC.Node.Encoding) []u8 { if (len == 0) return &[_]u8{}; |