aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js')
-rw-r--r--src/bun.js/bindings/bindings.zig17
-rw-r--r--src/bun.js/node/types.zig30
-rw-r--r--src/bun.js/webcore/encoding.zig8
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{};