aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-10-31 17:16:25 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-10-31 17:16:25 -0700
commit81de8147d77f8bba7dbfd72ce840e1239e4fe1e6 (patch)
treea5cd3d415471e24013deee4e0f0db52a14bb2432
parent49ad70b11ca03739887e7b65835d3aab6bb652e7 (diff)
downloadbun-81de8147d77f8bba7dbfd72ce840e1239e4fe1e6.tar.gz
bun-81de8147d77f8bba7dbfd72ce840e1239e4fe1e6.tar.zst
bun-81de8147d77f8bba7dbfd72ce840e1239e4fe1e6.zip
[internal] Start to make `ZigString` support either UTF-16 or LATIN1 instead of assuming latin1jarred/redo-zigstring-for-utf16
-rw-r--r--src/javascript/jsc/base.zig1
-rw-r--r--src/javascript/jsc/bindings/ZigGlobalObject.cpp2
-rw-r--r--src/javascript/jsc/bindings/bindings.zig14
-rw-r--r--src/javascript/jsc/bindings/exports.zig2
-rw-r--r--src/javascript/jsc/javascript.zig104
5 files changed, 97 insertions, 26 deletions
diff --git a/src/javascript/jsc/base.zig b/src/javascript/jsc/base.zig
index 63e07b635..3ab4bcb07 100644
--- a/src/javascript/jsc/base.zig
+++ b/src/javascript/jsc/base.zig
@@ -1564,6 +1564,7 @@ pub const JSPrivateDataPtr = TaggedPointerUnion(.{
JSNode,
LazyPropertiesObject,
ModuleNamespace,
+ TextEncoder,
});
pub inline fn GetJSPrivateData(comptime Type: type, ref: js.JSObjectRef) ?*Type {
diff --git a/src/javascript/jsc/bindings/ZigGlobalObject.cpp b/src/javascript/jsc/bindings/ZigGlobalObject.cpp
index b8470ce4b..7f637d812 100644
--- a/src/javascript/jsc/bindings/ZigGlobalObject.cpp
+++ b/src/javascript/jsc/bindings/ZigGlobalObject.cpp
@@ -101,10 +101,10 @@ extern "C" void JSCInitialize() {
extern "C" JSC__JSGlobalObject *Zig__GlobalObject__create(JSClassRef *globalObjectClass, int count,
void *console_client) {
- auto heapSize = JSC::LargeHeap;
JSC::VM &vm = JSC::VM::create(heapSize).leakRef();
vm.heap.acquireAccess();
+
#if ENABLE(WEBASSEMBLY)
JSC::Wasm::enableFastMemory();
#endif
diff --git a/src/javascript/jsc/bindings/bindings.zig b/src/javascript/jsc/bindings/bindings.zig
index 02f026ea5..eb5ecd1f1 100644
--- a/src/javascript/jsc/bindings/bindings.zig
+++ b/src/javascript/jsc/bindings/bindings.zig
@@ -81,9 +81,15 @@ pub const JSObject = extern struct {
};
};
+pub const Encoding = enum(u8) {
+ latin1 = 0,
+ utf16 = 1,
+};
+
pub const ZigString = extern struct {
- ptr: [*]const u8,
- len: usize,
+ ptr: ?*const c_void,
+ len: u32,
+ encoding: Encoding,
pub const shim = Shimmer("", "ZigString", @This());
pub const name = "ZigString";
@@ -97,7 +103,7 @@ pub const ZigString = extern struct {
}
pub fn init(slice_: []const u8) ZigString {
- return ZigString{ .ptr = slice_.ptr, .len = slice_.len };
+ return ZigString{ .ptr = slice_.ptr, .len = @truncate(u32, slice_.len), .encoding = Encoding.latin1 };
}
pub inline fn toRef(slice_: []const u8, global: *JSGlobalObject) C_API.JSValueRef {
@@ -115,7 +121,7 @@ pub const ZigString = extern struct {
}
pub fn trimmedSlice(this: *const ZigString) []const u8 {
- return std.mem.trim(u8, this.ptr[0..std.math.min(this.len, 4096)], " \r\n");
+ return std.mem.trim(u8, @as([*]const u8, this.ptr)[0..std.math.min(this.len, 4096)], " \r\n");
}
pub fn toValue(this: ZigString, global: *JSGlobalObject) JSValue {
diff --git a/src/javascript/jsc/bindings/exports.zig b/src/javascript/jsc/bindings/exports.zig
index b325a1208..52ddaa96f 100644
--- a/src/javascript/jsc/bindings/exports.zig
+++ b/src/javascript/jsc/bindings/exports.zig
@@ -754,6 +754,7 @@ pub const ZigConsoleClient = struct {
Boolean,
const CellType = CAPI.CellType;
threadlocal var name_buf: [512]u8 = undefined;
+
pub fn format(comptime Writer: type, writer: Writer, value: JSValue, globalThis: *JSGlobalObject, comptime enable_ansi_colors: bool) anyerror!void {
if (comptime @hasDecl(@import("root"), "bindgen")) {
return;
@@ -816,7 +817,6 @@ pub const ZigConsoleClient = struct {
value.getNameProperty(globalThis, &printable);
try writer.print("[Function {s}]", .{printable.slice()});
} else {
- var str = value.toWTFString(JS.VirtualMachine.vm.global);
_ = try writer.write(str.slice());
}
}
diff --git a/src/javascript/jsc/javascript.zig b/src/javascript/jsc/javascript.zig
index ba2161c9d..16d7a9f3e 100644
--- a/src/javascript/jsc/javascript.zig
+++ b/src/javascript/jsc/javascript.zig
@@ -42,6 +42,7 @@ pub const GlobalClasses = [_]type{
Fetch.Class,
js_ast.Macro.JSNode.BunJSXCallbackFunction,
Performance.Class,
+ TextEncoder.Class,
// The last item in this array becomes "process.env"
Bun.EnvironmentVariables.Class,
@@ -566,26 +567,34 @@ pub const Bun = struct {
},
},
},
- .{ .main = .{
- .get = getMain,
- .ts = d.ts{ .name = "main", .@"return" = "string" },
- }, .cwd = .{
- .get = getCWD,
- .ts = d.ts{ .name = "cwd", .@"return" = "string" },
- }, .origin = .{
- .get = getOrigin,
- .ts = d.ts{ .name = "origin", .@"return" = "string" },
- }, .routesDir = .{
- .get = getRoutesDir,
- .ts = d.ts{ .name = "routesDir", .@"return" = "string" },
- }, .assetPrefix = .{
- .get = getAssetPrefix,
- .ts = d.ts{ .name = "assetPrefix", .@"return" = "string" },
- }, .env = .{
- .get = EnvironmentVariables.getter,
- }, .enableANSIColors = .{
- .get = enableANSIColors,
- } },
+ .{
+ .main = .{
+ .get = getMain,
+ .ts = d.ts{ .name = "main", .@"return" = "string" },
+ },
+ .cwd = .{
+ .get = getCWD,
+ .ts = d.ts{ .name = "cwd", .@"return" = "string" },
+ },
+ .origin = .{
+ .get = getOrigin,
+ .ts = d.ts{ .name = "origin", .@"return" = "string" },
+ },
+ .routesDir = .{
+ .get = getRoutesDir,
+ .ts = d.ts{ .name = "routesDir", .@"return" = "string" },
+ },
+ .assetPrefix = .{
+ .get = getAssetPrefix,
+ .ts = d.ts{ .name = "assetPrefix", .@"return" = "string" },
+ },
+ .env = .{
+ .get = EnvironmentVariables.getter,
+ },
+ .enableANSIColors = .{
+ .get = enableANSIColors,
+ },
+ },
);
/// EnvironmentVariables is runtime defined.
@@ -1979,6 +1988,61 @@ pub const EventListenerMixin = struct {
}
};
+pub const TextEncoder = struct {
+ not_a_zero_bit_type: bool = true,
+
+ pub const Class = NewClass(
+ TextEncoder,
+ .{
+ .name = "TextEncoder",
+ .read_only = true,
+ },
+ .{
+ .constructor = .{
+ .rfn = TextEncoder.constructor,
+ .ts = d.ts{},
+ },
+ // .encode = .{
+ // .rfn = TextEncoder.encode,
+ // .ts = d.ts{},
+ // },
+ // .encodeInto = .{
+ // .rfn = TextEncoder.encodeInto,
+ // .ts = d.ts{},
+ // },
+ },
+ .{},
+ );
+
+ pub fn constructor(
+ ctx: js.JSContextRef,
+ function: js.JSObjectRef,
+ arguments: []const js.JSValueRef,
+ exception: js.ExceptionRef,
+ ) js.JSObjectRef {
+ var text_encoder = getAllocator(ctx).create(TextEncoder) catch unreachable;
+ text_encoder.* = TextEncoder{};
+
+ return Class.make(ctx, text_encoder);
+ }
+
+ // pub fn encode(
+ // this: *TextEncoder,
+ // ctx: js.JSContextRef,
+ // function: js.JSObjectRef,
+ // arguments: []const js.JSValueRef,
+ // exception: js.ExceptionRef,
+ // ) js.JSObjectRef {}
+
+ // pub fn encodeInto(
+ // this: *TextEncoder,
+ // ctx: js.JSContextRef,
+ // function: js.JSObjectRef,
+ // arguments: []const js.JSValueRef,
+ // exception: js.ExceptionRef,
+ // ) js.JSObjectRef {}
+};
+
pub const ResolveError = struct {
msg: logger.Msg,
allocator: *std.mem.Allocator,