move netsurf and mimalloc into modules

This commit is contained in:
Pierre Tachoire
2024-06-17 16:29:00 +02:00
parent 68c8372493
commit f2a406d224
40 changed files with 127 additions and 88 deletions

View File

@@ -168,22 +168,33 @@ fn common(
step: *std.Build.Step.Compile,
options: jsruntime.Options,
) !void {
try jsruntime_pkgs.add(step, options);
linkNetSurf(b, step);
const jsruntimemod = try jsruntime_pkgs.module(
b,
options,
step.root_module.optimize.?,
step.root_module.resolved_target.?,
);
step.root_module.addImport("jsruntime", jsruntimemod);
// link mimalloc
step.addObjectFile(b.path("vendor/mimalloc/out/libmimalloc.a"));
step.addIncludePath(b.path("vendor/mimalloc/out/include"));
const netsurf = moduleNetSurf(b);
netsurf.addImport("jsruntime", jsruntimemod);
step.root_module.addImport("netsurf", netsurf);
}
fn linkNetSurf(b: *std.Build, step: *std.Build.Step.Compile) void {
fn moduleNetSurf(b: *std.Build) *std.Build.Module {
const mod = b.addModule("netsurf", .{
.root_source_file = b.path("src/netsurf/netsurf.zig"),
});
// iconv
step.addObjectFile(b.path("vendor/libiconv/lib/libiconv.a"));
step.addIncludePath(b.path("vendor/libiconv/include"));
mod.addObjectFile(b.path("vendor/libiconv/lib/libiconv.a"));
mod.addIncludePath(b.path("vendor/libiconv/include"));
// mimalloc
mod.addImport("mimalloc", moduleMimalloc(b));
// netsurf libs
const ns = "vendor/netsurf";
step.addIncludePath(b.path(ns ++ "/include"));
mod.addIncludePath(b.path(ns ++ "/include"));
const libs: [4][]const u8 = .{
"libdom",
@@ -192,7 +203,20 @@ fn linkNetSurf(b: *std.Build, step: *std.Build.Step.Compile) void {
"libwapcaplet",
};
inline for (libs) |lib| {
step.addObjectFile(b.path(ns ++ "/lib/" ++ lib ++ ".a"));
step.addIncludePath(b.path(ns ++ "/" ++ lib ++ "/src"));
mod.addObjectFile(b.path(ns ++ "/lib/" ++ lib ++ ".a"));
mod.addIncludePath(b.path(ns ++ "/" ++ lib ++ "/src"));
}
return mod;
}
fn moduleMimalloc(b: *std.Build) *std.Build.Module {
const mod = b.addModule("mimalloc", .{
.root_source_file = b.path("src/mimalloc/mimalloc.zig"),
});
mod.addObjectFile(b.path("vendor/mimalloc/out/libmimalloc.a"));
mod.addIncludePath(b.path("vendor/mimalloc/out/include"));
return mod;
}

View File

@@ -21,7 +21,7 @@ const builtin = @import("builtin");
const Types = @import("root").Types;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const Loader = @import("loader.zig").Loader;
const Dump = @import("dump.zig");
const Mime = @import("mime.zig");

View File

@@ -19,7 +19,7 @@
const std = @import("std");
const File = std.fs.File;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const Walker = @import("../dom/walker.zig").WalkerChildren;
// writer must be a std.io.Writer

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
// Node implementation with Netsurf Libdom C lib.
pub const Node = struct {

View File

@@ -19,7 +19,7 @@
const std = @import("std");
const css = @import("css.zig");
const Node = @import("libdom.zig").Node;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const Matcher = struct {
const Nodes = std.ArrayList(Node);

View File

@@ -22,7 +22,7 @@ const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;
const checkCases = jsruntime.test_utils.checkCases;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const Node = @import("node.zig").Node;
const DOMException = @import("exceptions.zig").DOMException;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const Text = @import("text.zig").Text;

View File

@@ -23,7 +23,7 @@ const Case = jsruntime.test_utils.Case;
const checkCases = jsruntime.test_utils.checkCases;
const generate = @import("../generate.zig");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const Node = @import("node.zig").Node;
const Comment = @import("comment.zig").Comment;

View File

@@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const css = @import("../css/css.zig");
const Node = @import("../css/libdom.zig").Node;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const Node = @import("node.zig").Node;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;

View File

@@ -24,7 +24,8 @@ const JSObjectID = jsruntime.JSObjectID;
const Case = jsruntime.test_utils.Case;
const checkCases = jsruntime.test_utils.checkCases;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const event_handler = @import("../events/event.zig").event_handler;
const DOMException = @import("exceptions.zig").DOMException;
const Nod = @import("node.zig");
@@ -74,6 +75,7 @@ pub const EventTarget = struct {
eventType,
cbk,
capture orelse false,
event_handler,
);
}

View File

@@ -23,7 +23,7 @@ const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;
const checkCases = jsruntime.test_utils.checkCases;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
// https://webidl.spec.whatwg.org/#idl-DOMException
pub const DOMException = struct {

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;

View File

@@ -26,7 +26,7 @@ const Variadic = jsruntime.Variadic;
const generate = @import("../generate.zig");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const EventTarget = @import("event_target.zig").EventTarget;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;

View File

@@ -22,7 +22,7 @@ const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;
const checkCases = jsruntime.test_utils.checkCases;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const Node = @import("node.zig").Node;
// https://dom.spec.whatwg.org/#processinginstruction

View File

@@ -23,7 +23,7 @@ const Case = jsruntime.test_utils.Case;
const checkCases = jsruntime.test_utils.checkCases;
const generate = @import("../generate.zig");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const CharacterData = @import("character_data.zig").CharacterData;
const CDATASection = @import("cdata_section.zig").CDATASection;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
pub const Walker = union(enum) {
walkerDepthFirst: WalkerDepthFirst,

View File

@@ -22,10 +22,11 @@ const generate = @import("../generate.zig");
const jsruntime = @import("jsruntime");
const Callback = jsruntime.Callback;
const CallbackResult = jsruntime.CallbackResult;
const Case = jsruntime.test_utils.Case;
const checkCases = jsruntime.test_utils.checkCases;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const DOMException = @import("../dom/exceptions.zig").DOMException;
const EventTarget = @import("../dom/event_target.zig").EventTarget;
@@ -33,6 +34,8 @@ const EventTargetUnion = @import("../dom/event_target.zig").Union;
const ProgressEvent = @import("../xhr/progress_event.zig").ProgressEvent;
const log = std.log.scoped(.events);
// Event interfaces
pub const Interfaces = generate.Tuple(.{
Event,
@@ -236,3 +239,33 @@ pub fn testExecFn(
};
try checkCases(js_env, &remove);
}
pub const event_handler = struct {
fn handle(event: ?*parser.Event, data: ?*anyopaque) callconv(.C) void {
if (data) |d| {
const func = parser.event_handler_cbk(d);
// TODO get the allocator by another way?
var res = CallbackResult.init(func.nat_ctx.alloc);
defer res.deinit();
if (event) |evt| {
func.trycall(.{
Event.toInterface(evt) catch unreachable,
}, &res) catch {};
} else {
func.trycall(.{event}, &res) catch {};
}
// in case of function error, we log the result and the trace.
if (!res.success) {
log.info("event handler error: {s}", .{res.result orelse "unknown"});
log.debug("{s}", .{res.stack orelse "no stack trace"});
}
// NOTE: we can not call func.deinit here
// b/c the handler can be called several times
// either on this dispatch event or in anoter one
}
}
}.handle;

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;

View File

@@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const generate = @import("../generate.zig");
const jsruntime = @import("jsruntime");

View File

@@ -18,7 +18,7 @@
const std = @import("std");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const EventTarget = @import("../dom/event_target.zig").EventTarget;

View File

@@ -20,7 +20,7 @@ const std = @import("std");
const jsruntime = @import("jsruntime");
const parser = @import("netsurf.zig");
const parser = @import("netsurf");
const apiweb = @import("apiweb.zig");
const Window = @import("html/window.zig").Window;

View File

@@ -20,7 +20,7 @@ const std = @import("std");
const jsruntime = @import("jsruntime");
const parser = @import("netsurf.zig");
const parser = @import("netsurf");
const apiweb = @import("apiweb.zig");
const Window = @import("html/window.zig").Window;
const storage = @import("storage/storage.zig");

View File

@@ -26,13 +26,9 @@ const c = @cImport({
@cInclude("events/event.h");
});
const mimalloc = @import("mimalloc.zig");
const mimalloc = @import("mimalloc");
const Callback = @import("jsruntime").Callback;
const CallbackResult = @import("jsruntime").CallbackResult;
const EventToInterface = @import("events/event.zig").Event.toInterface;
const log = std.log.scoped(.netsurf);
// init initializes netsurf lib.
// init starts a mimalloc heap arena for the netsurf session. The caller must
@@ -527,41 +523,11 @@ pub const EventType = enum(u8) {
};
// EventHandler
fn event_handler_cbk(data: *anyopaque) *Callback {
pub fn event_handler_cbk(data: *anyopaque) *Callback {
const ptr: *align(@alignOf(*Callback)) anyopaque = @alignCast(data);
return @as(*Callback, @ptrCast(ptr));
}
const event_handler = struct {
fn handle(event: ?*Event, data: ?*anyopaque) callconv(.C) void {
if (data) |d| {
const func = event_handler_cbk(d);
// TODO get the allocator by another way?
var res = CallbackResult.init(func.nat_ctx.alloc);
defer res.deinit();
if (event) |evt| {
func.trycall(.{
EventToInterface(evt) catch unreachable,
}, &res) catch {};
} else {
func.trycall(.{event}, &res) catch {};
}
// in case of function error, we log the result and the trace.
if (!res.success) {
log.info("event handler error: {s}", .{res.result orelse "unknown"});
log.debug("{s}", .{res.stack orelse "no stack trace"});
}
// NOTE: we can not call func.deinit here
// b/c the handler can be called several times
// either on this dispatch event or in anoter one
}
}
}.handle;
// EventListener
pub const EventListener = c.dom_event_listener;
const EventListenerEntry = c.listener_entry;
@@ -648,6 +614,7 @@ pub fn eventTargetAddEventListener(
typ: []const u8,
cbk: Callback,
capture: bool,
handler: anytype,
) !void {
// this allocation will be removed either on
// eventTargetRemoveEventListener or eventTargetRemoveAllEventListeners
@@ -661,7 +628,7 @@ pub fn eventTargetAddEventListener(
const ctx = @as(*anyopaque, @ptrCast(cbk_ptr));
var listener: ?*EventListener = undefined;
const errLst = c.dom_event_listener_create(event_handler, ctx, &listener);
const errLst = c.dom_event_listener_create(handler, ctx, &listener);
try DOMErr(errLst);
defer c.dom_event_listener_unref(listener);

View File

@@ -23,7 +23,7 @@ const jsruntime = @import("jsruntime");
const generate = @import("generate.zig");
const pretty = @import("pretty");
const parser = @import("netsurf.zig");
const parser = @import("netsurf");
const apiweb = @import("apiweb.zig");
const Window = @import("html/window.zig").Window;
const xhr = @import("xhr/xhr.zig");

View File

@@ -23,7 +23,7 @@ const Case = jsruntime.test_utils.Case;
const checkCases = jsruntime.test_utils.checkCases;
const generate = @import("../generate.zig");
const DOMError = @import("../netsurf.zig").DOMError;
const DOMError = @import("netsurf").DOMError;
const log = std.log.scoped(.storage);

View File

@@ -1,5 +1,5 @@
const std = @import("std");
const parser = @import("netsurf.zig");
const parser = @import("netsurf");
const Client = @import("async/Client.zig");
pub const UserContext = struct {

View File

@@ -21,7 +21,7 @@ const fspath = std.fs.path;
const FileLoader = @import("fileloader.zig").FileLoader;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const jsruntime = @import("jsruntime");
const Loop = jsruntime.Loop;

View File

@@ -22,8 +22,9 @@ const jsruntime = @import("jsruntime");
const Callback = jsruntime.Callback;
const EventTarget = @import("../dom/event_target.zig").EventTarget;
const event_handler = @import("../events/event.zig").event_handler;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const log = std.log.scoped(.xhr);
@@ -41,8 +42,20 @@ pub const XMLHttpRequestEventTarget = struct {
ontimeout_cbk: ?Callback = null,
onloadend_cbk: ?Callback = null,
fn register(self: *XMLHttpRequestEventTarget, alloc: std.mem.Allocator, typ: []const u8, cbk: Callback) !void {
try parser.eventTargetAddEventListener(@as(*parser.EventTarget, @ptrCast(self)), alloc, typ, cbk, false);
fn register(
self: *XMLHttpRequestEventTarget,
alloc: std.mem.Allocator,
typ: []const u8,
cbk: Callback,
) !void {
try parser.eventTargetAddEventListener(
@as(*parser.EventTarget, @ptrCast(self)),
alloc,
typ,
cbk,
false,
event_handler,
);
}
fn unregister(self: *XMLHttpRequestEventTarget, alloc: std.mem.Allocator, typ: []const u8, cbk: Callback) !void {
const et = @as(*parser.EventTarget, @ptrCast(self));

View File

@@ -22,7 +22,7 @@ const jsruntime = @import("jsruntime");
const Case = jsruntime.test_utils.Case;
const checkCases = jsruntime.test_utils.checkCases;
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const Event = @import("../events/event.zig").Event;
const DOMException = @import("../dom/exceptions.zig").DOMException;

View File

@@ -23,7 +23,7 @@ const Case = jsruntime.test_utils.Case;
const checkCases = jsruntime.test_utils.checkCases;
const generate = @import("../generate.zig");
const DOMError = @import("../netsurf.zig").DOMError;
const DOMError = @import("netsurf").DOMError;
const DOMException = @import("../dom/exceptions.zig").DOMException;
const ProgressEvent = @import("progress_event.zig").ProgressEvent;
@@ -35,7 +35,7 @@ const Loop = jsruntime.Loop;
const YieldImpl = Loop.Yield(XMLHttpRequest);
const Client = @import("../async/Client.zig");
const parser = @import("../netsurf.zig");
const parser = @import("netsurf");
const UserContext = @import("../user_context.zig").UserContext;