diff options
author | 2022-07-02 01:34:56 -0700 | |
---|---|---|
committer | 2022-07-02 01:36:04 -0700 | |
commit | 0d9ebb1fd20156f0ce6caea755dadb4b05d032ba (patch) | |
tree | 23232bb4f61414ec2590626550cec91725a749be /misctools | |
parent | ba2c24e77cac9a47014773646f1c4d9d6aedd64a (diff) | |
download | bun-0d9ebb1fd20156f0ce6caea755dadb4b05d032ba.tar.gz bun-0d9ebb1fd20156f0ce6caea755dadb4b05d032ba.tar.zst bun-0d9ebb1fd20156f0ce6caea755dadb4b05d032ba.zip |
[internal] Make `make jsc-bindings-headers` more reliable
Diffstat (limited to 'misctools')
-rw-r--r-- | misctools/headers-cleaner.js | 102 | ||||
-rw-r--r-- | misctools/headers-cleaner.zig | 58 |
2 files changed, 102 insertions, 58 deletions
diff --git a/misctools/headers-cleaner.js b/misctools/headers-cleaner.js new file mode 100644 index 000000000..10824d916 --- /dev/null +++ b/misctools/headers-cleaner.js @@ -0,0 +1,102 @@ +// this file is intended to be runnable both from node and bun +var { readFileSync, writeFileSync } = require("fs"); +var { join } = require("path"); + +const destination = join(__dirname, "../src/bun.js/bindings/headers.zig"); +const replacements = join( + __dirname, + "../src/bun.js/bindings/headers-replacements.zig" +); + +console.log("Writing to", destination); +var output = "// GENERATED CODE - DO NOT MODIFY BY HAND\n\n"; +var input = readFileSync(destination, "utf8"); + +const first_extern = input.indexOf("extern fn"); +const first_extern_line = input.indexOf("\n", first_extern - 128); +const last_extern_fn = input.lastIndexOf("extern"); +const last_extern_fn_line = input.indexOf("\n", last_extern_fn); +const keep = ( + input.substring(0, first_extern_line) + input.substring(last_extern_fn_line) +) + .split("\n") + .filter( + (a) => + /const (JSC|WTF|Web)_/gi.test(a) && + !a.includes("JSValue") && + !a.includes("CatchScope") + ) + .join("\n") + .trim(); + +input = keep + input.slice(first_extern_line, last_extern_fn_line); +input = input.replaceAll("*WebCore__", "*bindings."); +input = input.replaceAll("*JSC__", "*bindings."); +input = input.replaceAll("[*c] JSC__", "[*c]bindings."); +input = input.replaceAll("[*c] const JSC__", "[*c]const bindings."); +input = input.replaceAll( + "[*c]Inspector__ScriptArguments", + "[*c]bindings.ScriptArguments" +); + +input = input + .replaceAll("VirtualMachine", "bindings.VirtualMachine") + .replaceAll("bindings.bindings.VirtualMachine", "bindings.VirtualMachine"); + +const hardcode = { + "[*c][*c]JSC__Exception": "*?*JSC__Exception ", + "[*c]?*anyopaque": "[*c]*anyopaque", + "[*c]JSC__JSGlobalObject": "?*JSC__JSGlobalObject", +}; + +for (let key in hardcode) { + const value = hardcode[key]; + input = input.replaceAll(key, value); +} + +const remove = [ + "pub const __darwin", + "pub const _", + "pub const __builtin", + "pub const int", + "pub const INT", + "pub const uint", + "pub const UINT", + "pub const WCHAR", + "pub const wchar", + "pub const intmax", + "pub const INTMAX", + "pub const uintmax", + "pub const UINTMAX", + "pub const max_align_t", + "pub const ZigErrorCode", + "pub const JSClassRef", + "pub const __", +]; +var lines = input.split("\n"); +for (let prefix of remove) { + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + if (line.startsWith(prefix)) { + lines[i] = ""; + } + } +} +for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + if (line.includes("struct_")) { + lines[i] = ""; + continue; + } +} +input = lines.filter((a) => a.length > 0).join("\n"); + +writeFileSync( + destination, + output + + "\n" + + readFileSync(replacements, "utf8").trim() + + "\n" + + input.trim() + + "\n" +); diff --git a/misctools/headers-cleaner.zig b/misctools/headers-cleaner.zig deleted file mode 100644 index 4715a2c97..000000000 --- a/misctools/headers-cleaner.zig +++ /dev/null @@ -1,58 +0,0 @@ -const std = @import("std"); - -pub fn main() anyerror!void { - const headers_zig_file_src: std.builtin.SourceLocation = @src(); - var paths = [_][]const u8{ std.mem.span(headers_zig_file_src.file), "../../src/bun.js/bindings/headers.zig" }; - const headers_zig_file = try std.fs.path.resolve(std.heap.c_allocator, &paths); - std.debug.print("Writing to {s}", .{headers_zig_file}); - var headers_zig: std.fs.File = try std.fs.openFileAbsolute(headers_zig_file, .{ .mode = .read_write }); - var contents = try headers_zig.readToEndAlloc(std.heap.page_allocator, headers_zig.getEndPos() catch unreachable); - const last_extern_i = std.mem.lastIndexOf(u8, contents, "pub extern fn") orelse @panic("Expected contents"); - const last_newline = std.mem.indexOf(u8, contents[last_extern_i..], "\n") orelse @panic("Expected newline"); - const to_splice = "// GENERATED CODE - DO NOT MODIFY BY HAND\n\n"; - var new_contents = try std.heap.page_allocator.alloc(u8, contents.len + to_splice.len); - std.mem.copy(u8, new_contents, to_splice); - std.mem.copy(u8, new_contents[to_splice.len..], contents); - var i: usize = to_splice.len; - var remainder = new_contents[i..]; - while (remainder.len > 0) { - i = (std.mem.indexOf(u8, remainder, "\npub const struct_b") orelse break); - var begin = remainder[i..]; - - const end_struct = (std.mem.indexOf(u8, begin, "\n};\n") orelse break) + "\n};\n".len; - - std.mem.set(u8, begin[1 .. end_struct + 3], ' '); - remainder = begin[end_struct..]; - } - i = to_splice.len; - remainder = new_contents[i..]; - while (remainder.len > 0) { - i = (std.mem.indexOf(u8, remainder, "\npub const struct_") orelse break); - var begin = remainder[i..]; - var end_struct = (std.mem.indexOf(u8, begin, "opaque {};") orelse break); - end_struct += (std.mem.indexOf(u8, begin[end_struct..], "\n") orelse break); - i = 0; - - std.mem.set(u8, begin[1..end_struct], ' '); - remainder = begin[end_struct..]; - } - - const HARDCODE = [_][]const u8{ - "[*c][*c]JSC__Exception", - "*?*JSC__Exception ", - "[*c]?*anyopaque", - "[*c]*anyopaque", - }; - i = 0; - while (i < HARDCODE.len) : (i += 2) { - _ = std.mem.replace(u8, new_contents, HARDCODE[i], HARDCODE[i + 1], new_contents); - } - - const js_value_start = std.mem.indexOf(u8, new_contents, "pub const JSC__JSValue") orelse unreachable; - const js_value_end = std.mem.indexOf(u8, new_contents[js_value_start..], "\n") orelse unreachable; - std.mem.set(u8, new_contents[js_value_start..][0..js_value_end], ' '); - - try headers_zig.seekTo(0); - try headers_zig.writeAll(new_contents); - try headers_zig.setEndPos(last_newline + last_extern_i + to_splice.len); -} |