From 4da152e9aaec1a13509647ea7bdfa9a6957b5799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 22 Sep 2026 15:42:35 +0200 Subject: [PATCH 01/47] agent: resolve the replay selector in the tool layer `--save` drops any tool call that names its element by `backendNodeId` and carries no selector (`Command.ToolCall.isRecorded`), because a registry id means nothing in a later session. That is a silent gap on the chat path: whenever the model addresses a node by id, the action runs and is then quietly omitted from the saved script. The tool layer is the one place that already resolves the node before acting, so it is where the selector can be taken while the node still exists -- a navigation takes it away a moment later. `CallOpts.record` asks for it and `ToolResult.selector` returns it, for every tool, with no per-tool knowledge anywhere. Recording then swaps `backendNodeId` for the selector and keeps every other argument, so `scroll`'s `y` and `waitForState`'s arguments survive. One `save_selectors` entry per call, errors included, so the index lines up with `RunToolsResult.tool_calls_made`. --- src/agent/Agent.zig | 50 ++++++++++++++++++++++++++++++++++++++----- src/browser/tools.zig | 39 ++++++++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 6 deletions(-) diff --git a/src/agent/Agent.zig b/src/agent/Agent.zig index 5207605ec..ae870f162 100644 --- a/src/agent/Agent.zig +++ b/src/agent/Agent.zig @@ -167,6 +167,11 @@ cancel_requested: std.atomic.Value(bool) = .init(false), /// mid-request instead of blocking until the model's full response arrives. http_interrupt: zenai.http.Interrupt = .{}, synthetic_tool_call_id: u32 = 0, +/// Per-turn CSS selector for each tool call the model made, in call order, so +/// `--save` can record a call that addressed its element by `backendNodeId`. +/// Only filled while `capturing_for_save`. +save_selectors: std.ArrayListUnmanaged(?[]const u8) = .empty, +capturing_for_save: bool = false, /// Aggregate Anthropic/OpenAI/Gemini token usage across every model call. /// Printed as a structured `$usage ...` line on stderr at the end of `--task` /// (one-shot) mode so wrappers can capture per-task cost. @@ -355,6 +360,7 @@ pub fn init(allocator: std.mem.Allocator, app: *App, opts: Config.Agent) !*Agent pub fn deinit(self: *Agent) void { self.terminal.uninstallLogSink(); self.save_buffer.deinit(); + self.save_selectors.deinit(self.allocator); if (self.save_path) |p| self.allocator.free(p); self.terminal.deinit(); self.conversation.deinit(); @@ -1328,6 +1334,21 @@ fn logSaveBufferError(self: *Agent, err: anyerror) void { self.terminal.printError("save buffer disabled: {s}", .{@errorName(err)}); } +/// Swap a call's ephemeral `backendNodeId` for the selector the tool layer +/// resolved, so the call can be replayed. Returns `args` untouched when there +/// is nothing to swap. +fn withSelector(arena: std.mem.Allocator, args: ?std.json.Value, selector: ?[]const u8) ?std.json.Value { + const sel = selector orelse return args; + const original = args orelse return args; + if (original != .object) return args; + if (!original.object.contains("backendNodeId")) return args; + + var rewritten = original.object.clone(arena) catch return args; + _ = rewritten.swapRemove("backendNodeId"); + rewritten.put(arena, "selector", .{ .string = sel }) catch return args; + return .{ .object = rewritten }; +} + fn recordSaveCommand(self: *Agent, cmd: Command) void { self.save_buffer.record(cmd) catch |err| self.logSaveBufferError(err); } @@ -1671,6 +1692,10 @@ fn processUserMessage(self: *Agent, input: TurnInput) !?[]const u8 { const provider_client = self.ai_client orelse return error.NoAiClient; self.refreshAuthIfNeeded(); + self.capturing_for_save = input.capture_for_save; + defer self.capturing_for_save = false; + self.save_selectors.clearRetainingCapacity(); + self.terminal.spinner.start(); var result = provider_client.runTools( self.model, @@ -1731,11 +1756,15 @@ fn processUserMessage(self: *Agent, input: TurnInput) !?[]const u8 { const args = browser_tools.normalizeArgKeys(ca, tool, tc.arguments) catch tc.arguments; // Fall back to the navigation a read tool performed, so a // markdown/tree-driven turn isn't lost from `/save`. - const cmd = Command.fromToolCall(tool, args); + // A call that named its element by id is unreplayable as-is; the + // tool layer resolved a selector for it while the node still + // existed. + const replayable = withSelector(ca, args, if (i < self.save_selectors.items.len) self.save_selectors.items[i] else null); + const cmd = Command.fromToolCall(tool, replayable); const to_record = if (cmd.isRecorded()) cmd else - navigationGoto(ca, tool, args) orelse continue; + navigationGoto(ca, tool, replayable) orelse continue; if (!recorded_any) { if (input.record_comment) |c| self.recordSaveComment(c); recorded_any = true; @@ -1888,10 +1917,17 @@ fn handleToolCall(ctx: *anyopaque, allocator: std.mem.Allocator, tool_name: []co self.terminal.spinner.setTool(tool_name, args_str); defer self.terminal.spinner.setThinking(); - const outcome = self.toolOutcome(allocator, tool_name, arguments) catch |err| zenai.provider.Client.ToolHandler.Result{ + var selector: ?[]const u8 = null; + const outcome = self.toolOutcome(allocator, tool_name, arguments, &selector) catch |err| zenai.provider.Client.ToolHandler.Result{ .content = std.fmt.allocPrint(allocator, "Error: {s}", .{browser_tools.errorMessage(err)}) catch "Error: tool execution failed", .is_error = true, }; + if (self.capturing_for_save) { + // One entry per call, errors included, so the index lines up with + // `RunToolsResult.tool_calls_made`. + const kept = if (selector) |sel| self.allocator.dupe(u8, sel) catch null else null; + self.save_selectors.append(self.allocator, kept) catch {}; + } self.terminal.agentToolDone(tool_name, args_str, !outcome.is_error); if (self.terminal.verbosity == .high) self.terminal.printToolOutcome(tool_name, outcome.content, outcome.is_error); @@ -1899,8 +1935,12 @@ fn handleToolCall(ctx: *anyopaque, allocator: std.mem.Allocator, tool_name: []co } /// The text plus the rendered PNG, for backends that can show the model an image. -fn toolOutcome(self: *Agent, allocator: std.mem.Allocator, tool_name: []const u8, arguments: ?std.json.Value) browser_tools.ToolError!zenai.provider.Client.ToolHandler.Result { - const result = try browser_tools.call(allocator, self.ts.session, &self.ts.registry, tool_name, arguments, .{ .inline_image = true }); +fn toolOutcome(self: *Agent, allocator: std.mem.Allocator, tool_name: []const u8, arguments: ?std.json.Value, selector: *?[]const u8) browser_tools.ToolError!zenai.provider.Client.ToolHandler.Result { + const result = try browser_tools.call(allocator, self.ts.session, &self.ts.registry, tool_name, arguments, .{ + .inline_image = true, + .record = self.capturing_for_save, + }); + selector.* = result.selector; const content = capToolOutput(allocator, tool_name, result.text); return .{ .content = content, diff --git a/src/browser/tools.zig b/src/browser/tools.zig index 9b8d31e52..9a7bfcf88 100644 --- a/src/browser/tools.zig +++ b/src/browser/tools.zig @@ -24,6 +24,8 @@ const NodeRegistry = @import("../NodeRegistry.zig"); const DOMNode = @import("webapi/Node.zig"); const Selector = @import("webapi/selector/Selector.zig"); +const SelectorPath = @import("SelectorPath.zig"); +const Element = @import("webapi/Element.zig"); const log = lp.log; const tavily = zenai.search.tavily; @@ -823,6 +825,10 @@ pub const ToolResult = struct { is_error: bool = false, /// Only set when the caller passed `CallOpts.inline_image`. image: ?lp.screenshot.Prepared = null, + /// Only set when the caller passed `CallOpts.record` and the call named its + /// element by `backendNodeId`. Resolved before the action runs, because a + /// navigation takes the node with it. + selector: ?[]const u8 = null, }; const GotoParams = struct { @@ -854,6 +860,11 @@ const NodeAndPage = struct { node: *DOMNode, page: *lp.Frame, target: ActionTarg pub const CallOpts = struct { /// The caller can hand an image to a model. inline_image: bool = false, + /// The caller is recording for `--save`/`/save`. A call that addresses its + /// element by `backendNodeId` gets `ToolResult.selector` filled in, since + /// a registry id means nothing in a later session and the node may be gone + /// by the time the caller wants to record it. + record: bool = false, }; // An inline screenshot is re-sent on every turn; keep it within what models @@ -886,13 +897,39 @@ pub fn call( }; const substituted = try substituteStringArgs(arena, tool, normalized); - return dispatch(arena, session, registry, tool, substituted, opts) catch |err| { + // Before dispatch: after a navigation the node is gone. + const selector = if (opts.record) selectorForArgs(arena, session, registry, substituted) else null; + + var result = dispatch(arena, session, registry, tool, substituted, opts) catch |err| { if (err == error.NavigationFailed) { if (formatNavigationError(arena, session)) |text| return .{ .text = text, .is_error = true }; } return err; }; + result.selector = selector; + return result; +} + +/// The CSS selector for a call's `backendNodeId`, so the call can be recorded +/// in a form that still resolves in a later session. Null when the arguments +/// name no node, already carry a selector, or the node cannot be named. +fn selectorForArgs( + arena: std.mem.Allocator, + session: *lp.Session, + registry: *NodeRegistry, + arguments: ?std.json.Value, +) ?[]const u8 { + const args = arguments orelse return null; + if (args != .object) return null; + if (args.object.contains("selector")) return null; + const id = args.object.get("backendNodeId") orelse return null; + if (id != .integer) return null; + + const node = registry.lookup_by_id.get(std.math.cast(NodeRegistry.Id, id.integer) orelse return null) orelse return null; + const el = node.dom.is(Element) orelse return null; + const frame = session.currentFrame() orelse return null; + return SelectorPath.init(arena, frame).build(el) catch null; } fn dispatch( From 1e081b5ac8013a286a450ed770f4de9fff2f1545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 22 Sep 2026 15:44:55 +0200 Subject: [PATCH 02/47] tools: collect search hits once, render them once The four per-engine markdown writers differed only in which response field holds the title, the url and the snippet; the numbering, the newline flattening and the "No results." case were copied four times. Each engine now contributes a `collect` that maps its response onto `[]Hit`, and one `renderResults` turns those into the markdown the model reads. Adding an engine is a field mapping rather than another copy of the renderer, and the intermediate `SearchResults` is a shape a caller can use directly instead of re-parsing markdown. Output is byte-identical -- the existing tests assert the exact strings and are unchanged apart from calling the new pair. --- src/browser/tools.zig | 158 +++++++++++++++++++++--------------------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/src/browser/tools.zig b/src/browser/tools.zig index 9a7bfcf88..68b53c43f 100644 --- a/src/browser/tools.zig +++ b/src/browser/tools.zig @@ -1092,7 +1092,7 @@ const api_engines = .{ .init_options = brave.Client.InitOptions{}, // text_decorations=false: no markup in model-read snippets. .options = brave.types.SearchOptions{ .count = 10, .text_decorations = false }, - .format = formatBraveMarkdown, + .collect = collectBrave, }, .{ .tag = SearchEngine.tavily, @@ -1100,7 +1100,7 @@ const api_engines = .{ .Client = tavily.Client, .init_options = tavily.Client.InitOptions{}, .options = tavily.types.SearchOptions{ .max_results = 10 }, - .format = formatTavilyMarkdown, + .collect = collectTavily, }, .{ .tag = SearchEngine.exa, @@ -1110,7 +1110,7 @@ const api_engines = .{ // highlights: Exa returns no snippet text unless contents is requested; // capped at 3 sentences since the default excerpts run long. .options = exa.types.SearchOptions{ .numResults = 10, .contents = .{ .highlights = .{ .numSentences = 3 } } }, - .format = formatExaMarkdown, + .collect = collectExa, }, .{ .tag = SearchEngine.keenable, @@ -1120,7 +1120,7 @@ const api_engines = .{ // snippet_max_length is a hint the API may round up to a word // boundary; 500 keeps ten results within a few KB of context. .options = keenable.types.SearchOptions{ .max_results = 10, .snippet_max_length = 500 }, - .format = formatKeenableMarkdown, + .collect = collectKeenable, }, }; @@ -1261,54 +1261,66 @@ fn apiSearch( }; defer response.deinit(); + return renderResults(arena, try engine.collect(arena, response.value)); +} + +pub const Hit = struct { + title: []const u8, + url: []const u8, + snippet: []const u8, +}; + +pub const SearchResults = struct { + /// Tavily's synthesized answer; empty for the engines that have none. + answer: []const u8 = "", + hits: []const Hit = &.{}, +}; + +fn collectTavily(arena: std.mem.Allocator, resp: tavily.types.SearchResponse) !SearchResults { + const hits = try arena.alloc(Hit, resp.results.len); + for (resp.results, hits) |r, *hit| hit.* = .{ .title = r.title, .url = r.url, .snippet = r.content }; + return .{ .answer = resp.answer orelse "", .hits = hits }; +} + +fn collectBrave(arena: std.mem.Allocator, resp: brave.types.SearchResponse) !SearchResults { + const results: []const brave.types.Result = if (resp.web) |web| web.results else &.{}; + const hits = try arena.alloc(Hit, results.len); + for (results, hits) |r, *hit| hit.* = .{ .title = r.title, .url = r.url, .snippet = r.description }; + return .{ .hits = hits }; +} + +fn collectExa(arena: std.mem.Allocator, resp: exa.types.SearchResponse) !SearchResults { + const hits = try arena.alloc(Hit, resp.results.len); + for (resp.results, hits) |r, *hit| { + const highlights = r.highlights orelse &[_][]const u8{}; + hit.* = .{ + .title = r.title orelse "", + .url = r.url, + .snippet = if (highlights.len > 0) highlights[0] else "", + }; + } + return .{ .hits = hits }; +} + +fn collectKeenable(arena: std.mem.Allocator, resp: keenable.types.SearchResponse) !SearchResults { + const hits = try arena.alloc(Hit, resp.results.len); + // snippet carries the page text (the wire format's always-empty + // `description` is deliberately not even mapped by the client). + for (resp.results, hits) |r, *hit| hit.* = .{ .title = r.title, .url = r.url, .snippet = r.snippet }; + return .{ .hits = hits }; +} + +fn renderResults(arena: std.mem.Allocator, results: SearchResults) ToolError![]const u8 { + if (results.answer.len == 0 and results.hits.len == 0) return "No results."; var aw: std.Io.Writer.Allocating = .init(arena); - try engine.format(&aw.writer, response.value); + const w = &aw.writer; + renderInto(w, results) catch return ToolError.OutOfMemory; return aw.written(); } -fn formatTavilyMarkdown(w: *std.Io.Writer, resp: tavily.types.SearchResponse) !void { - const answer = resp.answer orelse ""; - if (answer.len == 0 and resp.results.len == 0) { - return w.writeAll("No results."); - } - if (answer.len > 0) { - try w.print("**Answer:** {s}\n\n", .{answer}); - } - for (resp.results, 0..) |r, i| { - try writeResultItem(w, i, r.title, r.url, r.content); - } -} - -fn formatBraveMarkdown(w: *std.Io.Writer, resp: brave.types.SearchResponse) !void { - const results: []const brave.types.Result = if (resp.web) |web| web.results else &.{}; - if (results.len == 0) { - return w.writeAll("No results."); - } - for (results, 0..) |r, i| { - try writeResultItem(w, i, r.title, r.url, r.description); - } -} - -fn formatExaMarkdown(w: *std.Io.Writer, resp: exa.types.SearchResponse) !void { - if (resp.results.len == 0) { - return w.writeAll("No results."); - } - for (resp.results, 0..) |r, i| { - const highlights = r.highlights orelse &[_][]const u8{}; - const snippet = if (highlights.len > 0) highlights[0] else ""; - try writeResultItem(w, i, r.title orelse "", r.url, snippet); - } -} - -fn formatKeenableMarkdown(w: *std.Io.Writer, resp: keenable.types.SearchResponse) !void { - if (resp.results.len == 0) { - return w.writeAll("No results."); - } - for (resp.results, 0..) |r, i| { - // snippet carries the page text (the wire format's always-empty - // `description` is deliberately not even mapped by the client). - try writeResultItem(w, i, r.title, r.url, r.snippet); - } +fn renderInto(w: *std.Io.Writer, results: SearchResults) !void { + if (results.answer.len > 0) try w.print("**Answer:** {s}\n\n", .{results.answer}); + for (results.hits, 0..) |hit, i| try writeResultItem(w, i, hit.title, hit.url, hit.snippet); } /// An empty title (providers default it to "") would render as `****`. @@ -2782,7 +2794,7 @@ test "formatLpEnvNames reports empty when no names" { try std.testing.expectEqualStrings("No LP_* environment variables are set.", r); } -test "formatTavilyMarkdown renders answer and results" { +test "collectTavily renders answer and results" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); @@ -2796,9 +2808,7 @@ test "formatTavilyMarkdown renders answer and results" { }, }; - var aw: std.Io.Writer.Allocating = .init(aa); - try formatTavilyMarkdown(&aw.writer, resp); - const md = aw.written(); + const md = try renderResults(aa, try collectTavily(aa, resp)); try std.testing.expect(std.mem.indexOf(u8, md, "**Answer:** Paris") != null); try std.testing.expect(std.mem.indexOf(u8, md, "1. **Paris - Wikipedia**") != null); try std.testing.expect(std.mem.indexOf(u8, md, "https://en.wikipedia.org/wiki/Paris") != null); @@ -2806,17 +2816,15 @@ test "formatTavilyMarkdown renders answer and results" { try std.testing.expect(std.mem.indexOf(u8, md, "2. **France**") != null); } -test "formatTavilyMarkdown handles empty results" { +test "collectTavily handles empty results" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); - var aw: std.Io.Writer.Allocating = .init(aa); - try formatTavilyMarkdown(&aw.writer, .{}); - try std.testing.expectEqualStrings("No results.", aw.written()); + try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectTavily(aa, .{}))); } -test "formatBraveMarkdown renders web results" { +test "collectBrave renders web results" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); @@ -2830,30 +2838,24 @@ test "formatBraveMarkdown renders web results" { }, }; - var aw: std.Io.Writer.Allocating = .init(aa); - try formatBraveMarkdown(&aw.writer, resp); - const md = aw.written(); + const md = try renderResults(aa, try collectBrave(aa, resp)); try std.testing.expect(std.mem.indexOf(u8, md, "1. **Paris - Wikipedia**") != null); try std.testing.expect(std.mem.indexOf(u8, md, "https://en.wikipedia.org/wiki/Paris") != null); try std.testing.expect(std.mem.indexOf(u8, md, "Paris is the capital of France.") != null); try std.testing.expect(std.mem.indexOf(u8, md, "2. **France**") != null); } -test "formatBraveMarkdown handles empty results" { +test "collectBrave handles empty results" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); - var no_web: std.Io.Writer.Allocating = .init(aa); - try formatBraveMarkdown(&no_web.writer, .{}); - try std.testing.expectEqualStrings("No results.", no_web.written()); + try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectBrave(aa, .{}))); - var empty_web: std.Io.Writer.Allocating = .init(aa); - try formatBraveMarkdown(&empty_web.writer, .{ .web = .{} }); - try std.testing.expectEqualStrings("No results.", empty_web.written()); + try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectBrave(aa, .{ .web = .{} }))); } -test "formatKeenableMarkdown reads snippet" { +test "collectKeenable reads snippet" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); @@ -2866,9 +2868,7 @@ test "formatKeenableMarkdown reads snippet" { }, }; - var aw: std.Io.Writer.Allocating = .init(aa); - try formatKeenableMarkdown(&aw.writer, resp); - const md = aw.written(); + const md = try renderResults(aa, try collectKeenable(aa, resp)); try std.testing.expect(std.mem.indexOf(u8, md, "1. **Zig (programming language)**") != null); try std.testing.expect(std.mem.indexOf(u8, md, "Zig is a system programming language.") != null); try std.testing.expect(std.mem.indexOf(u8, md, "2. **Zig guide**") != null); @@ -2883,15 +2883,14 @@ test "writeResultItem uses the URL as title when the title is empty" { try std.testing.expectEqualStrings("1. **https://example.org/x.pdf** — https://example.org/x.pdf\n snippet\n\n", aw.written()); } -test "formatKeenableMarkdown handles empty results" { +test "collectKeenable handles empty results" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); - var aw: std.Io.Writer.Allocating = .init(arena.allocator()); - try formatKeenableMarkdown(&aw.writer, .{}); - try std.testing.expectEqualStrings("No results.", aw.written()); + const aa = arena.allocator(); + try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectKeenable(aa, .{}))); } -test "formatBraveMarkdown flattens newlines in titles and descriptions" { +test "collectBrave flattens newlines in titles and descriptions" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); @@ -2904,9 +2903,10 @@ test "formatBraveMarkdown flattens newlines in titles and descriptions" { }, }; - var aw: std.Io.Writer.Allocating = .init(aa); - try formatBraveMarkdown(&aw.writer, resp); - try std.testing.expectEqualStrings("1. **Multi line title** — https://example.org\n line one line two\n\n", aw.written()); + try std.testing.expectEqualStrings( + "1. **Multi line title** — https://example.org\n line one line two\n\n", + try renderResults(aa, try collectBrave(aa, resp)), + ); } test "isPathSafe: relative paths without traversal are accepted" { From 1c9b1b8bc203e94e300331a98b5f694ee2ac962d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 22 Sep 2026 15:47:35 +0200 Subject: [PATCH 03/47] tools: tell the caller why a search failed A failed search reported only the error name: "keenable search failed: ApiError". The status code and the provider's own message were logged once inside `apiSearch` and then died with the client on its deferred deinit, so nothing downstream could tell a rate limit from a rejected key -- and a model reading the tool result had nothing to act on. `Failure` carries the status and body out before the client goes, and the message now names both. A 429 additionally says it is a rate limit and that waiting or reading the page instead are the ways out, because that is the one failure where the right move is not "try another query". Found by a benchmark run where a keyless search engine quietly hit its hourly cap; every search failed for twenty minutes and the run just looked like a bad agent. --- src/browser/tools.zig | 77 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 10 deletions(-) diff --git a/src/browser/tools.zig b/src/browser/tools.zig index 68b53c43f..5b597dfdc 100644 --- a/src/browser/tools.zig +++ b/src/browser/tools.zig @@ -1187,19 +1187,26 @@ fn execSearch(arena: std.mem.Allocator, arguments: ?std.json.Value) ToolError!To switch (search_engine) { .auto => { var last_err: ?anyerror = null; + var last_label: []const u8 = "web"; + var last_detail: Failure = .{}; inline for (api_engines) |engine| { if (engineKey(engine)) |api_key| { // Fall through on any failure so one outage doesn't kill // a whole benchmark run. - if (apiSearch(engine, arena, api_key, timeout_ms, args.query)) |markdown_| { + var detail: Failure = .{}; + if (apiSearch(engine, arena, api_key, timeout_ms, args.query, &detail)) |markdown_| { return .{ .text = markdown_ }; } else |err| { last_err = err; + last_label = @tagName(engine.tag); + last_detail = detail; log.warn(.browser, @tagName(engine.tag) ++ " fallback", .{ .err = err }); } } else |_| {} } - return searchFailed(arena, "web", last_err.?); + // The last rung's reason, not a generic one: every engine having + // failed is usually one cause, and the model can act on it. + return searchFailed(arena, last_label, last_err.?, last_detail); }, inline else => |tag| { inline for (api_engines) |engine| { @@ -1217,25 +1224,47 @@ fn searchExplicit(arena: std.mem.Allocator, comptime engine: anytype, timeout_ms .text = "web search engine is set to " ++ label ++ " but " ++ engine.env_var ++ " is not set in the environment", .is_error = true, }; - const markdown_ = apiSearch(engine, arena, api_key, timeout_ms, query) catch |err| - return searchFailed(arena, label, err); + var detail: Failure = .{}; + const markdown_ = apiSearch(engine, arena, api_key, timeout_ms, query, &detail) catch |err| + return searchFailed(arena, label, err, detail); return .{ .text = markdown_ }; } -fn searchFailed(arena: std.mem.Allocator, comptime label: []const u8, err: anyerror) ToolError!ToolResult { - return .{ - .text = try std.fmt.allocPrint(arena, label ++ " search failed: {s}", .{@errorName(err)}), - .is_error = true, - }; +/// What the provider said, duped out of the client before `deinit` takes it. +/// Without this the status and body survive only in a log line, and every +/// failure reaches the model as the word `InternalError`. +const Failure = struct { + status: ?u10 = null, + message: []const u8 = "", +}; + +/// A rate limit and a bad key need different reactions, so the model is told +/// which it hit rather than just that the search failed. +fn searchFailed(arena: std.mem.Allocator, label: []const u8, err: anyerror, detail: Failure) ToolError!ToolResult { + var aw: std.Io.Writer.Allocating = .init(arena); + const w = &aw.writer; + w.print("{s} search failed: {s}", .{ label, @errorName(err) }) catch return ToolError.OutOfMemory; + if (detail.status) |status| w.print(" (HTTP {d})", .{status}) catch return ToolError.OutOfMemory; + if (detail.message.len > 0) { + w.writeAll(": ") catch return ToolError.OutOfMemory; + writeSingleLine(w, detail.message) catch return ToolError.OutOfMemory; + } + if (detail.status == 429) { + w.writeAll(". This engine is rate-limited right now; wait before retrying, or read the answer from a page instead.") catch + return ToolError.OutOfMemory; + } + return .{ .text = aw.written(), .is_error = true }; } -/// `arena` owns the returned slice. +/// `arena` owns the returned slice. `detail` is filled on a non-2xx so the +/// caller can say what actually happened. fn apiSearch( comptime engine: anytype, arena: std.mem.Allocator, api_key: ?[]const u8, timeout_ms: u32, query: []const u8, + detail: *Failure, ) ![]const u8 { var init_options = engine.init_options; // The cascade (or the model) is the retry; honoring a Retry-After (60 s @@ -1256,6 +1285,11 @@ fn apiSearch( .status = status, .body = client.last_error.body, }); + // `client.last_error` dies with the client on the deferred deinit. + detail.* = .{ + .status = status, + .message = if (client.last_error.body) |b| (arena.dupe(u8, b) catch "") else "", + }; } return err; }; @@ -2909,6 +2943,29 @@ test "collectBrave flattens newlines in titles and descriptions" { ); } +test "searchFailed: a rate limit says so, a bare failure stays short" { + var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); + defer arena.deinit(); + const aa = arena.allocator(); + + const limited = try searchFailed(aa, "keenable", error.ApiError, .{ + .status = 429, + .message = "Public API hourly limit reached.\nWait 2 minutes to continue.", + }); + try std.testing.expect(limited.is_error); + // The status and the provider's own words, which previously reached the + // model only as the word "ApiError". + try std.testing.expect(std.mem.indexOf(u8, limited.text, "(HTTP 429)") != null); + try std.testing.expect(std.mem.indexOf(u8, limited.text, "Public API hourly limit reached.") != null); + try std.testing.expect(std.mem.indexOf(u8, limited.text, "rate-limited right now") != null); + // Flattened: a newline would break the numbered-list markdown around it. + try std.testing.expect(std.mem.indexOf(u8, limited.text, "\n") == null); + + const bare = try searchFailed(aa, "web", error.ConnectionRefused, .{}); + try std.testing.expectEqualStrings("web search failed: ConnectionRefused", bare.text); + try std.testing.expect(bare.is_error); +} + test "isPathSafe: relative paths without traversal are accepted" { try std.testing.expect(isPathSafe("foo.txt")); try std.testing.expect(isPathSafe("./foo.txt")); From 92a6b698fce611bfdd5d521edf5b246b32c90cd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 22 Sep 2026 15:50:15 +0200 Subject: [PATCH 04/47] agent: --search-engine, and say when the engine has no key The search engine could only be set from the REPL's `/searchEngine`, so a one-shot run had no way to pin one -- and a benchmark that wants its results to mean something has to record which API answered. `/searchEngine` also carried the only warning about key state, which is the half that matters more. A keyless engine is not an error and starts fine, so a run that silently falls back to a rate-limited public endpoint looks exactly like a working one until every search begins failing, and then it looks like a bad agent. Both messages now fire wherever the engine is resolved, not just from the command. `resolveSearchEngine`'s doc comment said there was no CLI flag. There is one now. --- src/Config.zig | 2 ++ src/agent/Agent.zig | 10 +++++++++- src/agent/settings.zig | 4 ++-- src/help.zon | 6 ++++++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/Config.zig b/src/Config.zig index 708236f5b..493cb8c1a 100644 --- a/src/Config.zig +++ b/src/Config.zig @@ -347,6 +347,7 @@ pub const AiProvider = std.meta.Tag(zenai.provider.Client); /// in `Agent.init` (explicit flag > remembered > mode default), so there is /// no Config-level accessor like `agentVerbosity`. pub const Effort = zenai.provider.Effort; +pub const SearchEngine = @import("browser/tools.zig").SearchEngine; /// Controls how chatty `agent` mode is on stderr. pub const AgentVerbosity = enum { @@ -470,6 +471,7 @@ const Commands = cli.Builder(.{ .{ .name = "attach", .short = 'a', .type = []const u8, .multiple = true }, .{ .name = "verbosity", .type = ?AgentVerbosity }, .{ .name = "effort", .type = ?Effort }, + .{ .name = "search_engine", .type = ?SearchEngine }, .{ .name = "list_models", .type = bool }, .{ .name = "no_llm", .type = bool }, }, diff --git a/src/agent/Agent.zig b/src/agent/Agent.zig index ae870f162..9f4f0f219 100644 --- a/src/agent/Agent.zig +++ b/src/agent/Agent.zig @@ -289,7 +289,15 @@ pub fn init(allocator: std.mem.Allocator, app: *App, opts: Config.Agent) !*Agent const effort = settings.resolveEffort(opts, remembered, will_repl, if (resolved) |r| r.credential.provider else null); const verbosity = settings.resolveVerbosity(opts, remembered); const stream_enabled = settings.resolveStream(remembered); - browser_tools.search_engine = settings.resolveSearchEngine(remembered); + browser_tools.search_engine = opts.search_engine orelse settings.resolveSearchEngine(remembered); + // Only the REPL's `/searchEngine` used to say this. A keyless engine that + // has hit its cap fails every search, and without a word here that reads + // as a bad agent rather than a missing key. + if (browser_tools.searchKeyStatus(browser_tools.search_engine)) |key| switch (key.state) { + .set => {}, + .keyless => log.info(.app, "keyless search endpoint", .{ .env_var = key.env_var, .limit = "rate-limited per client IP" }), + .missing => log.warn(.app, "search key missing", .{ .env_var = key.env_var, .engine = @tagName(browser_tools.search_engine) }), + }; if (resolved) |r| { if (r.source == .picked) { diff --git a/src/agent/settings.zig b/src/agent/settings.zig index 1e90b714b..8c6d00b9e 100644 --- a/src/agent/settings.zig +++ b/src/agent/settings.zig @@ -369,8 +369,8 @@ pub fn resolveStream(remembered: ?Remembered) bool { return true; } -/// Precedence: remembered `.lp-agent.zon` value > default (auto). No CLI -/// flag — the REPL `/searchEngine` command sets and persists it. +/// Precedence: `--search-engine` > remembered `.lp-agent.zon` value > +/// default (auto). The REPL `/searchEngine` command also sets and persists it. pub fn resolveSearchEngine(remembered: ?Remembered) lp.tools.SearchEngine { if (remembered) |r| if (r.search_engine) |e| return e; return .auto; diff --git a/src/help.zon b/src/help.zon index fc329aafb..d59303992 100644 --- a/src/help.zon +++ b/src/help.zon @@ -297,6 +297,12 @@ \\ it to PATH, instead of printing the answer. Replay it later with \\ `run PATH` (no LLM calls). Overwrites PATH if it exists. \\ Requires --task. + \\ --search-engine + \\ Which web search API the `search` tool uses. Default: auto, + \\ which takes the first with a key in the environment, in the + \\ order brave, tavily, exa, keenable. `keenable` also works with + \\ no key at all, through a rate-limited public endpoint. + \\ Allowed values: auto, brave, tavily, exa, keenable. \\ --system-prompt \\ Override the default system prompt. \\ --task From 006af21a6d24e674367d6ec42b1b5da534664cd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 22 Sep 2026 15:52:07 +0200 Subject: [PATCH 05/47] agent: --url opens a start page before the first turn A `--task` run that knows where it is going still spent a model turn navigating there, and the REPL had no way to start anywhere but blank. `--url` opens the page first, through `browser_tools.call` rather than around it, so a bad URL fails like any other tool call and the opening navigation is recorded for `--save` -- which is the first line any replayable script needs anyway. --- src/Config.zig | 1 + src/agent/Agent.zig | 26 ++++++++++++++++++++++++++ src/help.zon | 4 ++++ 3 files changed, 31 insertions(+) diff --git a/src/Config.zig b/src/Config.zig index 493cb8c1a..3a564142c 100644 --- a/src/Config.zig +++ b/src/Config.zig @@ -472,6 +472,7 @@ const Commands = cli.Builder(.{ .{ .name = "verbosity", .type = ?AgentVerbosity }, .{ .name = "effort", .type = ?Effort }, .{ .name = "search_engine", .type = ?SearchEngine }, + .{ .name = "url", .type = ?[:0]const u8 }, .{ .name = "list_models", .type = bool }, .{ .name = "no_llm", .type = bool }, }, diff --git a/src/agent/Agent.zig b/src/agent/Agent.zig index 9f4f0f219..4e7005110 100644 --- a/src/agent/Agent.zig +++ b/src/agent/Agent.zig @@ -159,6 +159,9 @@ model: []u8, /// Per-turn reasoning budget for LLM turns. Mutable at runtime via `/effort`. effort: Config.Effort, script_file: ?[]const u8, +/// `--url`: opened before the first turn, in every mode. A `--task` run that +/// starts on its page does not spend a model turn navigating to it. +start_url: ?[:0]const u8, one_shot_task: ?[]const u8, one_shot_save: ?[]const u8, one_shot_attachments: ?[]const []const u8, @@ -333,6 +336,7 @@ pub fn init(allocator: std.mem.Allocator, app: *App, opts: Config.Agent) !*Agent .effort = effort, .stream_enabled = stream_enabled, .script_file = opts.script_file, + .start_url = opts.url, .one_shot_task = opts.task, .one_shot_save = opts.save, .one_shot_attachments = if (opts.attach.items.len == 0) null else opts.attach.items, @@ -513,6 +517,12 @@ const TurnInput = struct { /// Returns true on success. pub fn run(self: *Agent) bool { + if (self.start_url) |url| { + if (self.gotoStart(url, self.one_shot_save != null)) |err| { + self.terminal.printError("could not open {s}: {s}", .{ url, browser_tools.errorMessage(err) }); + return false; + } + } if (self.one_shot_task) |task| { const saving = self.one_shot_save != null; const ok = self.runTurn(.{ @@ -540,6 +550,22 @@ pub fn run(self: *Agent) bool { /// `$usage` prefix. Stable key=value format: /// $usage prompt=N completion=N total=N cached=N cache_creation=N /// Fields emit 0 when the provider didn't report them. +/// Goes through the tool layer so a failed start reads like any other tool +/// failure. +fn gotoStart(self: *Agent, url: [:0]const u8, record: bool) ?browser_tools.ToolError { + var arena: std.heap.ArenaAllocator = .init(self.allocator); + defer arena.deinit(); + const a = arena.allocator(); + + var object: std.json.ObjectMap = .empty; + object.put(a, "url", .{ .string = url }) catch return browser_tools.ToolError.OutOfMemory; + const args: std.json.Value = .{ .object = object }; + _ = browser_tools.call(a, self.ts.session, &self.ts.registry, "goto", args, .{}) catch |err| return err; + // The opening navigation is the first line of any replayable script. + if (record) self.recordSaveCommand(Command.fromToolCall(.goto, args)); + return null; +} + fn printUsageSummary(self: *Agent) void { const u = self.total_usage; std.debug.print( diff --git a/src/help.zon b/src/help.zon index d59303992..32667fd1f 100644 --- a/src/help.zon +++ b/src/help.zon @@ -309,6 +309,10 @@ \\ One-shot mode: run a single user turn, print the final answer \\ to stdout, and exit. Conflicts with the positional script. With \\ --save, the answer is suppressed and a script is written instead. + \\ --url + \\ Open this page before the first turn. With --task it saves the + \\ model a turn spent navigating; with --save the opening + \\ navigation is the first line of the script. \\ --verbosity \\ Stderr chatter level. Default: high when --task captures stderr \\ to a pipe or file; low otherwise. low/medium also raise From b012c44fa000ed86886efd5c3864b83c961b1f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 22 Sep 2026 15:53:00 +0200 Subject: [PATCH 06/47] SemanticTree: walk once, in visitAll `jsonStringify` and `textStringify` each carried their own copy of the same six-line preamble -- xpath buffer, listener target map, label index, walk, error log -- differing only in the visitor and the wording of the log line. Either one could drift from the other silently, since nothing compares them. `visitAll` takes the visitor and owns the walk; both dumpers are now one line. Their existing tests cover it. --- src/SemanticTree.zig | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/src/SemanticTree.zig b/src/SemanticTree.zig index aab3576ce..01bf01e6a 100644 --- a/src/SemanticTree.zig +++ b/src/SemanticTree.zig @@ -66,8 +66,10 @@ pub fn init(arena: std.mem.Allocator, node: *Node, registry: *NodeRegistry, fram }; } -pub fn jsonStringify(self: @This(), jw: *std.json.Stringify) error{WriteFailed}!void { - var visitor = JsonVisitor{ .jw = jw, .tree = self }; +/// Walk the pruned tree with `visitor`: `visit(*Node, *NodeData) !bool` +/// returns whether to descend into the children, `leave() !void` closes a +/// visited node. +pub fn visitAll(self: @This(), visitor: anytype) error{WriteFailed}!void { var xpath_buffer: std.ArrayList(u8) = .empty; const listener_targets = interactive.buildListenerTargetMap(self.frame, self.arena) catch |err| { log.err(.app, "listener map failed", .{ .err = err }); @@ -79,29 +81,20 @@ pub fn jsonStringify(self: @This(), jw: *std.json.Stringify) error{WriteFailed}! .listener_targets = listener_targets, .label_index = &label_index, }; - self.walk(&ctx, self.dom_node, null, &visitor, 1, 0) catch |err| { - log.err(.app, "semantic tree json dump failed", .{ .err = err }); + self.walk(&ctx, self.dom_node, null, visitor, 1, 0) catch |err| { + log.err(.app, "semantic tree walk failed", .{ .err = err }); return error.WriteFailed; }; } +pub fn jsonStringify(self: @This(), jw: *std.json.Stringify) error{WriteFailed}!void { + var visitor = JsonVisitor{ .jw = jw, .tree = self }; + return self.visitAll(&visitor); +} + pub fn textStringify(self: @This(), writer: *std.Io.Writer) error{WriteFailed}!void { var visitor = TextVisitor{ .writer = writer, .tree = self, .depth = 0 }; - var xpath_buffer: std.ArrayList(u8) = .empty; - const listener_targets = interactive.buildListenerTargetMap(self.frame, self.arena) catch |err| { - log.err(.app, "listener map failed", .{ .err = err }); - return error.WriteFailed; - }; - var label_index: Label.LabelByForIndex = .{}; - var ctx: WalkContext = .{ - .xpath_buffer = &xpath_buffer, - .listener_targets = listener_targets, - .label_index = &label_index, - }; - self.walk(&ctx, self.dom_node, null, &visitor, 1, 0) catch |err| { - log.err(.app, "semantic tree text dump failed", .{ .err = err }); - return error.WriteFailed; - }; + return self.visitAll(&visitor); } const OptionData = struct { From 182ad25157aa34bf041da7d55c1ed6180e5db95e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 22 Sep 2026 15:53:21 +0200 Subject: [PATCH 07/47] NodeRegistry: pin that reset never reuses an id `reset` clears the lookup maps and deliberately leaves `node_id` where it is, so a stale id fails closed with a miss instead of resolving to whatever registers next. Nothing asserted that, and it is the invariant every id-addressed tool call leans on across a navigation. --- src/NodeRegistry.zig | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/NodeRegistry.zig b/src/NodeRegistry.zig index c48213d80..40f5a81fd 100644 --- a/src/NodeRegistry.zig +++ b/src/NodeRegistry.zig @@ -190,3 +190,21 @@ test "NodeRegistry: resetFrame" { try testing.expectEqual(rb, registry.lookup_by_id.get(rb.id).?); try testing.expectEqual(b_node, registry.lookup_by_node.get(b_node).?.dom); } + +test "NodeRegistry: reset never reuses an id" { + var registry = NodeRegistry.init(testing.allocator); + defer registry.deinit(); + + var page = try testing.pageTest("cdp/registry1.html", .{}); + defer page.close(); + + const frame = page.frame().?; + const dom_node = (try frame.window._document.querySelector(.wrap("#a1"), frame)).?.asNode(); + // The pool recycles the `Node` itself, so keep the id, not the pointer. + const first_id = (try registry.register(dom_node)).id; + + registry.reset(); + try testing.expectEqual(null, registry.lookup_by_id.get(first_id)); + // A stale id stays a miss rather than resolving to whatever registers next. + try testing.expect((try registry.register(dom_node)).id != first_id); +} From c839d1fcca93dc1c4d878c96c4613f360f1cf68a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 22 Sep 2026 15:54:16 +0200 Subject: [PATCH 08/47] agent: refuse to save a script the model did not finish `/save` synthesis never looked at `finish_reason`, and `stripCodeFence` accepts a fenced block with no closing fence. A script cut off at `max_tokens` therefore looked exactly like a complete one: it was written to disk, the save path was remembered, the buffer was reset and the terminal said "Saved synthesized script to ...". The truncation only turned up on replay. It now aborts like any other failed synthesis, leaving the previous file and the buffer alone. --- src/agent/Agent.zig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/agent/Agent.zig b/src/agent/Agent.zig index 4e7005110..eb13cebb9 100644 --- a/src/agent/Agent.zig +++ b/src/agent/Agent.zig @@ -1311,6 +1311,13 @@ fn synthesizeSaveTo(self: *Agent, arena: std.mem.Allocator, path: []const u8, mo return; } + // `stripCodeFence` accepts a block with no closing fence, so a script cut + // off mid-statement is indistinguishable from a complete one once it is on + // disk. Refuse rather than save something that will not replay. + if (result.finish_reason == .max_tokens) { + return self.abortSave(baseline, "the model ran out of output tokens mid-script"); + } + const raw = result.text orelse return self.abortSave(baseline, "the model returned no script"); // `result.text` lives in the conversation arena, freed by the rollback From 2f0d037a53581b9e713b3c970c215e8d6f405d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 22 Sep 2026 16:12:43 +0200 Subject: [PATCH 09/47] agent: tighten the backported fixes Review pass over the branch. `selectorForArgs` ran for any call carrying a `backendNodeId`, before `isRecorded` was consulted. `SelectorPath.build` is the expensive part of a tool call -- uncached full-document matches per ancestor -- and the read-only tools that take an id (tree, markdown, html, nodeDetails) are exactly the ones the system prompt steers toward ids, so the common case built a selector and threw it away. `nodeDetails` built it twice. The recorded selectors were duped into `self.allocator` and never freed: `clearRetainingCapacity` drops the only pointers. They belong to the conversation arena, which already owns the args and the `Command` built from them, so the ownership question disappears rather than being patched with a free loop. `searchKeyStatus` returned null for `.auto`, which is the default -- so the keyless-endpoint notice never fired in the one configuration that reaches a keyless endpoint. It now reports the rung the cascade lands on. `gotoStart` was inserted between `printUsageSummary`'s doc comment and the function, leaving the `$usage` wire format -- which wrapper scripts grep -- documenting the wrong function. It also returned `?ToolError` where the rest of the file uses error unions. Plus: the three search collectors differed only in a field name, the failure writer had five `catch return OutOfMemory` in ten lines beside a neighbour doing it with one, `visitAll` was `pub` with no caller outside its file, and the tests named themselves after a function that no longer renders anything. --- src/NodeRegistry.zig | 1 - src/SemanticTree.zig | 2 +- src/agent/Agent.zig | 51 +++++++---------- src/browser/tools.zig | 130 ++++++++++++++++++++++-------------------- 4 files changed, 91 insertions(+), 93 deletions(-) diff --git a/src/NodeRegistry.zig b/src/NodeRegistry.zig index 40f5a81fd..a9347e36b 100644 --- a/src/NodeRegistry.zig +++ b/src/NodeRegistry.zig @@ -205,6 +205,5 @@ test "NodeRegistry: reset never reuses an id" { registry.reset(); try testing.expectEqual(null, registry.lookup_by_id.get(first_id)); - // A stale id stays a miss rather than resolving to whatever registers next. try testing.expect((try registry.register(dom_node)).id != first_id); } diff --git a/src/SemanticTree.zig b/src/SemanticTree.zig index 01bf01e6a..74794c1ff 100644 --- a/src/SemanticTree.zig +++ b/src/SemanticTree.zig @@ -69,7 +69,7 @@ pub fn init(arena: std.mem.Allocator, node: *Node, registry: *NodeRegistry, fram /// Walk the pruned tree with `visitor`: `visit(*Node, *NodeData) !bool` /// returns whether to descend into the children, `leave() !void` closes a /// visited node. -pub fn visitAll(self: @This(), visitor: anytype) error{WriteFailed}!void { +fn visitAll(self: @This(), visitor: anytype) error{WriteFailed}!void { var xpath_buffer: std.ArrayList(u8) = .empty; const listener_targets = interactive.buildListenerTargetMap(self.frame, self.arena) catch |err| { log.err(.app, "listener map failed", .{ .err = err }); diff --git a/src/agent/Agent.zig b/src/agent/Agent.zig index eb13cebb9..33cfbc88e 100644 --- a/src/agent/Agent.zig +++ b/src/agent/Agent.zig @@ -159,8 +159,8 @@ model: []u8, /// Per-turn reasoning budget for LLM turns. Mutable at runtime via `/effort`. effort: Config.Effort, script_file: ?[]const u8, -/// `--url`: opened before the first turn, in every mode. A `--task` run that -/// starts on its page does not spend a model turn navigating to it. +/// `--url`: opened before the first turn, so a `--task` run does not spend a +/// model turn navigating to its own start page. start_url: ?[:0]const u8, one_shot_task: ?[]const u8, one_shot_save: ?[]const u8, @@ -172,7 +172,6 @@ http_interrupt: zenai.http.Interrupt = .{}, synthetic_tool_call_id: u32 = 0, /// Per-turn CSS selector for each tool call the model made, in call order, so /// `--save` can record a call that addressed its element by `backendNodeId`. -/// Only filled while `capturing_for_save`. save_selectors: std.ArrayListUnmanaged(?[]const u8) = .empty, capturing_for_save: bool = false, /// Aggregate Anthropic/OpenAI/Gemini token usage across every model call. @@ -293,9 +292,8 @@ pub fn init(allocator: std.mem.Allocator, app: *App, opts: Config.Agent) !*Agent const verbosity = settings.resolveVerbosity(opts, remembered); const stream_enabled = settings.resolveStream(remembered); browser_tools.search_engine = opts.search_engine orelse settings.resolveSearchEngine(remembered); - // Only the REPL's `/searchEngine` used to say this. A keyless engine that - // has hit its cap fails every search, and without a word here that reads - // as a bad agent rather than a missing key. + // A keyless engine over its cap fails every search; silence reads as a bad + // agent rather than a missing key. if (browser_tools.searchKeyStatus(browser_tools.search_engine)) |key| switch (key.state) { .set => {}, .keyless => log.info(.app, "keyless search endpoint", .{ .env_var = key.env_var, .limit = "rate-limited per client IP" }), @@ -518,10 +516,10 @@ const TurnInput = struct { /// Returns true on success. pub fn run(self: *Agent) bool { if (self.start_url) |url| { - if (self.gotoStart(url, self.one_shot_save != null)) |err| { + self.gotoStart(url, self.one_shot_save != null) catch |err| { self.terminal.printError("could not open {s}: {s}", .{ url, browser_tools.errorMessage(err) }); return false; - } + }; } if (self.one_shot_task) |task| { const saving = self.one_shot_save != null; @@ -545,27 +543,23 @@ pub fn run(self: *Agent) bool { return true; } -/// Print single-line cumulative token usage to stderr, so wrappers driving -/// `lightpanda agent --task ...` can capture per-task cost by `grep`-ing the -/// `$usage` prefix. Stable key=value format: -/// $usage prompt=N completion=N total=N cached=N cache_creation=N -/// Fields emit 0 when the provider didn't report them. -/// Goes through the tool layer so a failed start reads like any other tool -/// failure. -fn gotoStart(self: *Agent, url: [:0]const u8, record: bool) ?browser_tools.ToolError { +fn gotoStart(self: *Agent, url: [:0]const u8, record: bool) browser_tools.ToolError!void { var arena: std.heap.ArenaAllocator = .init(self.allocator); defer arena.deinit(); const a = arena.allocator(); var object: std.json.ObjectMap = .empty; - object.put(a, "url", .{ .string = url }) catch return browser_tools.ToolError.OutOfMemory; + try object.put(a, "url", .{ .string = url }); const args: std.json.Value = .{ .object = object }; - _ = browser_tools.call(a, self.ts.session, &self.ts.registry, "goto", args, .{}) catch |err| return err; - // The opening navigation is the first line of any replayable script. + _ = try browser_tools.call(a, self.ts.session, &self.ts.registry, "goto", args, .{}); if (record) self.recordSaveCommand(Command.fromToolCall(.goto, args)); - return null; } +/// Print single-line cumulative token usage to stderr, so wrappers driving +/// `lightpanda agent --task ...` can capture per-task cost by `grep`-ing the +/// `$usage` prefix. Stable key=value format: +/// $usage prompt=N completion=N total=N cached=N cache_creation=N +/// Fields emit 0 when the provider didn't report them. fn printUsageSummary(self: *Agent) void { const u = self.total_usage; std.debug.print( @@ -1311,9 +1305,8 @@ fn synthesizeSaveTo(self: *Agent, arena: std.mem.Allocator, path: []const u8, mo return; } - // `stripCodeFence` accepts a block with no closing fence, so a script cut - // off mid-statement is indistinguishable from a complete one once it is on - // disk. Refuse rather than save something that will not replay. + // `stripCodeFence` accepts an unclosed block, so a truncated script is + // indistinguishable from a complete one once it is on disk. if (result.finish_reason == .max_tokens) { return self.abortSave(baseline, "the model ran out of output tokens mid-script"); } @@ -1376,8 +1369,7 @@ fn logSaveBufferError(self: *Agent, err: anyerror) void { } /// Swap a call's ephemeral `backendNodeId` for the selector the tool layer -/// resolved, so the call can be replayed. Returns `args` untouched when there -/// is nothing to swap. +/// resolved, so the call can be replayed. fn withSelector(arena: std.mem.Allocator, args: ?std.json.Value, selector: ?[]const u8) ?std.json.Value { const sel = selector orelse return args; const original = args orelse return args; @@ -1797,9 +1789,6 @@ fn processUserMessage(self: *Agent, input: TurnInput) !?[]const u8 { const args = browser_tools.normalizeArgKeys(ca, tool, tc.arguments) catch tc.arguments; // Fall back to the navigation a read tool performed, so a // markdown/tree-driven turn isn't lost from `/save`. - // A call that named its element by id is unreplayable as-is; the - // tool layer resolved a selector for it while the node still - // existed. const replayable = withSelector(ca, args, if (i < self.save_selectors.items.len) self.save_selectors.items[i] else null); const cmd = Command.fromToolCall(tool, replayable); const to_record = if (cmd.isRecorded()) @@ -1965,8 +1954,10 @@ fn handleToolCall(ctx: *anyopaque, allocator: std.mem.Allocator, tool_name: []co }; if (self.capturing_for_save) { // One entry per call, errors included, so the index lines up with - // `RunToolsResult.tool_calls_made`. - const kept = if (selector) |sel| self.allocator.dupe(u8, sel) catch null else null; + // `RunToolsResult.tool_calls_made`. The conversation arena outlives the + // turn that reads them; `allocator` here is zenai's per-call arena. + const ca = self.conversation.arena.allocator(); + const kept = if (selector) |sel| ca.dupe(u8, sel) catch null else null; self.save_selectors.append(self.allocator, kept) catch {}; } diff --git a/src/browser/tools.zig b/src/browser/tools.zig index 5b597dfdc..9ea7f983f 100644 --- a/src/browser/tools.zig +++ b/src/browser/tools.zig @@ -825,9 +825,8 @@ pub const ToolResult = struct { is_error: bool = false, /// Only set when the caller passed `CallOpts.inline_image`. image: ?lp.screenshot.Prepared = null, - /// Only set when the caller passed `CallOpts.record` and the call named its - /// element by `backendNodeId`. Resolved before the action runs, because a - /// navigation takes the node with it. + /// Resolved before the action runs, because a navigation takes the node + /// with it. selector: ?[]const u8 = null, }; @@ -860,10 +859,8 @@ const NodeAndPage = struct { node: *DOMNode, page: *lp.Frame, target: ActionTarg pub const CallOpts = struct { /// The caller can hand an image to a model. inline_image: bool = false, - /// The caller is recording for `--save`/`/save`. A call that addresses its - /// element by `backendNodeId` gets `ToolResult.selector` filled in, since - /// a registry id means nothing in a later session and the node may be gone - /// by the time the caller wants to record it. + /// Fill in `ToolResult.selector`: a registry id means nothing in a later + /// session, so `--save` cannot replay a call that used one. record: bool = false, }; @@ -897,8 +894,14 @@ pub fn call( }; const substituted = try substituteStringArgs(arena, tool, normalized); - // Before dispatch: after a navigation the node is gone. - const selector = if (opts.record) selectorForArgs(arena, session, registry, substituted) else null; + // Before dispatch, because a navigation takes the node with it. Gated on + // `isRecorded` because `SelectorPath.build` is the expensive part of a tool + // call and the read-only tools that take a `backendNodeId` -- tree, + // markdown, html, nodeDetails -- would only have it thrown away. + const selector = if (opts.record and tool.isRecorded()) + selectorForArgs(arena, session, registry, substituted) + else + null; var result = dispatch(arena, session, registry, tool, substituted, opts) catch |err| { if (err == error.NavigationFailed) { @@ -912,8 +915,7 @@ pub fn call( } /// The CSS selector for a call's `backendNodeId`, so the call can be recorded -/// in a form that still resolves in a later session. Null when the arguments -/// name no node, already carry a selector, or the node cannot be named. +/// in a form that still resolves in a later session. fn selectorForArgs( arena: std.mem.Allocator, session: *lp.Session, @@ -1168,13 +1170,24 @@ const KeyStatus = struct { state: enum { set, keyless, missing }, }; -/// `null` for `.auto`, which has no key of its own. +fn keyStatusOf(comptime e: anytype) KeyStatus { + return .{ + .env_var = e.env_var, + .state = if (engineKey(e)) |key| (if (key != null) .set else .keyless) else |_| .missing, + }; +} + +/// For `.auto`, the rung the cascade would actually land on -- it has no key of +/// its own, but "which engine is about to serve, and on what terms" is the +/// question worth answering, and `.auto` is the default. pub fn searchKeyStatus(engine: SearchEngine) ?KeyStatus { inline for (api_engines) |e| { - if (engine == e.tag) return .{ - .env_var = e.env_var, - .state = if (engineKey(e)) |key| (if (key != null) .set else .keyless) else |_| .missing, - }; + if (engine == e.tag) return keyStatusOf(e); + } + if (engine != .auto) return null; + inline for (api_engines) |e| { + const status = keyStatusOf(e); + if (status.state != .missing) return status; } return null; } @@ -1204,8 +1217,7 @@ fn execSearch(arena: std.mem.Allocator, arguments: ?std.json.Value) ToolError!To } } else |_| {} } - // The last rung's reason, not a generic one: every engine having - // failed is usually one cause, and the model can act on it. + // The last engine's reason, not a generic one -- the model can act on it. return searchFailed(arena, last_label, last_err.?, last_detail); }, inline else => |tag| { @@ -1230,34 +1242,33 @@ fn searchExplicit(arena: std.mem.Allocator, comptime engine: anytype, timeout_ms return .{ .text = markdown_ }; } -/// What the provider said, duped out of the client before `deinit` takes it. -/// Without this the status and body survive only in a log line, and every -/// failure reaches the model as the word `InternalError`. +/// Duped out of the client before `deinit` takes it; otherwise the model sees +/// only the error name. const Failure = struct { status: ?u10 = null, message: []const u8 = "", }; -/// A rate limit and a bad key need different reactions, so the model is told -/// which it hit rather than just that the search failed. fn searchFailed(arena: std.mem.Allocator, label: []const u8, err: anyerror, detail: Failure) ToolError!ToolResult { var aw: std.Io.Writer.Allocating = .init(arena); - const w = &aw.writer; - w.print("{s} search failed: {s}", .{ label, @errorName(err) }) catch return ToolError.OutOfMemory; - if (detail.status) |status| w.print(" (HTTP {d})", .{status}) catch return ToolError.OutOfMemory; - if (detail.message.len > 0) { - w.writeAll(": ") catch return ToolError.OutOfMemory; - writeSingleLine(w, detail.message) catch return ToolError.OutOfMemory; - } - if (detail.status == 429) { - w.writeAll(". This engine is rate-limited right now; wait before retrying, or read the answer from a page instead.") catch - return ToolError.OutOfMemory; - } + writeFailure(&aw.writer, label, err, detail) catch return ToolError.OutOfMemory; return .{ .text = aw.written(), .is_error = true }; } -/// `arena` owns the returned slice. `detail` is filled on a non-2xx so the -/// caller can say what actually happened. +fn writeFailure(w: *std.Io.Writer, label: []const u8, err: anyerror, detail: Failure) !void { + try w.print("{s} search failed: {s}", .{ label, @errorName(err) }); + if (detail.status) |status| try w.print(" (HTTP {d})", .{status}); + if (detail.message.len > 0) { + try w.writeAll(": "); + try writeSingleLine(w, detail.message); + } + // The one failure where the right move is not "try another query". + if (detail.status == 429) { + try w.writeAll(". This engine is rate-limited right now; wait before retrying, or read the answer from a page instead."); + } +} + +/// `arena` owns the returned slice. fn apiSearch( comptime engine: anytype, arena: std.mem.Allocator, @@ -1285,7 +1296,6 @@ fn apiSearch( .status = status, .body = client.last_error.body, }); - // `client.last_error` dies with the client on the deferred deinit. detail.* = .{ .status = status, .message = if (client.last_error.body) |b| (arena.dupe(u8, b) catch "") else "", @@ -1310,17 +1320,21 @@ pub const SearchResults = struct { hits: []const Hit = &.{}, }; +/// The engines agree on title and url and disagree only on which field holds +/// the snippet. +fn collectHits(arena: std.mem.Allocator, results: anytype, comptime snippet: []const u8) ![]Hit { + const hits = try arena.alloc(Hit, results.len); + for (results, hits) |r, *hit| hit.* = .{ .title = r.title, .url = r.url, .snippet = @field(r, snippet) }; + return hits; +} + fn collectTavily(arena: std.mem.Allocator, resp: tavily.types.SearchResponse) !SearchResults { - const hits = try arena.alloc(Hit, resp.results.len); - for (resp.results, hits) |r, *hit| hit.* = .{ .title = r.title, .url = r.url, .snippet = r.content }; - return .{ .answer = resp.answer orelse "", .hits = hits }; + return .{ .answer = resp.answer orelse "", .hits = try collectHits(arena, resp.results, "content") }; } fn collectBrave(arena: std.mem.Allocator, resp: brave.types.SearchResponse) !SearchResults { const results: []const brave.types.Result = if (resp.web) |web| web.results else &.{}; - const hits = try arena.alloc(Hit, results.len); - for (results, hits) |r, *hit| hit.* = .{ .title = r.title, .url = r.url, .snippet = r.description }; - return .{ .hits = hits }; + return .{ .hits = try collectHits(arena, results, "description") }; } fn collectExa(arena: std.mem.Allocator, resp: exa.types.SearchResponse) !SearchResults { @@ -1337,22 +1351,19 @@ fn collectExa(arena: std.mem.Allocator, resp: exa.types.SearchResponse) !SearchR } fn collectKeenable(arena: std.mem.Allocator, resp: keenable.types.SearchResponse) !SearchResults { - const hits = try arena.alloc(Hit, resp.results.len); - // snippet carries the page text (the wire format's always-empty - // `description` is deliberately not even mapped by the client). - for (resp.results, hits) |r, *hit| hit.* = .{ .title = r.title, .url = r.url, .snippet = r.snippet }; - return .{ .hits = hits }; + // `snippet` carries the page text; the wire format's always-empty + // `description` is deliberately not even mapped by the client. + return .{ .hits = try collectHits(arena, resp.results, "snippet") }; } fn renderResults(arena: std.mem.Allocator, results: SearchResults) ToolError![]const u8 { if (results.answer.len == 0 and results.hits.len == 0) return "No results."; var aw: std.Io.Writer.Allocating = .init(arena); - const w = &aw.writer; - renderInto(w, results) catch return ToolError.OutOfMemory; + writeResults(&aw.writer, results) catch return ToolError.OutOfMemory; return aw.written(); } -fn renderInto(w: *std.Io.Writer, results: SearchResults) !void { +fn writeResults(w: *std.Io.Writer, results: SearchResults) !void { if (results.answer.len > 0) try w.print("**Answer:** {s}\n\n", .{results.answer}); for (results.hits, 0..) |hit, i| try writeResultItem(w, i, hit.title, hit.url, hit.snippet); } @@ -2828,7 +2839,7 @@ test "formatLpEnvNames reports empty when no names" { try std.testing.expectEqualStrings("No LP_* environment variables are set.", r); } -test "collectTavily renders answer and results" { +test "tavily results render as markdown" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); @@ -2850,7 +2861,7 @@ test "collectTavily renders answer and results" { try std.testing.expect(std.mem.indexOf(u8, md, "2. **France**") != null); } -test "collectTavily handles empty results" { +test "tavily: no results render as a notice" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); @@ -2858,7 +2869,7 @@ test "collectTavily handles empty results" { try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectTavily(aa, .{}))); } -test "collectBrave renders web results" { +test "brave results render as markdown" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); @@ -2879,7 +2890,7 @@ test "collectBrave renders web results" { try std.testing.expect(std.mem.indexOf(u8, md, "2. **France**") != null); } -test "collectBrave handles empty results" { +test "brave: no results render as a notice" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); @@ -2889,7 +2900,7 @@ test "collectBrave handles empty results" { try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectBrave(aa, .{ .web = .{} }))); } -test "collectKeenable reads snippet" { +test "keenable results render the snippet as the body" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); @@ -2917,14 +2928,14 @@ test "writeResultItem uses the URL as title when the title is empty" { try std.testing.expectEqualStrings("1. **https://example.org/x.pdf** — https://example.org/x.pdf\n snippet\n\n", aw.written()); } -test "collectKeenable handles empty results" { +test "keenable: no results render as a notice" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectKeenable(aa, .{}))); } -test "collectBrave flattens newlines in titles and descriptions" { +test "brave titles and descriptions render on one line" { var arena: std.heap.ArenaAllocator = .init(std.testing.allocator); defer arena.deinit(); const aa = arena.allocator(); @@ -2953,12 +2964,9 @@ test "searchFailed: a rate limit says so, a bare failure stays short" { .message = "Public API hourly limit reached.\nWait 2 minutes to continue.", }); try std.testing.expect(limited.is_error); - // The status and the provider's own words, which previously reached the - // model only as the word "ApiError". try std.testing.expect(std.mem.indexOf(u8, limited.text, "(HTTP 429)") != null); try std.testing.expect(std.mem.indexOf(u8, limited.text, "Public API hourly limit reached.") != null); try std.testing.expect(std.mem.indexOf(u8, limited.text, "rate-limited right now") != null); - // Flattened: a newline would break the numbered-list markdown around it. try std.testing.expect(std.mem.indexOf(u8, limited.text, "\n") == null); const bare = try searchFailed(aa, "web", error.ConnectionRefused, .{}); From 2a9abd880f9d5a73f3317a83df2c22599b21a44f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Tue, 22 Sep 2026 16:14:23 +0200 Subject: [PATCH 10/47] deps: bump zenai for the reasoning-token floor Picks up the per-effort `max_tokens` floor, so a tight budget no longer buys mostly thinking and a truncated answer, and the search clients logging a non-2xx like the model clients already did. The bump also carries zenai's `ErrorDetail.body` -> `.message` rename, which the search failure path reads. --- build.zig.zon | 4 ++-- src/browser/tools.zig | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index e78035c35..06793a486 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -36,8 +36,8 @@ .hash = "sqlite3-3.53.2-DMxLWuAOAAA_Px0arJOIOaP4AKEu5prbsQgPMA35W1zz", }, .zenai = .{ - .url = "git+https://github.com/lightpanda-io/zenai.git#15d6e4c37b4508373ba7ae6a2f400717f4ff9d89", - .hash = "zenai-0.0.0-iOY_VLq7BgAZIQzUIZ4w8ikmwpuNaJdyJSvKYCtnVing", + .url = "git+https://github.com/lightpanda-io/zenai.git#93583f32eb09203821539ca16bd45890823f293b", + .hash = "zenai-0.0.0-iOY_VOKsBgDYtAH8xVzBf_1BITeTJ-rZlB4stdJDPiWX", }, .isocline = .{ .url = "git+https://github.com/arrufat/isocline#ec538faf435c616a6b38716f53980b5815c30f8a", diff --git a/src/browser/tools.zig b/src/browser/tools.zig index 9ea7f983f..5c186dc5c 100644 --- a/src/browser/tools.zig +++ b/src/browser/tools.zig @@ -1294,11 +1294,11 @@ fn apiSearch( if (client.last_error.status) |status| { log.warn(.browser, @tagName(engine.tag) ++ " non-2xx", .{ .status = status, - .body = client.last_error.body, + .message = client.last_error.message, }); detail.* = .{ .status = status, - .message = if (client.last_error.body) |b| (arena.dupe(u8, b) catch "") else "", + .message = if (client.last_error.message) |m| (arena.dupe(u8, m) catch "") else "", }; } return err; From 3514d8d46b825d404591d48d0bc6f504c64c30ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Wed, 23 Sep 2026 10:59:25 +0200 Subject: [PATCH 11/47] deps: bump isocline for the strdup_from_utf8 overflow isocline copied the submitted line into a buffer one byte short whenever the locale is not UTF-8. A line whose length the allocator serves exactly, such as the 24-byte `/screenshot path=out.png`, corrupted the heap on Enter. --- build.zig.zon | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index 06793a486..851080c09 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -40,8 +40,8 @@ .hash = "zenai-0.0.0-iOY_VOKsBgDYtAH8xVzBf_1BITeTJ-rZlB4stdJDPiWX", }, .isocline = .{ - .url = "git+https://github.com/arrufat/isocline#ec538faf435c616a6b38716f53980b5815c30f8a", - .hash = "N-V-__8AAHhtEwBIqx5nOoiGo_FLAG8gpiVC6XzZn1teMKd0", + .url = "git+https://github.com/arrufat/isocline#4a99434bee4a5ed04c1639514224d48cd55e1405", + .hash = "N-V-__8AAHxtEwB16xj2Xz-zx_uklGdTP5C2-GHXDoSzah-8", }, .pcre2 = .{ .url = "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.48/pcre2-10.48.tar.gz", From 3ab936ebbbd952fec71676ef4ca5e165d550e5ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Wed, 23 Sep 2026 11:00:16 +0200 Subject: [PATCH 12/47] agent: report a --url that fails to load `call` reports a failed navigation in-band, as an is_error result, so the catch in gotoStart never saw it: a start page that could not resolve left the agent on a blank page with no message. --- src/agent/Agent.zig | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/agent/Agent.zig b/src/agent/Agent.zig index 33cfbc88e..90c751893 100644 --- a/src/agent/Agent.zig +++ b/src/agent/Agent.zig @@ -516,10 +516,7 @@ const TurnInput = struct { /// Returns true on success. pub fn run(self: *Agent) bool { if (self.start_url) |url| { - self.gotoStart(url, self.one_shot_save != null) catch |err| { - self.terminal.printError("could not open {s}: {s}", .{ url, browser_tools.errorMessage(err) }); - return false; - }; + if (!self.gotoStart(url, self.one_shot_save != null)) return false; } if (self.one_shot_task) |task| { const saving = self.one_shot_save != null; @@ -543,16 +540,27 @@ pub fn run(self: *Agent) bool { return true; } -fn gotoStart(self: *Agent, url: [:0]const u8, record: bool) browser_tools.ToolError!void { +/// Opens `--url` through the tool layer, so a bad URL fails like any other +/// tool call. +fn gotoStart(self: *Agent, url: [:0]const u8, record: bool) bool { var arena: std.heap.ArenaAllocator = .init(self.allocator); defer arena.deinit(); const a = arena.allocator(); var object: std.json.ObjectMap = .empty; - try object.put(a, "url", .{ .string = url }); + object.put(a, "url", .{ .string = url }) catch return false; const args: std.json.Value = .{ .object = object }; - _ = try browser_tools.call(a, self.ts.session, &self.ts.registry, "goto", args, .{}); + const result = browser_tools.call(a, self.ts.session, &self.ts.registry, "goto", args, .{}) catch |err| { + self.terminal.printError("could not open {s}: {s}", .{ url, browser_tools.errorMessage(err) }); + return false; + }; + // `call` reports a failed navigation in-band, not as an error. + if (result.is_error) { + self.terminal.printError("could not open {s}: {s}", .{ url, result.text }); + return false; + } if (record) self.recordSaveCommand(Command.fromToolCall(.goto, args)); + return true; } /// Print single-line cumulative token usage to stderr, so wrappers driving From 7289281784a54876c52d9be79d2bbdacf55c9581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Wed, 23 Sep 2026 11:00:36 +0200 Subject: [PATCH 13/47] agent: record the --url navigation for a REPL /save too It was recorded only for a one-shot --save, so a REPL session opened with --url saved a script that started on a blank page. --- src/agent/Agent.zig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/agent/Agent.zig b/src/agent/Agent.zig index 90c751893..7339b6031 100644 --- a/src/agent/Agent.zig +++ b/src/agent/Agent.zig @@ -516,7 +516,7 @@ const TurnInput = struct { /// Returns true on success. pub fn run(self: *Agent) bool { if (self.start_url) |url| { - if (!self.gotoStart(url, self.one_shot_save != null)) return false; + if (!self.gotoStart(url)) return false; } if (self.one_shot_task) |task| { const saving = self.one_shot_save != null; @@ -541,8 +541,8 @@ pub fn run(self: *Agent) bool { } /// Opens `--url` through the tool layer, so a bad URL fails like any other -/// tool call. -fn gotoStart(self: *Agent, url: [:0]const u8, record: bool) bool { +/// tool call and `/save` replays the opening navigation. +fn gotoStart(self: *Agent, url: [:0]const u8) bool { var arena: std.heap.ArenaAllocator = .init(self.allocator); defer arena.deinit(); const a = arena.allocator(); @@ -559,7 +559,7 @@ fn gotoStart(self: *Agent, url: [:0]const u8, record: bool) bool { self.terminal.printError("could not open {s}: {s}", .{ url, result.text }); return false; } - if (record) self.recordSaveCommand(Command.fromToolCall(.goto, args)); + self.recordSaveCommand(Command.fromToolCall(.goto, args)); return true; } From a099fb580b1c1268fe3f95cba3f524d498aeb9f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Wed, 23 Sep 2026 11:03:25 +0200 Subject: [PATCH 14/47] tools: let scroll target an element by selector Recording swaps a call's backendNodeId for the selector the tool layer resolved, but scroll had no selector parameter: the replayed scroll({ selector, y }) dropped the field and scrolled the window. Take a selector as click and hover do. --- src/browser/tools.zig | 19 ++++++++++++------- src/mcp/tools.zig | 12 ++++++++++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/browser/tools.zig b/src/browser/tools.zig index 5c186dc5c..0b27768db 100644 --- a/src/browser/tools.zig +++ b/src/browser/tools.zig @@ -562,13 +562,14 @@ pub const Tool = enum { ), }, .scroll => .{ - .description = "Scroll the page or a specific element. Returns the scroll position and current page URL and title.", + .description = "Scroll the page or a specific element. Provide a CSS selector (preferred for reproducibility) or a backendNodeId to scroll an element; omit both to scroll the window. Returns the scroll position and current page URL and title.", .summary = "Scroll the page or an element", .input_schema = minify( \\{ \\ "type": "object", \\ "properties": { - \\ "backendNodeId": { "type": "integer", "description": "Optional: The backend node ID of the element to scroll. If the element is not itself a scroll container, its nearest scrollable ancestor is scrolled instead. If omitted (or 0), scrolls the window." }, + \\ "selector": { "type": "string", "description": "Optional: CSS selector of the element to scroll. Preferred over backendNodeId. If the element is not itself a scroll container, its nearest scrollable ancestor is scrolled instead." }, + \\ "backendNodeId": { "type": "integer", "description": "Optional: The backend node ID of the element to scroll. If the element is not itself a scroll container, its nearest scrollable ancestor is scrolled instead. If neither this nor selector is given (or it is 0), scrolls the window." }, \\ "x": { "type": "integer", "description": "Optional: The horizontal scroll offset." }, \\ "y": { "type": "integer", "description": "Optional: The vertical scroll offset." } \\ } @@ -1964,20 +1965,24 @@ fn execFill(arena: std.mem.Allocator, session: *lp.Session, registry: *NodeRegis fn execScroll(arena: std.mem.Allocator, session: *lp.Session, registry: *NodeRegistry, arguments: ?std.json.Value) ToolError![]const u8 { const Params = struct { backendNodeId: ?NodeRegistry.Id = null, + selector: ?[]const u8 = null, x: ?i32 = null, y: ?i32 = null, }; const args = try parseArgsOrDefault(Params, arena, arguments); const scope = beginAction(session); - const page = try requireFrame(session); - const target_node = try resolveOptionalNode(registry, args.backendNodeId); + const resolved: ?NodeAndPage = if (args.selector != null or args.backendNodeId != null) + try resolveTarget(session, registry, args.selector, args.backendNodeId) + else + null; + const page = if (resolved) |r| r.page else try requireFrame(session); - const result = lp.actions.scroll(target_node, args.x, args.y, page) catch |err| return mapActionError(err); + const result = lp.actions.scroll(if (resolved) |r| r.node else null, args.x, args.y, page) catch |err| return mapActionError(err); const body = (switch (result.target) { .window => std.fmt.allocPrint(arena, "Scrolled window to x: {d}, y: {d}", .{ result.x, result.y }), .node => std.fmt.allocPrint(arena, "Scrolled element ({f}) to x: {d}, y: {d}", .{ - ActionTarget{ .backend_node_id = args.backendNodeId.? }, + resolved.?.target, result.x, result.y, }), @@ -1985,7 +1990,7 @@ fn execScroll(arena: std.mem.Allocator, session: *lp.Session, registry: *NodeReg const registered = registry.register(container) catch return ToolError.InternalError; break :blk std.fmt.allocPrint(arena, "Scrolled scroll container ({f}) of element ({f}) to x: {d}, y: {d}", .{ ActionTarget{ .backend_node_id = registered.id }, - ActionTarget{ .backend_node_id = args.backendNodeId.? }, + resolved.?.target, result.x, result.y, }); diff --git a/src/mcp/tools.zig b/src/mcp/tools.zig index f965b02f4..c6edfe97e 100644 --- a/src/mcp/tools.zig +++ b/src/mcp/tools.zig @@ -1196,6 +1196,18 @@ test "MCP - Actions: click, fill, scroll, hover, press, selectOption, setChecked out.clearRetainingCapacity(); } + // A selector targets the element as a backendNodeId does. + { + const outer = frame.document.getElementById("outerscroll", frame).?.asNode(); + const outer_id = (try server.active_session.registry.register(outer)).id; + try router.handleMessage(server, aa, + \\{"jsonrpc":"2.0","id":41,"method":"tools/call","params":{"name":"scroll","arguments":{"selector":"#innerleaf","y":30}}} + ); + const expected = try std.fmt.allocPrint(aa, "Scrolled scroll container (backendNodeId: {d}) of element (selector: #innerleaf) to x: 0, y: 30", .{outer_id}); + try testing.expect(std.mem.indexOf(u8, out.written(), expected) != null); + out.clearRetainingCapacity(); + } + // The container may be declared in a stylesheet rather than inline. { const leaf = frame.document.getElementById("sheetleaf", frame).?.asNode(); From 1df5838bdb63354cf3c67ad46b60840360807794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Wed, 23 Sep 2026 11:04:22 +0200 Subject: [PATCH 15/47] agent: record slash commands that address a node by id /save kept a model's backendNodeId call by swapping in the selector the tool layer resolved, but a typed `/scroll backendNodeId=3` never asked for one and was dropped from the script. Ask for it on this path too. --- src/agent/Agent.zig | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/agent/Agent.zig b/src/agent/Agent.zig index 7339b6031..4596c8fd0 100644 --- a/src/agent/Agent.zig +++ b/src/agent/Agent.zig @@ -713,7 +713,8 @@ fn runRepl(self: *Agent) void { self.terminal.endTool(); self.printCommandResult(tc, result); if (!result.is_error) { - self.recordSaveCommand(navigationGoto(aa, tc.tool, tc.args) orelse cmd); + const replayable = Command.fromToolCall(tc.tool, withSelector(aa, tc.args, result.selector)); + self.recordSaveCommand(navigationGoto(aa, tc.tool, tc.args) orelse replayable); } self.recordSlashToolCall(command_text, tc.name(), tc.args, result) catch |err| { self.terminal.printWarning("LLM conversation out of sync (/{s}: {s}); next prompt may not see this action", .{ tc.name(), @errorName(err) }); @@ -1506,7 +1507,7 @@ fn printSlashHelp(self: *Agent, arena: std.mem.Allocator, target: []const u8) vo fn runCommand(self: *Agent, arena: std.mem.Allocator, tc: Command.ToolCall) browser_tools.ToolResult { // The terminal can't show an image, but the conversation can. - return browser_tools.call(arena, self.ts.session, &self.ts.registry, tc.name(), tc.args, .{ .inline_image = self.ai_client != null }) catch |err| .{ + return browser_tools.call(arena, self.ts.session, &self.ts.registry, tc.name(), tc.args, .{ .inline_image = self.ai_client != null, .record = true }) catch |err| .{ .text = switch (err) { error.OutOfMemory => "out of memory", error.FrameNotLoaded => "no page loaded — run /goto first", From 9c583f1fb09a4eeaf4c026c3610ceefebd5af76d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Wed, 23 Sep 2026 11:18:44 +0200 Subject: [PATCH 16/47] js: hand --locale to ICU instead of LC_ALL A BCP 47 tag in LC_ALL is not a POSIX locale, so setlocale(LC_ALL, "") failed for the rest of the process and for any child. In the REPL, isocline took the terminal for non-UTF-8 and dropped every non-ASCII keystroke. Set ICU's default locale through the new v8__V8__SetDefaultLocale binding and leave the C library alone. Pins zig-v8-fork to lightpanda-io/zig-v8-fork#209; CI links once that is tagged and action.yml's zig-v8 is bumped. --- build.zig.zon | 4 ++-- src/browser/js/Platform.zig | 16 +++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index 851080c09..127a4edb9 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -5,8 +5,8 @@ .minimum_zig_version = "0.16.0", .dependencies = .{ .v8 = .{ - .url = "https://github.com/lightpanda-io/zig-v8-fork/archive/d3d7b41677a0015fdfa55a8b1caa4f214de6d209.tar.gz", - .hash = "v8-0.0.0-xddH624yAwC5_H_8T303uTxiSAnAu2zrxv6MHLhvLo6t", + .url = "https://github.com/lightpanda-io/zig-v8-fork/archive/0cc0b28d18f021c560d6f84b7e27e5a7ade9f8c8.tar.gz", + .hash = "v8-0.0.0-xddH6_g0AwBnqBwDOD22Mks8ODHFsH6SffwcpFoUSq3X", }, // .v8 = .{ .path = "../zig-v8-fork" }, .brotli = .{ diff --git a/src/browser/js/Platform.zig b/src/browser/js/Platform.zig index ca58de079..5525b848e 100644 --- a/src/browser/js/Platform.zig +++ b/src/browser/js/Platform.zig @@ -30,18 +30,17 @@ pub const Options = struct { timezone: ?[:0]const u8 = null, }; -/// ICU reads LC_ALL and TZ lazily on first use, so the environment must be -/// set here, before InitializeICU and before the platform starts its thread -/// pool (setenv is not safe once other threads may call getenv). ICU -/// canonicalizes a BCP 47 tag itself, script subtag included. +/// ICU reads TZ lazily on first use, so it must be set here, before +/// InitializeICU and before the platform starts its thread pool (setenv is not +/// safe once other threads may call getenv). The locale goes to ICU directly: +/// a BCP 47 tag in LC_ALL is not a POSIX locale, so it broke setlocale for the +/// rest of the process and for every child. ICU canonicalizes the tag itself, +/// script subtag included. pub fn init(opts: Options) !Platform { if (opts.v8_flags) |flags| { v8.v8__V8__SetFlagsFromString(flags.ptr, flags.len); } - if (opts.locale) |tag| { - _ = setenv("LC_ALL", tag, 1); - } if (opts.timezone) |id| { _ = setenv("TZ", id, 1); } @@ -49,6 +48,9 @@ pub fn init(opts: Options) !Platform { if (v8.v8__V8__InitializeICU() == false) { return error.FailedToInitializeICU; } + if (opts.locale) |tag| { + if (!v8.v8__V8__SetDefaultLocale(tag)) return error.InvalidLocale; + } // 0 - threadpool size, 0 == let v8 decide // 1 - idle_task_support, 1 == enabled const handle = v8.v8__Platform__NewDefaultPlatform(0, 1).?; From a246a67d9312c0fce842d9ce5a734c651cdc6b4b Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Thu, 10 Sep 2026 11:42:06 -0700 Subject: [PATCH 17/47] add CorsStore --- src/Metrics.zig | 2 +- src/network/CorsGate.zig | 35 ++++ src/network/CorsStore.zig | 348 +++++++++++++++++++++++++++++++++++++ src/network/HttpClient.zig | 5 +- src/network/Network.zig | 5 + 5 files changed, 393 insertions(+), 2 deletions(-) create mode 100644 src/network/CorsStore.zig diff --git a/src/Metrics.zig b/src/Metrics.zig index c7dabee96..c92278d6f 100644 --- a/src/Metrics.zig +++ b/src/Metrics.zig @@ -93,7 +93,7 @@ http_navigation_delay_ms: Histogram(&.{ robots_status: CounterEnum("category", @import("network/http.zig").StatusCategory) = .{}, robots_access: CounterEnum("result", enum { allow, deny }) = .{}, robots_evictions: Counter = .{}, -cors_check: CounterEnum("result", enum { same_origin, no_cors, simple, preflight }) = .{}, +cors_check: CounterEnum("result", enum { same_origin, no_cors, simple, preflight, cached }) = .{}, cors_preflight: CounterEnum("result", enum { allowed, blocked }) = .{}, cors_response: CounterEnum("result", enum { allowed, blocked }) = .{}, adblock_verdicts: CounterEnum("verdict", @import("network/adblock/AdBlocker.zig").Verdict) = .{}, diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index 7302ab3b9..ba9310eb8 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -25,11 +25,15 @@ const http = @import("http.zig"); const Transfer = @import("HttpClient.zig").Transfer; const SingleFlight = @import("SingleFlight.zig"); const HttpClient = @import("HttpClient.zig"); +const Network = @import("Network.zig"); + +const CorsStore = @import("CorsStore.zig"); const log = lp.log; const CorsGate = @This(); +network: *Network, single_flight: SingleFlight, // CORS Request Headers @@ -212,6 +216,22 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result { return .allowed; } + if (try URL.getOrigin(transfer.arena.allocator(), req.url)) |target| { + if (self.network.cors_store.get(.{ .origin = origin, .target = target })) |cached| { + const authored = try collectAuthoredHeaders(transfer, transfer.arena.allocator()); + if (CorsStore.covers(cached, req.method, req.credentials_mode == .include, authored.items)) { + log.debug(.cors, "cross origin", .{ + .url = req.url, + .origin = origin, + .preflight = false, + .cached = true, + }); + lp.metrics.cors_check.incr(.cached); + return .allowed; + } + } + } + log.debug(.cors, "cross origin", .{ .url = req.url, .origin = origin, @@ -223,6 +243,21 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result { return .pending; } +fn collectAuthoredHeaders(transfer: *Transfer, allocator: std.mem.Allocator) !std.ArrayList([]const u8) { + var header_names: std.ArrayList([]const u8) = .empty; + for (transfer.req_headers.items) |hdr| { + if (hdr.source != .author) continue; + if (isSafelistedHeader(hdr.name, hdr.value)) continue; + try header_names.append(allocator, try std.ascii.allocLowerString(allocator, hdr.name)); + } + std.mem.sort([]const u8, header_names.items, {}, struct { + fn lessThan(_: void, a: []const u8, b: []const u8) bool { + return std.mem.lessThan(u8, a, b); + } + }.lessThan); + return header_names; +} + const CorsKey = struct { url: []const u8, origin: []const u8, diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig new file mode 100644 index 000000000..696c5676a --- /dev/null +++ b/src/network/CorsStore.zig @@ -0,0 +1,348 @@ +// Copyright (C) 2023-2026 Lightpanda (Selecy SAS) +// +// Francis Bouvier +// Pierre Tachoire +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +const std = @import("std"); +const lp = @import("lightpanda"); + +const http = @import("http.zig"); + +const CorsStore = @This(); + +const Key = struct { + origin: []const u8, + target: []const u8, + + fn dupe(self: Key, allocator: std.mem.Allocator) !Key { + return .{ + .origin = try allocator.dupe(u8, self.origin), + .target = try allocator.dupe(u8, self.target), + }; + } + + fn deinit(self: Key, allocator: std.mem.Allocator) void { + allocator.free(self.origin); + allocator.free(self.target); + } +}; + +const KeyContext = struct { + pub fn hash(_: KeyContext, key: Key) u64 { + var hasher = std.hash.Wyhash.init(0); + hasher.update(key.origin); + hasher.update(&.{0}); + hasher.update(key.target); + return hasher.final(); + } + + pub fn eql(_: KeyContext, a: Key, b: Key) bool { + return std.ascii.eqlIgnoreCase(a.origin, b.origin) and std.ascii.eqlIgnoreCase(a.target, b.target); + } +}; + +const Entry = struct { + methods_wildcard: bool, + methods: std.EnumSet(http.Method), + + headers_wildcard: bool, + headers: []const []const u8, + + expires_at: u64, + + credentials: bool, + + fn unionHeaders( + allocator: std.mem.Allocator, + a: []const []const u8, + b: []const []const u8, + ) ![]const []const u8 { + var list: std.ArrayList([]const u8) = .empty; + errdefer { + for (list.items) |s| allocator.free(s); + list.deinit(allocator); + } + + outerA: for (a) |s| { + for (list.items) |existing| { + if (std.ascii.eqlIgnoreCase(existing, s)) continue :outerA; + } + try list.append(allocator, try allocator.dupe(u8, s)); + } + outerB: for (b) |s| { + for (list.items) |existing| { + if (std.ascii.eqlIgnoreCase(existing, s)) continue :outerB; + } + try list.append(allocator, try allocator.dupe(u8, s)); + } + + return list.toOwnedSlice(allocator); + } + + fn merge(self: Entry, allocator: std.mem.Allocator, new: Entry) !Entry { + return .{ + .credentials = self.credentials or new.credentials, + .methods_wildcard = self.methods_wildcard or new.methods_wildcard, + .methods = self.methods.unionWith(new.methods), + .headers_wildcard = self.headers_wildcard or new.headers_wildcard, + .headers = try unionHeaders(allocator, self.headers, new.headers), + .expires_at = @max(self.expires_at, new.expires_at), + }; + } + + fn dupe(self: Entry, allocator: std.mem.Allocator) !Entry { + var new_headers: std.ArrayList([]const u8) = try .initCapacity(allocator, self.headers.len); + errdefer { + for (new_headers.items) |hdr| allocator.free(hdr); + new_headers.deinit(allocator); + } + + for (self.headers) |hdr| { + new_headers.appendAssumeCapacity(try allocator.dupe(u8, hdr)); + } + + return .{ + .methods_wildcard = self.methods_wildcard, + .methods = self.methods, + .headers_wildcard = self.headers_wildcard, + .headers = new_headers.items, + .expires_at = self.expires_at, + .credentials = self.credentials, + }; + } + + fn deinit(self: Entry, allocator: std.mem.Allocator) void { + for (self.headers) |h| allocator.free(h); + allocator.free(self.headers); + } +}; + +const Map = std.HashMapUnmanaged(Key, Entry, KeyContext, std.hash_map.default_max_load_percentage); + +allocator: std.mem.Allocator, +map: Map = .empty, +mutex: std.Io.Mutex = .init, + +pub fn init(allocator: std.mem.Allocator) CorsStore { + return .{ .allocator = allocator }; +} + +pub fn deinit(self: *CorsStore) void { + self.mutex.lockUncancelable(lp.io); + defer self.mutex.unlock(lp.io); + + var iter = self.map.iterator(); + while (iter.next()) |entry| { + entry.key_ptr.deinit(self.allocator); + entry.value_ptr.deinit(self.allocator); + } + + self.map.deinit(self.allocator); +} + +pub fn get(self: *CorsStore, key: Key) ?Entry { + self.mutex.lockUncancelable(lp.io); + defer self.mutex.unlock(lp.io); + + const entry = self.map.get(key) orelse return null; + + if (entry.expires_at <= lp.datetime.timestamp(.real)) { + const kv = self.map.fetchRemove(key).?; + kv.key.deinit(self.allocator); + kv.value.deinit(self.allocator); + return null; + } + + return entry; +} + +/// Insert or merge a CORS grant for (origin, target). `entry` is not +/// consumed: `put` copies whatever it needs (via `dupe`/`merge`, which +/// always allocate their own copies) and never takes ownership of +/// `entry.headers` or its contents. +/// +/// Callers remain responsible for +/// freeing `entry.headers` after this call, on both the insert and +/// the merge path. +pub fn put(self: *CorsStore, key: Key, entry: Entry) !void { + self.mutex.lockUncancelable(lp.io); + defer self.mutex.unlock(lp.io); + + const gop = try self.map.getOrPut(self.allocator, key); + if (!gop.found_existing) { + errdefer _ = self.map.remove(key); + gop.key_ptr.* = try key.dupe(self.allocator); + gop.value_ptr.* = try entry.dupe(self.allocator); + return; + } + + const old = gop.value_ptr.*; + const merged = old.merge(self.allocator, entry) catch |err| { + return err; + }; + old.deinit(self.allocator); + gop.value_ptr.* = merged; +} + +pub fn covers( + entry: Entry, + method: http.Method, + wants_credentials: bool, + authored_headers: []const []const u8, +) bool { + if (wants_credentials and !entry.credentials) { + return false; + } + + if (!entry.methods_wildcard and !entry.methods.contains(method)) { + return false; + } + + for (authored_headers) |name| { + const is_authorization = std.ascii.eqlIgnoreCase(name, "authorization"); + if (entry.headers_wildcard and !is_authorization) continue; + + var found = false; + for (entry.headers) |allowed| { + if (std.ascii.eqlIgnoreCase(allowed, name)) { + found = true; + break; + } + } + if (!found) return false; + } + + return true; +} + +const testing = @import("../testing.zig"); + +fn freeHeaders(allocator: std.mem.Allocator, headers: []const []const u8) void { + for (headers) |h| allocator.free(h); + allocator.free(headers); +} + +test "CorsStore: put then get, miss on different origin/target" { + const allocator = testing.allocator; + var store = CorsStore.init(allocator); + defer store.deinit(); + + const headers = try allocator.alloc([]const u8, 1); + headers[0] = try allocator.dupe(u8, "x-custom"); + defer freeHeaders(allocator, headers); + + try store.put(.{ .origin = "https://a.example", .target = "https://api.example" }, .{ + .credentials = false, + .methods_wildcard = false, + .methods = std.EnumSet(http.Method).initOne(.POST), + .headers_wildcard = false, + .headers = headers, + .expires_at = lp.datetime.timestamp(.real) + 60_000, + }); + + // store.get returns the store's own copy — not caller-owned, don't free it. + const hit = store.get(.{ .origin = "https://a.example", .target = "https://api.example" }).?; + try testing.expect(hit.methods.contains(.POST)); + try testing.expect(!hit.methods.contains(.GET)); + + try testing.expectEqual(null, store.get(.{ .origin = "https://b.example", .target = "https://api.example" })); + try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://other.example" })); +} + +test "CorsStore: expired entries are evicted on get" { + const allocator = testing.allocator; + var store = CorsStore.init(allocator); + defer store.deinit(); + + try store.put(.{ .origin = "https://a.example", .target = "https://api.example" }, .{ + .credentials = false, + .methods_wildcard = true, + .methods = .initEmpty(), + .headers_wildcard = true, + .headers = &.{}, // empty slice, nothing to free + .expires_at = lp.datetime.timestamp(.real) - 1, + }); + + try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://api.example" })); + try testing.expectEqual(0, store.map.count()); +} + +test "CorsStore: put merges into existing entry rather than clobbering" { + const allocator = testing.allocator; + var store = CorsStore.init(allocator); + defer store.deinit(); + + const key = Key{ .origin = "https://a.example", .target = "https://api.example" }; + + const h1 = try allocator.alloc([]const u8, 1); + h1[0] = try allocator.dupe(u8, "x-one"); + try store.put(key, .{ + .credentials = false, + .methods_wildcard = false, + .methods = std.EnumSet(http.Method).initOne(.POST), + .headers_wildcard = false, + .headers = h1, + .expires_at = lp.datetime.timestamp(.real) + 60_000, + }); + freeHeaders(allocator, h1); + + const h2 = try allocator.alloc([]const u8, 1); + h2[0] = try allocator.dupe(u8, "x-two"); + try store.put(key, .{ + .credentials = false, + .methods_wildcard = false, + .methods = std.EnumSet(http.Method).initOne(.PUT), + .headers_wildcard = false, + .headers = h2, + .expires_at = lp.datetime.timestamp(.real) + 60_000, + }); + freeHeaders(allocator, h2); + + const merged = store.get(key).?; + try testing.expect(merged.methods.contains(.POST)); + try testing.expect(merged.methods.contains(.PUT)); + try testing.expectEqual(2, merged.headers.len); + + try testing.expect(CorsStore.covers(merged, .POST, false, &.{"x-one"})); + try testing.expect(CorsStore.covers(merged, .PUT, false, &.{"x-two"})); + try testing.expect(!CorsStore.covers(merged, .DELETE, false, &.{})); +} + +test "CorsStore: covers rejects credentialed request against uncredentialed wildcard" { + const entry = CorsStore.Entry{ + .credentials = false, + .methods_wildcard = true, + .methods = .initEmpty(), + .headers_wildcard = true, + .headers = &.{}, + .expires_at = std.math.maxInt(i64), + }; + try testing.expect(!CorsStore.covers(entry, .GET, true, &.{})); + try testing.expect(CorsStore.covers(entry, .GET, false, &.{})); +} + +test "CorsStore: covers never lets a wildcard cover Authorization" { + const entry = CorsStore.Entry{ + .credentials = false, + .methods_wildcard = true, + .methods = .initEmpty(), + .headers_wildcard = true, + .headers = &.{}, + .expires_at = std.math.maxInt(i64), + }; + try testing.expect(!CorsStore.covers(entry, .GET, false, &.{"authorization"})); + try testing.expect(CorsStore.covers(entry, .GET, false, &.{"x-anything"})); +} diff --git a/src/network/HttpClient.zig b/src/network/HttpClient.zig index 45e155065..a1ee7bcdc 100644 --- a/src/network/HttpClient.zig +++ b/src/network/HttpClient.zig @@ -243,7 +243,10 @@ pub fn init(self: *Client, app: *lp.App) !void { .network = network, .single_flight = .init(allocator), }, - .cors = .{ .single_flight = .init(allocator) }, + .cors = .{ + .network = network, + .single_flight = .init(allocator), + }, .url_blocklist = url_blocklist, .arena_pool = &app.arena_pool, }; diff --git a/src/network/Network.zig b/src/network/Network.zig index f6593c008..7a78d5a24 100644 --- a/src/network/Network.zig +++ b/src/network/Network.zig @@ -27,6 +27,7 @@ const libcurl = @import("../sys/libcurl.zig"); const http = @import("http.zig"); const IpFilter = @import("IpFilter.zig"); const RobotStore = @import("Robots.zig").RobotStore; +const CorsStore = @import("CorsStore.zig"); const WebBotAuth = @import("WebBotAuth.zig"); const RateLimiter = @import("RateLimiter.zig"); const Certificates = @import("Certificates.zig"); @@ -43,6 +44,7 @@ cache: Cache, allocator: Allocator, config: *const Config, robot_store: RobotStore, +cors_store: CorsStore, web_bot_auth: ?WebBotAuth, rate_limiter: ?RateLimiter, certificates: Certificates, @@ -122,6 +124,7 @@ pub fn init(app: *App) !Network { .cache = cache, .robot_store = RobotStore.init(allocator, config.robotStoreEntryLimit()), + .cors_store = CorsStore.init(allocator), .web_bot_auth = web_bot_auth, .rate_limiter = if (config.httpNavDelay()) |ms| RateLimiter.init(allocator, ms, config.httpNavBurst()) else null, .adblocker = adblocker, @@ -144,6 +147,8 @@ pub fn deinit(self: *Network) void { self.ws_pool.deinit(self.allocator); self.robot_store.deinit(); + self.cors_store.deinit(); + if (self.rate_limiter) |*rl| { rl.deinit(); } From 982a1bea2ff33957a31a5927f163546bb57373e1 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Thu, 10 Sep 2026 12:05:52 -0700 Subject: [PATCH 18/47] actually put entries into CorsStore --- src/network/CorsGate.zig | 58 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index ba9310eb8..798ee6f4a 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -46,6 +46,7 @@ const ACCESS_CONTROL_ALLOW_ORIGIN = "access-control-allow-origin"; const ACCESS_CONTROL_ALLOW_METHODS = "access-control-allow-methods"; const ACCESS_CONTROL_ALLOW_HEADERS = "access-control-allow-headers"; const ACCESS_CONTROL_ALLOW_CREDENTIALS = "access-control-allow-credentials"; +const ACCESS_CONTROL_MAX_AGE = "access-control-max-age"; pub fn deinit(self: *CorsGate) void { self.single_flight.deinit(); @@ -294,6 +295,7 @@ const CorsPreflightContext = struct { key: []const u8, url: [:0]const u8, origin: []const u8, + target: []const u8, method: http.Method, request_headers: []const []const u8, wants_credentials: bool, @@ -390,6 +392,52 @@ const CorsPreflightContext = struct { return true; } + fn cacheGrant(self: *CorsPreflightContext, acam: ?[]const u8, acah: ?[]const u8, acma: ?[]const u8) !void { + if (self.target.len == 0) return; + + const max_age_s: u64 = if (acma) |v| std.fmt.parseUnsigned(u64, v, 10) catch return else return; + if (max_age_s == 0) return; + + const capped_s: u64 = @min(max_age_s, 7200); + const capped_ms = capped_s * 1000; + + const allocator = self.arena.allocator(); + + const methods_wildcard = acam != null and std.mem.eql(u8, acam.?, "*") and !self.wants_credentials; + var methods = std.EnumSet(http.Method).initEmpty(); + if (!methods_wildcard) { + if (acam) |list| { + var it = std.mem.splitScalar(u8, list, ','); + while (it.next()) |raw| { + const token = std.mem.trim(u8, raw, &std.ascii.whitespace); + if (std.meta.stringToEnum(http.Method, token)) |m| methods.insert(m); + } + } + } + + const headers_wildcard = acah != null and std.mem.eql(u8, acah.?, "*") and !self.wants_credentials; + var owned_headers: []const []const u8 = &.{}; + if (!headers_wildcard and self.request_headers.len > 0) { + const dup = try allocator.alloc([]const u8, self.request_headers.len); + for (self.request_headers, 0..) |src, i| { + dup[i] = try allocator.dupe(u8, src); + } + owned_headers = dup; + } + + try self.gate.network.cors_store.put( + .{ .origin = self.origin, .target = self.target }, + .{ + .credentials = self.wants_credentials, + .methods_wildcard = methods_wildcard, + .methods = methods, + .headers_wildcard = headers_wildcard, + .headers = owned_headers, + .expires_at = lp.datetime.timestamp(.real) + capped_ms, + }, + ); + } + fn methodAllowed(list: []const u8, method: http.Method) bool { const method_name = @tagName(method); var it = std.mem.splitScalar(u8, list, ','); @@ -428,6 +476,7 @@ const CorsPreflightContext = struct { var acam: ?[]const u8 = null; var acah: ?[]const u8 = null; var acac: ?[]const u8 = null; + var acma: ?[]const u8 = null; var iter = transfer.responseHeaderIterator(); while (iter.next()) |hdr| { @@ -439,10 +488,17 @@ const CorsPreflightContext = struct { acah = hdr.value; } else if (std.ascii.eqlIgnoreCase(ACCESS_CONTROL_ALLOW_CREDENTIALS, hdr.name)) { acac = hdr.value; + } else if (std.ascii.eqlIgnoreCase(ACCESS_CONTROL_MAX_AGE, hdr.name)) { + acma = hdr.value; } } self.allowed = self.validateHeaders(acao, acam, acah, acac); + if (self.allowed) { + self.cacheGrant(acam, acah, acma) catch |err| { + log.warn(.cors, "preflight cache store failed", .{ .url = self.url, .err = err }); + }; + } return .proceed; } @@ -520,6 +576,7 @@ fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void { const owned_url = try arena.dupeZ(u8, transfer.req.url); const owned_key = try arena.dupe(u8, key); const owned_origin = try arena.dupe(u8, origin); + const owned_target = try URL.getOrigin(arena.allocator(), transfer.req.url) orelse ""; const referer: ?[]const u8 = transfer.findRequestHeader("referer"); @@ -536,6 +593,7 @@ fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void { .key = owned_key, .url = owned_url, .origin = owned_origin, + .target = owned_target, .method = transfer.req.method, .request_headers = owned_header_names, .wants_credentials = transfer.req.credentials_mode == .include, From 9296dff6445bf77f6bee2e7575cc96ea9d3e9729 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Thu, 10 Sep 2026 12:19:36 -0700 Subject: [PATCH 19/47] fix more WPT test edge cases for preflight cache --- src/network/CorsGate.zig | 39 +++++++++++++++++++-------------------- src/network/CorsStore.zig | 14 +++++++------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index 798ee6f4a..59685cb9d 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -217,19 +217,17 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result { return .allowed; } - if (try URL.getOrigin(transfer.arena.allocator(), req.url)) |target| { - if (self.network.cors_store.get(.{ .origin = origin, .target = target })) |cached| { - const authored = try collectAuthoredHeaders(transfer, transfer.arena.allocator()); - if (CorsStore.covers(cached, req.method, req.credentials_mode == .include, authored.items)) { - log.debug(.cors, "cross origin", .{ - .url = req.url, - .origin = origin, - .preflight = false, - .cached = true, - }); - lp.metrics.cors_check.incr(.cached); - return .allowed; - } + if (self.network.cors_store.get(.{ .origin = origin, .target = req.url })) |cached| { + const authored = try collectAuthoredHeaders(transfer, transfer.arena.allocator()); + if (CorsStore.covers(cached, req.method, req.credentials_mode == .include, authored.items)) { + log.debug(.cors, "cross origin", .{ + .url = req.url, + .origin = origin, + .preflight = false, + .cached = true, + }); + lp.metrics.cors_check.incr(.cached); + return .allowed; } } @@ -295,7 +293,6 @@ const CorsPreflightContext = struct { key: []const u8, url: [:0]const u8, origin: []const u8, - target: []const u8, method: http.Method, request_headers: []const []const u8, wants_credentials: bool, @@ -393,9 +390,13 @@ const CorsPreflightContext = struct { } fn cacheGrant(self: *CorsPreflightContext, acam: ?[]const u8, acah: ?[]const u8, acma: ?[]const u8) !void { - if (self.target.len == 0) return; + if (self.url.len == 0) return; - const max_age_s: u64 = if (acma) |v| std.fmt.parseUnsigned(u64, v, 10) catch return else return; + const max_age_s: u64 = blk: { + const v = acma orelse break :blk 5; + if (v.len == 0) break :blk 5; + break :blk std.fmt.parseUnsigned(u64, v, 10) catch return; + }; if (max_age_s == 0) return; const capped_s: u64 = @min(max_age_s, 7200); @@ -426,14 +427,14 @@ const CorsPreflightContext = struct { } try self.gate.network.cors_store.put( - .{ .origin = self.origin, .target = self.target }, + .{ .origin = self.origin, .target = self.url }, .{ .credentials = self.wants_credentials, .methods_wildcard = methods_wildcard, .methods = methods, .headers_wildcard = headers_wildcard, .headers = owned_headers, - .expires_at = lp.datetime.timestamp(.real) + capped_ms, + .expires_at = lp.datetime.milliTimestamp(.real) + capped_ms, }, ); } @@ -576,7 +577,6 @@ fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void { const owned_url = try arena.dupeZ(u8, transfer.req.url); const owned_key = try arena.dupe(u8, key); const owned_origin = try arena.dupe(u8, origin); - const owned_target = try URL.getOrigin(arena.allocator(), transfer.req.url) orelse ""; const referer: ?[]const u8 = transfer.findRequestHeader("referer"); @@ -593,7 +593,6 @@ fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void { .key = owned_key, .url = owned_url, .origin = owned_origin, - .target = owned_target, .method = transfer.req.method, .request_headers = owned_header_names, .wants_credentials = transfer.req.credentials_mode == .include, diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index 696c5676a..482639c0d 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -159,7 +159,7 @@ pub fn get(self: *CorsStore, key: Key) ?Entry { const entry = self.map.get(key) orelse return null; - if (entry.expires_at <= lp.datetime.timestamp(.real)) { + if (entry.expires_at <= lp.datetime.milliTimestamp(.real)) { const kv = self.map.fetchRemove(key).?; kv.key.deinit(self.allocator); kv.value.deinit(self.allocator); @@ -250,7 +250,7 @@ test "CorsStore: put then get, miss on different origin/target" { .methods = std.EnumSet(http.Method).initOne(.POST), .headers_wildcard = false, .headers = headers, - .expires_at = lp.datetime.timestamp(.real) + 60_000, + .expires_at = lp.datetime.milliTimestamp(.real) + 60_000, }); // store.get returns the store's own copy — not caller-owned, don't free it. @@ -273,7 +273,7 @@ test "CorsStore: expired entries are evicted on get" { .methods = .initEmpty(), .headers_wildcard = true, .headers = &.{}, // empty slice, nothing to free - .expires_at = lp.datetime.timestamp(.real) - 1, + .expires_at = lp.datetime.milliTimestamp(.real) - 1, }); try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://api.example" })); @@ -295,7 +295,7 @@ test "CorsStore: put merges into existing entry rather than clobbering" { .methods = std.EnumSet(http.Method).initOne(.POST), .headers_wildcard = false, .headers = h1, - .expires_at = lp.datetime.timestamp(.real) + 60_000, + .expires_at = lp.datetime.milliTimestamp(.real) + 60_000, }); freeHeaders(allocator, h1); @@ -307,7 +307,7 @@ test "CorsStore: put merges into existing entry rather than clobbering" { .methods = std.EnumSet(http.Method).initOne(.PUT), .headers_wildcard = false, .headers = h2, - .expires_at = lp.datetime.timestamp(.real) + 60_000, + .expires_at = lp.datetime.milliTimestamp(.real) + 60_000, }); freeHeaders(allocator, h2); @@ -328,7 +328,7 @@ test "CorsStore: covers rejects credentialed request against uncredentialed wild .methods = .initEmpty(), .headers_wildcard = true, .headers = &.{}, - .expires_at = std.math.maxInt(i64), + .expires_at = std.math.maxInt(u64), }; try testing.expect(!CorsStore.covers(entry, .GET, true, &.{})); try testing.expect(CorsStore.covers(entry, .GET, false, &.{})); @@ -341,7 +341,7 @@ test "CorsStore: covers never lets a wildcard cover Authorization" { .methods = .initEmpty(), .headers_wildcard = true, .headers = &.{}, - .expires_at = std.math.maxInt(i64), + .expires_at = std.math.maxInt(u64), }; try testing.expect(!CorsStore.covers(entry, .GET, false, &.{"authorization"})); try testing.expect(CorsStore.covers(entry, .GET, false, &.{"x-anything"})); From 74d13e4193af9dfcd1d5e32add7038df303bd4e1 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Sun, 13 Sep 2026 14:58:11 -0700 Subject: [PATCH 20/47] make key hash eql case sensitive --- src/network/CorsStore.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index 482639c0d..6ea90bb0e 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -50,7 +50,7 @@ const KeyContext = struct { } pub fn eql(_: KeyContext, a: Key, b: Key) bool { - return std.ascii.eqlIgnoreCase(a.origin, b.origin) and std.ascii.eqlIgnoreCase(a.target, b.target); + return std.mem.eql(u8, a.origin, b.origin) and std.mem.eql(u8, a.target, b.target); } }; From 777b954dad79a3921ad4f484252be8bd3075233b Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Sun, 13 Sep 2026 15:08:36 -0700 Subject: [PATCH 21/47] add credentials to cors gate key --- src/network/CorsGate.zig | 15 ++++-- src/network/CorsStore.zig | 104 +++++++++++++++++++++++++------------- 2 files changed, 78 insertions(+), 41 deletions(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index 59685cb9d..7b390add8 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -77,7 +77,7 @@ fn flushPending(self: *CorsGate, key: []const u8, allowed: bool) void { } } -fn isSafelistedMethod(value: http.Method) bool { +pub fn isSafelistedMethod(value: http.Method) bool { return switch (value) { .GET, .HEAD, .POST => true, else => false, @@ -217,9 +217,15 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result { return .allowed; } - if (self.network.cors_store.get(.{ .origin = origin, .target = req.url })) |cached| { + const wants_credentials = req.credentials_mode == .include; + + if (self.network.cors_store.get(.{ + .origin = origin, + .target = req.url, + .credentials = wants_credentials, + })) |cached| { const authored = try collectAuthoredHeaders(transfer, transfer.arena.allocator()); - if (CorsStore.covers(cached, req.method, req.credentials_mode == .include, authored.items)) { + if (CorsStore.covers(cached, req.method, authored.items)) { log.debug(.cors, "cross origin", .{ .url = req.url, .origin = origin, @@ -427,9 +433,8 @@ const CorsPreflightContext = struct { } try self.gate.network.cors_store.put( - .{ .origin = self.origin, .target = self.url }, + .{ .origin = self.origin, .target = self.url, .credentials = self.wants_credentials }, .{ - .credentials = self.wants_credentials, .methods_wildcard = methods_wildcard, .methods = methods, .headers_wildcard = headers_wildcard, diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index 6ea90bb0e..2333b6a87 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -20,17 +20,20 @@ const std = @import("std"); const lp = @import("lightpanda"); const http = @import("http.zig"); +const isSafelistedMethod = @import("CorsGate.zig").isSafelistedMethod; const CorsStore = @This(); const Key = struct { origin: []const u8, target: []const u8, + credentials: bool, fn dupe(self: Key, allocator: std.mem.Allocator) !Key { return .{ .origin = try allocator.dupe(u8, self.origin), .target = try allocator.dupe(u8, self.target), + .credentials = self.credentials, }; } @@ -46,11 +49,15 @@ const KeyContext = struct { hasher.update(key.origin); hasher.update(&.{0}); hasher.update(key.target); + hasher.update(&.{0}); + hasher.update(&.{@intFromBool(key.credentials)}); return hasher.final(); } pub fn eql(_: KeyContext, a: Key, b: Key) bool { - return std.mem.eql(u8, a.origin, b.origin) and std.mem.eql(u8, a.target, b.target); + return std.mem.eql(u8, a.origin, b.origin) and + std.mem.eql(u8, a.target, b.target) and + a.credentials == b.credentials; } }; @@ -63,8 +70,6 @@ const Entry = struct { expires_at: u64, - credentials: bool, - fn unionHeaders( allocator: std.mem.Allocator, a: []const []const u8, @@ -94,7 +99,6 @@ const Entry = struct { fn merge(self: Entry, allocator: std.mem.Allocator, new: Entry) !Entry { return .{ - .credentials = self.credentials or new.credentials, .methods_wildcard = self.methods_wildcard or new.methods_wildcard, .methods = self.methods.unionWith(new.methods), .headers_wildcard = self.headers_wildcard or new.headers_wildcard, @@ -120,7 +124,6 @@ const Entry = struct { .headers_wildcard = self.headers_wildcard, .headers = new_headers.items, .expires_at = self.expires_at, - .credentials = self.credentials, }; } @@ -200,14 +203,9 @@ pub fn put(self: *CorsStore, key: Key, entry: Entry) !void { pub fn covers( entry: Entry, method: http.Method, - wants_credentials: bool, authored_headers: []const []const u8, ) bool { - if (wants_credentials and !entry.credentials) { - return false; - } - - if (!entry.methods_wildcard and !entry.methods.contains(method)) { + if (!isSafelistedMethod(method) and !entry.methods_wildcard and !entry.methods.contains(method)) { return false; } @@ -235,7 +233,7 @@ fn freeHeaders(allocator: std.mem.Allocator, headers: []const []const u8) void { allocator.free(headers); } -test "CorsStore: put then get, miss on different origin/target" { +test "CorsStore: put then get, miss on different origin/target/credentials" { const allocator = testing.allocator; var store = CorsStore.init(allocator); defer store.deinit(); @@ -244,8 +242,7 @@ test "CorsStore: put then get, miss on different origin/target" { headers[0] = try allocator.dupe(u8, "x-custom"); defer freeHeaders(allocator, headers); - try store.put(.{ .origin = "https://a.example", .target = "https://api.example" }, .{ - .credentials = false, + try store.put(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, .{ .methods_wildcard = false, .methods = std.EnumSet(http.Method).initOne(.POST), .headers_wildcard = false, @@ -254,12 +251,15 @@ test "CorsStore: put then get, miss on different origin/target" { }); // store.get returns the store's own copy — not caller-owned, don't free it. - const hit = store.get(.{ .origin = "https://a.example", .target = "https://api.example" }).?; + const hit = store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }).?; try testing.expect(hit.methods.contains(.POST)); try testing.expect(!hit.methods.contains(.GET)); - try testing.expectEqual(null, store.get(.{ .origin = "https://b.example", .target = "https://api.example" })); - try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://other.example" })); + try testing.expectEqual(null, store.get(.{ .origin = "https://b.example", .target = "https://api.example", .credentials = false })); + try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://other.example", .credentials = false })); + + // Same origin/target but different credentials mode: separate entry, must miss. + try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = true })); } test "CorsStore: expired entries are evicted on get" { @@ -267,8 +267,7 @@ test "CorsStore: expired entries are evicted on get" { var store = CorsStore.init(allocator); defer store.deinit(); - try store.put(.{ .origin = "https://a.example", .target = "https://api.example" }, .{ - .credentials = false, + try store.put(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, .{ .methods_wildcard = true, .methods = .initEmpty(), .headers_wildcard = true, @@ -276,7 +275,7 @@ test "CorsStore: expired entries are evicted on get" { .expires_at = lp.datetime.milliTimestamp(.real) - 1, }); - try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://api.example" })); + try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false })); try testing.expectEqual(0, store.map.count()); } @@ -285,12 +284,11 @@ test "CorsStore: put merges into existing entry rather than clobbering" { var store = CorsStore.init(allocator); defer store.deinit(); - const key = Key{ .origin = "https://a.example", .target = "https://api.example" }; + const key = Key{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }; const h1 = try allocator.alloc([]const u8, 1); h1[0] = try allocator.dupe(u8, "x-one"); try store.put(key, .{ - .credentials = false, .methods_wildcard = false, .methods = std.EnumSet(http.Method).initOne(.POST), .headers_wildcard = false, @@ -302,7 +300,6 @@ test "CorsStore: put merges into existing entry rather than clobbering" { const h2 = try allocator.alloc([]const u8, 1); h2[0] = try allocator.dupe(u8, "x-two"); try store.put(key, .{ - .credentials = false, .methods_wildcard = false, .methods = std.EnumSet(http.Method).initOne(.PUT), .headers_wildcard = false, @@ -316,33 +313,68 @@ test "CorsStore: put merges into existing entry rather than clobbering" { try testing.expect(merged.methods.contains(.PUT)); try testing.expectEqual(2, merged.headers.len); - try testing.expect(CorsStore.covers(merged, .POST, false, &.{"x-one"})); - try testing.expect(CorsStore.covers(merged, .PUT, false, &.{"x-two"})); - try testing.expect(!CorsStore.covers(merged, .DELETE, false, &.{})); + try testing.expect(CorsStore.covers(merged, .POST, &.{"x-one"})); + try testing.expect(CorsStore.covers(merged, .PUT, &.{"x-two"})); + try testing.expect(!CorsStore.covers(merged, .DELETE, &.{})); } -test "CorsStore: covers rejects credentialed request against uncredentialed wildcard" { - const entry = CorsStore.Entry{ - .credentials = false, +test "CorsStore: credentialed and non-credentialed grants for same origin/target stay separate" { + const allocator = testing.allocator; + var store = CorsStore.init(allocator); + defer store.deinit(); + + const origin = "https://a.example"; + const target = "https://api.example"; + + // Non-credentialed grant: wildcard headers allowed (valid per spec for non-cred requests). + try store.put(.{ .origin = origin, .target = target, .credentials = false }, .{ .methods_wildcard = true, .methods = .initEmpty(), .headers_wildcard = true, .headers = &.{}, - .expires_at = std.math.maxInt(u64), - }; - try testing.expect(!CorsStore.covers(entry, .GET, true, &.{})); - try testing.expect(CorsStore.covers(entry, .GET, false, &.{})); + .expires_at = lp.datetime.milliTimestamp(.real) + 60_000, + }); + + // Credentialed grant: explicit methods/headers only, no wildcard. + const h = try allocator.alloc([]const u8, 1); + h[0] = try allocator.dupe(u8, "x-custom"); + try store.put(.{ .origin = origin, .target = target, .credentials = true }, .{ + .methods_wildcard = false, + .methods = std.EnumSet(http.Method).initOne(.GET), + .headers_wildcard = false, + .headers = h, + .expires_at = lp.datetime.milliTimestamp(.real) + 60_000, + }); + freeHeaders(allocator, h); + + const non_cred = store.get(.{ .origin = origin, .target = target, .credentials = false }).?; + const cred = store.get(.{ .origin = origin, .target = target, .credentials = true }).?; + + // The two entries must never have merged: the credentialed entry must NOT + // have inherited the non-credentialed entry's wildcard. + try testing.expect(non_cred.headers_wildcard); + try testing.expect(!cred.headers_wildcard); + try testing.expect(!cred.methods_wildcard); + try testing.expect(cred.methods.contains(.GET)); + try testing.expect(!cred.methods.contains(.POST)); + + // A credentialed request asking for an arbitrary header must be rejected + // against the credentialed entry, even though the non-cred entry has a wildcard. + try testing.expect(!CorsStore.covers(cred, .GET, &.{"x-anything"})); + try testing.expect(CorsStore.covers(cred, .GET, &.{"x-custom"})); + + // The non-credentialed entry's wildcard still works for non-cred requests. + try testing.expect(CorsStore.covers(non_cred, .GET, &.{"x-anything"})); } test "CorsStore: covers never lets a wildcard cover Authorization" { const entry = CorsStore.Entry{ - .credentials = false, .methods_wildcard = true, .methods = .initEmpty(), .headers_wildcard = true, .headers = &.{}, .expires_at = std.math.maxInt(u64), }; - try testing.expect(!CorsStore.covers(entry, .GET, false, &.{"authorization"})); - try testing.expect(CorsStore.covers(entry, .GET, false, &.{"x-anything"})); + try testing.expect(!CorsStore.covers(entry, .GET, &.{"authorization"})); + try testing.expect(CorsStore.covers(entry, .GET, &.{"x-anything"})); } From 744dac3a13b71cc4c3f0c17de6aa65e01bfb7f5b Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Sun, 13 Sep 2026 15:59:33 -0700 Subject: [PATCH 22/47] CorsStore.get returns a owned Entry --- src/network/CorsGate.zig | 3 ++- src/network/CorsStore.zig | 30 +++++++++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index 7b390add8..b8a3d4fdc 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -219,11 +219,12 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result { const wants_credentials = req.credentials_mode == .include; - if (self.network.cors_store.get(.{ + if (try self.network.cors_store.get(.{ .origin = origin, .target = req.url, .credentials = wants_credentials, })) |cached| { + defer cached.deinit(self.network.cors_store.allocator); const authored = try collectAuthoredHeaders(transfer, transfer.arena.allocator()); if (CorsStore.covers(cached, req.method, authored.items)) { log.debug(.cors, "cross origin", .{ diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index 2333b6a87..f50dfe8c6 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -61,7 +61,7 @@ const KeyContext = struct { } }; -const Entry = struct { +pub const Entry = struct { methods_wildcard: bool, methods: std.EnumSet(http.Method), @@ -127,7 +127,7 @@ const Entry = struct { }; } - fn deinit(self: Entry, allocator: std.mem.Allocator) void { + pub fn deinit(self: Entry, allocator: std.mem.Allocator) void { for (self.headers) |h| allocator.free(h); allocator.free(self.headers); } @@ -156,7 +156,7 @@ pub fn deinit(self: *CorsStore) void { self.map.deinit(self.allocator); } -pub fn get(self: *CorsStore, key: Key) ?Entry { +pub fn get(self: *CorsStore, key: Key) !?Entry { self.mutex.lockUncancelable(lp.io); defer self.mutex.unlock(lp.io); @@ -169,7 +169,7 @@ pub fn get(self: *CorsStore, key: Key) ?Entry { return null; } - return entry; + return try entry.dupe(self.allocator); } /// Insert or merge a CORS grant for (origin, target). `entry` is not @@ -250,16 +250,17 @@ test "CorsStore: put then get, miss on different origin/target/credentials" { .expires_at = lp.datetime.milliTimestamp(.real) + 60_000, }); - // store.get returns the store's own copy — not caller-owned, don't free it. - const hit = store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }).?; + // store.get returns a caller-owned copy: it must be freed. + const hit = (try store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false })).?; + defer hit.deinit(allocator); try testing.expect(hit.methods.contains(.POST)); try testing.expect(!hit.methods.contains(.GET)); - try testing.expectEqual(null, store.get(.{ .origin = "https://b.example", .target = "https://api.example", .credentials = false })); - try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://other.example", .credentials = false })); + try testing.expectEqual(null, try store.get(.{ .origin = "https://b.example", .target = "https://api.example", .credentials = false })); + try testing.expectEqual(null, try store.get(.{ .origin = "https://a.example", .target = "https://other.example", .credentials = false })); // Same origin/target but different credentials mode: separate entry, must miss. - try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = true })); + try testing.expectEqual(null, try store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = true })); } test "CorsStore: expired entries are evicted on get" { @@ -275,7 +276,7 @@ test "CorsStore: expired entries are evicted on get" { .expires_at = lp.datetime.milliTimestamp(.real) - 1, }); - try testing.expectEqual(null, store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false })); + try testing.expectEqual(null, try store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false })); try testing.expectEqual(0, store.map.count()); } @@ -308,7 +309,8 @@ test "CorsStore: put merges into existing entry rather than clobbering" { }); freeHeaders(allocator, h2); - const merged = store.get(key).?; + const merged = (try store.get(key)).?; + defer merged.deinit(allocator); try testing.expect(merged.methods.contains(.POST)); try testing.expect(merged.methods.contains(.PUT)); try testing.expectEqual(2, merged.headers.len); @@ -347,8 +349,10 @@ test "CorsStore: credentialed and non-credentialed grants for same origin/target }); freeHeaders(allocator, h); - const non_cred = store.get(.{ .origin = origin, .target = target, .credentials = false }).?; - const cred = store.get(.{ .origin = origin, .target = target, .credentials = true }).?; + const non_cred = (try store.get(.{ .origin = origin, .target = target, .credentials = false })).?; + defer non_cred.deinit(allocator); + const cred = (try store.get(.{ .origin = origin, .target = target, .credentials = true })).?; + defer cred.deinit(allocator); // The two entries must never have merged: the credentialed entry must NOT // have inherited the non-credentialed entry's wildcard. From 4afdc412eec21f03d24bc3e55a236f75965cb833 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 07:33:14 -0700 Subject: [PATCH 23/47] add cors-store-entry-limit option --- src/Config.zig | 8 ++++++++ src/help.zon | 3 +++ 2 files changed, 11 insertions(+) diff --git a/src/Config.zig b/src/Config.zig index 3562346c6..9dd641380 100644 --- a/src/Config.zig +++ b/src/Config.zig @@ -254,6 +254,7 @@ pub const ExperimentalFeatures = packed struct(u2) { const CommonOptions = .{ .{ .name = "obey_robots", .type = bool }, .{ .name = "robot_store_entry_limit", .type = ?u32, .default = 1000 }, + .{ .name = "cors_store_entry_limit", .type = ?u32, .default = 1000 }, .{ .name = "proxy_bearer_token", .type = ?[:0]const u8 }, .{ .name = "http_proxy", .type = ?[:0]const u8 }, .{ .name = "http_max_concurrent", .type = ?u8 }, @@ -570,6 +571,13 @@ pub fn robotStoreEntryLimit(self: *const Config) u32 { }; } +pub fn corsStoreEntryLimit(self: *const Config) u32 { + return switch (self.mode) { + inline .serve, .fetch, .mcp, .agent => |opts| opts.cors_store_entry_limit.?, + else => 1000, + }; +} + pub fn httpVersion(self: *const Config) HttpVersion { return switch (self.mode) { inline .serve, .fetch, .mcp, .agent => |opts| opts.http_version, diff --git a/src/help.zon b/src/help.zon index 4fcf2426d..65b9d323c 100644 --- a/src/help.zon +++ b/src/help.zon @@ -505,6 +505,9 @@ \\ --robot-store-entry-limit \\ Maximum number of entries kept in the RobotStore. 0 means no limit. \\ Defaults to 1000. + \\ --cors-store-entry-limit + \\ Maximum number of entries kept in the CorsStore. 0 means no limit. + \\ Defaults to 1000. \\ --proxy-bearer-token \\ Token sent for bearer authentication with the proxy: \\ Proxy-Authorization: Bearer . From cc42b9f9c390cf73148e388e93c9406198f59bd2 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 07:39:57 -0700 Subject: [PATCH 24/47] use ClockCache in CorsStore --- src/network/ClockCache.zig | 9 ++++ src/network/CorsStore.zig | 102 +++++++++++++++++-------------------- src/network/Network.zig | 2 +- 3 files changed, 56 insertions(+), 57 deletions(-) diff --git a/src/network/ClockCache.zig b/src/network/ClockCache.zig index 4eaa21372..4a6b2ad53 100644 --- a/src/network/ClockCache.zig +++ b/src/network/ClockCache.zig @@ -64,6 +64,15 @@ pub fn ClockCache(comptime V: type) type { return &entry.value; } + pub fn remove(self: *Self, key: []const u8) ?V { + const index = self.map.getIndex(key) orelse return null; + const owned_key = self.map.keys()[index]; + const value = self.map.values()[index].value; + self.map.swapRemoveAt(index); + self.allocator.free(owned_key); + return value; + } + pub fn insert(self: *Self, key: []const u8, value: V) !InsertResult { const gop = try self.map.getOrPut(self.allocator, key); if (gop.found_existing) return .exists; diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index f50dfe8c6..7a5f12efa 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -21,43 +21,27 @@ const lp = @import("lightpanda"); const http = @import("http.zig"); const isSafelistedMethod = @import("CorsGate.zig").isSafelistedMethod; +const ClockCache = @import("ClockCache.zig").ClockCache; const CorsStore = @This(); -const Key = struct { +pub const Key = struct { origin: []const u8, target: []const u8, credentials: bool, - fn dupe(self: Key, allocator: std.mem.Allocator) !Key { - return .{ - .origin = try allocator.dupe(u8, self.origin), - .target = try allocator.dupe(u8, self.target), - .credentials = self.credentials, - }; - } + /// Serializes into a single string suitable as a ClockCache key. + fn build(self: Key, allocator: std.mem.Allocator) ![]const u8 { + var buf: std.ArrayList(u8) = .empty; + errdefer buf.deinit(allocator); - fn deinit(self: Key, allocator: std.mem.Allocator) void { - allocator.free(self.origin); - allocator.free(self.target); - } -}; + try buf.appendSlice(allocator, self.origin); + try buf.append(allocator, 0); + try buf.appendSlice(allocator, self.target); + try buf.append(allocator, 0); + try buf.append(allocator, @intFromBool(self.credentials)); -const KeyContext = struct { - pub fn hash(_: KeyContext, key: Key) u64 { - var hasher = std.hash.Wyhash.init(0); - hasher.update(key.origin); - hasher.update(&.{0}); - hasher.update(key.target); - hasher.update(&.{0}); - hasher.update(&.{@intFromBool(key.credentials)}); - return hasher.final(); - } - - pub fn eql(_: KeyContext, a: Key, b: Key) bool { - return std.mem.eql(u8, a.origin, b.origin) and - std.mem.eql(u8, a.target, b.target) and - a.credentials == b.credentials; + return buf.toOwnedSlice(allocator); } }; @@ -133,39 +117,38 @@ pub const Entry = struct { } }; -const Map = std.HashMapUnmanaged(Key, Entry, KeyContext, std.hash_map.default_max_load_percentage); - allocator: std.mem.Allocator, -map: Map = .empty, +map: ClockCache(Entry), mutex: std.Io.Mutex = .init, -pub fn init(allocator: std.mem.Allocator) CorsStore { - return .{ .allocator = allocator }; +pub fn init(allocator: std.mem.Allocator, capacity: usize) CorsStore { + return .{ .allocator = allocator, .map = .init(allocator, capacity) }; } pub fn deinit(self: *CorsStore) void { self.mutex.lockUncancelable(lp.io); defer self.mutex.unlock(lp.io); - var iter = self.map.iterator(); - while (iter.next()) |entry| { - entry.key_ptr.deinit(self.allocator); - entry.value_ptr.deinit(self.allocator); + for (self.map.entries()) |*entry| { + entry.value.deinit(self.allocator); } - - self.map.deinit(self.allocator); + self.map.deinit(); } pub fn get(self: *CorsStore, key: Key) !?Entry { + const cache_key = try key.build(self.allocator); + defer self.allocator.free(cache_key); + self.mutex.lockUncancelable(lp.io); defer self.mutex.unlock(lp.io); - const entry = self.map.get(key) orelse return null; + const entry = self.map.get(cache_key) orelse return null; if (entry.expires_at <= lp.datetime.milliTimestamp(.real)) { - const kv = self.map.fetchRemove(key).?; - kv.key.deinit(self.allocator); - kv.value.deinit(self.allocator); + if (self.map.remove(cache_key)) |e| { + e.deinit(self.allocator); + } + return null; } @@ -181,23 +164,31 @@ pub fn get(self: *CorsStore, key: Key) !?Entry { /// freeing `entry.headers` after this call, on both the insert and /// the merge path. pub fn put(self: *CorsStore, key: Key, entry: Entry) !void { + const cache_key = try key.build(self.allocator); + defer self.allocator.free(cache_key); + self.mutex.lockUncancelable(lp.io); defer self.mutex.unlock(lp.io); - const gop = try self.map.getOrPut(self.allocator, key); - if (!gop.found_existing) { - errdefer _ = self.map.remove(key); - gop.key_ptr.* = try key.dupe(self.allocator); - gop.value_ptr.* = try entry.dupe(self.allocator); + if (self.map.get(cache_key)) |existing| { + const merged = try existing.merge(self.allocator, entry); + existing.deinit(self.allocator); + existing.* = merged; return; } - const old = gop.value_ptr.*; - const merged = old.merge(self.allocator, entry) catch |err| { - return err; - }; - old.deinit(self.allocator); - gop.value_ptr.* = merged; + const owned_entry = try entry.dupe(self.allocator); + errdefer owned_entry.deinit(self.allocator); + + switch (try self.map.insert(cache_key, owned_entry)) { + .exists => unreachable, + .inserted => |evicted| { + if (evicted) |v| { + var e = v; + e.deinit(self.allocator); + } + }, + } } pub fn covers( @@ -263,7 +254,7 @@ test "CorsStore: put then get, miss on different origin/target/credentials" { try testing.expectEqual(null, try store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = true })); } -test "CorsStore: expired entries are evicted on get" { +test "CorsStore: expired entries are treated as a miss on get" { const allocator = testing.allocator; var store = CorsStore.init(allocator); defer store.deinit(); @@ -277,7 +268,6 @@ test "CorsStore: expired entries are evicted on get" { }); try testing.expectEqual(null, try store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false })); - try testing.expectEqual(0, store.map.count()); } test "CorsStore: put merges into existing entry rather than clobbering" { diff --git a/src/network/Network.zig b/src/network/Network.zig index 7a78d5a24..b27dc4329 100644 --- a/src/network/Network.zig +++ b/src/network/Network.zig @@ -124,7 +124,7 @@ pub fn init(app: *App) !Network { .cache = cache, .robot_store = RobotStore.init(allocator, config.robotStoreEntryLimit()), - .cors_store = CorsStore.init(allocator), + .cors_store = CorsStore.init(allocator, config.corsStoreEntryLimit()), .web_bot_auth = web_bot_auth, .rate_limiter = if (config.httpNavDelay()) |ms| RateLimiter.init(allocator, ms, config.httpNavBurst()) else null, .adblocker = adblocker, From b74d11e803b4ead8b84eb030dd03d0f75c85afef Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 07:44:54 -0700 Subject: [PATCH 25/47] check expiration whenever we get entry in CorsStore --- src/network/CorsStore.zig | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index 7a5f12efa..ae830ce94 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -135,13 +135,8 @@ pub fn deinit(self: *CorsStore) void { self.map.deinit(); } -pub fn get(self: *CorsStore, key: Key) !?Entry { - const cache_key = try key.build(self.allocator); - defer self.allocator.free(cache_key); - - self.mutex.lockUncancelable(lp.io); - defer self.mutex.unlock(lp.io); - +// Caller is expected to be holding mutex. +fn getWithExpiration(self: *CorsStore, cache_key: []const u8) ?*Entry { const entry = self.map.get(cache_key) orelse return null; if (entry.expires_at <= lp.datetime.milliTimestamp(.real)) { @@ -152,6 +147,17 @@ pub fn get(self: *CorsStore, key: Key) !?Entry { return null; } + return entry; +} + +pub fn get(self: *CorsStore, key: Key) !?Entry { + const cache_key = try key.build(self.allocator); + defer self.allocator.free(cache_key); + + self.mutex.lockUncancelable(lp.io); + defer self.mutex.unlock(lp.io); + + const entry = self.getWithExpiration(cache_key) orelse return null; return try entry.dupe(self.allocator); } @@ -170,7 +176,7 @@ pub fn put(self: *CorsStore, key: Key, entry: Entry) !void { self.mutex.lockUncancelable(lp.io); defer self.mutex.unlock(lp.io); - if (self.map.get(cache_key)) |existing| { + if (self.getWithExpiration(cache_key)) |existing| { const merged = try existing.merge(self.allocator, entry); existing.deinit(self.allocator); existing.* = merged; From c62d92a16996e111d13b020aa47703e61665e6cb Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 07:50:42 -0700 Subject: [PATCH 26/47] use effectiveOrigin in CorsGate --- src/network/CorsGate.zig | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index b8a3d4fdc..dfd2dcfd2 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -541,7 +541,7 @@ const CorsPreflightContext = struct { fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void { const url = transfer.req.url; - const origin = transfer.req.origin orelse "null"; + const origin = transfer.effectiveOrigin(); var header_names: std.ArrayList([]const u8) = .empty; for (transfer.req_headers.items) |hdr| { @@ -625,11 +625,7 @@ fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void { errdefer fetch_transfer.deinit(); // Origin - try fetch_transfer.setHeader( - ORIGIN, - transfer.req.origin orelse "null", - .{}, - ); + try fetch_transfer.setHeader(ORIGIN, transfer.effectiveOrigin(), .{}); if (referer) |r| { try fetch_transfer.setHeader("Referer", r, .{}); From 24ef506c918053cfd3a1264d86f7182c009c7548 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 07:56:33 -0700 Subject: [PATCH 27/47] merge get and covers to prevent entry duplication in CorsStore --- src/network/CorsGate.zig | 25 ++++++++--------- src/network/CorsStore.zig | 58 +++++++++++++++++++-------------------- 2 files changed, 40 insertions(+), 43 deletions(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index dfd2dcfd2..ee01c975d 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -219,23 +219,20 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result { const wants_credentials = req.credentials_mode == .include; - if (try self.network.cors_store.get(.{ + const authored = try collectAuthoredHeaders(transfer, transfer.arena.allocator()); + if (try self.network.cors_store.covers(.{ .origin = origin, .target = req.url, .credentials = wants_credentials, - })) |cached| { - defer cached.deinit(self.network.cors_store.allocator); - const authored = try collectAuthoredHeaders(transfer, transfer.arena.allocator()); - if (CorsStore.covers(cached, req.method, authored.items)) { - log.debug(.cors, "cross origin", .{ - .url = req.url, - .origin = origin, - .preflight = false, - .cached = true, - }); - lp.metrics.cors_check.incr(.cached); - return .allowed; - } + }, req.method, authored.items)) { + log.debug(.cors, "cross origin", .{ + .url = req.url, + .origin = origin, + .preflight = false, + .cached = true, + }); + lp.metrics.cors_check.incr(.cached); + return .allowed; } log.debug(.cors, "cross origin", .{ diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index ae830ce94..82ec7f483 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -150,15 +150,41 @@ fn getWithExpiration(self: *CorsStore, cache_key: []const u8) ?*Entry { return entry; } -pub fn get(self: *CorsStore, key: Key) !?Entry { +fn matches(entry: Entry, method: http.Method, authored_headers: []const []const u8) bool { + if (!isSafelistedMethod(method) and !entry.methods_wildcard and !entry.methods.contains(method)) { + return false; + } + for (authored_headers) |name| { + const is_authorization = std.ascii.eqlIgnoreCase(name, "authorization"); + if (entry.headers_wildcard and !is_authorization) continue; + var found = false; + for (entry.headers) |allowed| { + if (std.ascii.eqlIgnoreCase(allowed, name)) { + found = true; + break; + } + } + if (!found) return false; + } + return true; +} + +/// Whether a cached grant for `key` covers this method/headers combination. +/// A miss (expired or absent entry) is treated as not covered. +pub fn covers( + self: *CorsStore, + key: Key, + method: http.Method, + authored_headers: []const []const u8, +) !bool { const cache_key = try key.build(self.allocator); defer self.allocator.free(cache_key); self.mutex.lockUncancelable(lp.io); defer self.mutex.unlock(lp.io); - const entry = self.getWithExpiration(cache_key) orelse return null; - return try entry.dupe(self.allocator); + const entry = self.getWithExpiration(cache_key) orelse return false; + return matches(entry.*, method, authored_headers); } /// Insert or merge a CORS grant for (origin, target). `entry` is not @@ -197,32 +223,6 @@ pub fn put(self: *CorsStore, key: Key, entry: Entry) !void { } } -pub fn covers( - entry: Entry, - method: http.Method, - authored_headers: []const []const u8, -) bool { - if (!isSafelistedMethod(method) and !entry.methods_wildcard and !entry.methods.contains(method)) { - return false; - } - - for (authored_headers) |name| { - const is_authorization = std.ascii.eqlIgnoreCase(name, "authorization"); - if (entry.headers_wildcard and !is_authorization) continue; - - var found = false; - for (entry.headers) |allowed| { - if (std.ascii.eqlIgnoreCase(allowed, name)) { - found = true; - break; - } - } - if (!found) return false; - } - - return true; -} - const testing = @import("../testing.zig"); fn freeHeaders(allocator: std.mem.Allocator, headers: []const []const u8) void { From d6cbea9b1a43f71f27d23fc2c1e9ddd3de6f934e Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 07:58:48 -0700 Subject: [PATCH 28/47] use min expiration in CorsStore merge --- src/network/CorsStore.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index 82ec7f483..1cdd32901 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -87,7 +87,7 @@ pub const Entry = struct { .methods = self.methods.unionWith(new.methods), .headers_wildcard = self.headers_wildcard or new.headers_wildcard, .headers = try unionHeaders(allocator, self.headers, new.headers), - .expires_at = @max(self.expires_at, new.expires_at), + .expires_at = @min(self.expires_at, new.expires_at), }; } From 1ae01f3fc2bea9dda78f29fad6ee3ab0ea140e38 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 08:00:45 -0700 Subject: [PATCH 29/47] check creds grant if non-creds is missing in CorsGate --- src/network/CorsGate.zig | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index ee01c975d..8978edf96 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -220,11 +220,21 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result { const wants_credentials = req.credentials_mode == .include; const authored = try collectAuthoredHeaders(transfer, transfer.arena.allocator()); - if (try self.network.cors_store.covers(.{ + + var covered = try self.network.cors_store.covers(.{ .origin = origin, .target = req.url, .credentials = wants_credentials, - }, req.method, authored.items)) { + }, req.method, authored.items); + if (!covered and !wants_credentials) { + covered = try self.network.cors_store.covers(.{ + .origin = origin, + .target = req.url, + .credentials = true, + }, req.method, authored.items); + } + + if (covered) { log.debug(.cors, "cross origin", .{ .url = req.url, .origin = origin, From ecd05ec878baf06406e9e9afff06dc8c6d768a09 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 08:06:19 -0700 Subject: [PATCH 30/47] fix CorsStore tests --- src/network/CorsStore.zig | 109 +++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 44 deletions(-) diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index 1cdd32901..f3688a4a1 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -230,9 +230,9 @@ fn freeHeaders(allocator: std.mem.Allocator, headers: []const []const u8) void { allocator.free(headers); } -test "CorsStore: put then get, miss on different origin/target/credentials" { +test "CorsStore: put then covers, miss on different origin/target/credentials" { const allocator = testing.allocator; - var store = CorsStore.init(allocator); + var store = CorsStore.init(allocator, 10); defer store.deinit(); const headers = try allocator.alloc([]const u8, 1); @@ -247,22 +247,39 @@ test "CorsStore: put then get, miss on different origin/target/credentials" { .expires_at = lp.datetime.milliTimestamp(.real) + 60_000, }); - // store.get returns a caller-owned copy: it must be freed. - const hit = (try store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false })).?; - defer hit.deinit(allocator); - try testing.expect(hit.methods.contains(.POST)); - try testing.expect(!hit.methods.contains(.GET)); + try testing.expect(try store.covers( + .{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, + .POST, + &.{}, + )); + try testing.expect(!try store.covers( + .{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, + .PUT, + &.{}, + )); - try testing.expectEqual(null, try store.get(.{ .origin = "https://b.example", .target = "https://api.example", .credentials = false })); - try testing.expectEqual(null, try store.get(.{ .origin = "https://a.example", .target = "https://other.example", .credentials = false })); + try testing.expect(!try store.covers( + .{ .origin = "https://b.example", .target = "https://api.example", .credentials = false }, + .POST, + &.{}, + )); + try testing.expect(!try store.covers( + .{ .origin = "https://a.example", .target = "https://other.example", .credentials = false }, + .POST, + &.{}, + )); // Same origin/target but different credentials mode: separate entry, must miss. - try testing.expectEqual(null, try store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = true })); + try testing.expect(!try store.covers( + .{ .origin = "https://a.example", .target = "https://api.example", .credentials = true }, + .POST, + &.{}, + )); } -test "CorsStore: expired entries are treated as a miss on get" { +test "CorsStore: expired entries are treated as a miss on covers" { const allocator = testing.allocator; - var store = CorsStore.init(allocator); + var store = CorsStore.init(allocator, 10); defer store.deinit(); try store.put(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, .{ @@ -273,12 +290,16 @@ test "CorsStore: expired entries are treated as a miss on get" { .expires_at = lp.datetime.milliTimestamp(.real) - 1, }); - try testing.expectEqual(null, try store.get(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false })); + try testing.expect(!try store.covers( + .{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, + .GET, + &.{}, + )); } test "CorsStore: put merges into existing entry rather than clobbering" { const allocator = testing.allocator; - var store = CorsStore.init(allocator); + var store = CorsStore.init(allocator, 10); defer store.deinit(); const key = Key{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }; @@ -305,20 +326,14 @@ test "CorsStore: put merges into existing entry rather than clobbering" { }); freeHeaders(allocator, h2); - const merged = (try store.get(key)).?; - defer merged.deinit(allocator); - try testing.expect(merged.methods.contains(.POST)); - try testing.expect(merged.methods.contains(.PUT)); - try testing.expectEqual(2, merged.headers.len); - - try testing.expect(CorsStore.covers(merged, .POST, &.{"x-one"})); - try testing.expect(CorsStore.covers(merged, .PUT, &.{"x-two"})); - try testing.expect(!CorsStore.covers(merged, .DELETE, &.{})); + try testing.expect(try store.covers(key, .POST, &.{"x-one"})); + try testing.expect(try store.covers(key, .PUT, &.{"x-two"})); + try testing.expect(!try store.covers(key, .DELETE, &.{})); } test "CorsStore: credentialed and non-credentialed grants for same origin/target stay separate" { const allocator = testing.allocator; - var store = CorsStore.init(allocator); + var store = CorsStore.init(allocator, 10); defer store.deinit(); const origin = "https://a.example"; @@ -345,36 +360,42 @@ test "CorsStore: credentialed and non-credentialed grants for same origin/target }); freeHeaders(allocator, h); - const non_cred = (try store.get(.{ .origin = origin, .target = target, .credentials = false })).?; - defer non_cred.deinit(allocator); - const cred = (try store.get(.{ .origin = origin, .target = target, .credentials = true })).?; - defer cred.deinit(allocator); - - // The two entries must never have merged: the credentialed entry must NOT - // have inherited the non-credentialed entry's wildcard. - try testing.expect(non_cred.headers_wildcard); - try testing.expect(!cred.headers_wildcard); - try testing.expect(!cred.methods_wildcard); - try testing.expect(cred.methods.contains(.GET)); - try testing.expect(!cred.methods.contains(.POST)); - // A credentialed request asking for an arbitrary header must be rejected // against the credentialed entry, even though the non-cred entry has a wildcard. - try testing.expect(!CorsStore.covers(cred, .GET, &.{"x-anything"})); - try testing.expect(CorsStore.covers(cred, .GET, &.{"x-custom"})); + try testing.expect(!try store.covers( + .{ .origin = origin, .target = target, .credentials = true }, + .GET, + &.{"x-anything"}, + )); + try testing.expect(try store.covers( + .{ .origin = origin, .target = target, .credentials = true }, + .GET, + &.{"x-custom"}, + )); + try testing.expect(!try store.covers( + .{ .origin = origin, .target = target, .credentials = true }, + .PUT, + &.{}, + )); // The non-credentialed entry's wildcard still works for non-cred requests. - try testing.expect(CorsStore.covers(non_cred, .GET, &.{"x-anything"})); + try testing.expect(try store.covers(.{ .origin = origin, .target = target, .credentials = false }, .GET, &.{"x-anything"})); } test "CorsStore: covers never lets a wildcard cover Authorization" { - const entry = CorsStore.Entry{ + const allocator = testing.allocator; + var store = CorsStore.init(allocator, 10); + defer store.deinit(); + + const key = Key{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }; + try store.put(key, .{ .methods_wildcard = true, .methods = .initEmpty(), .headers_wildcard = true, .headers = &.{}, .expires_at = std.math.maxInt(u64), - }; - try testing.expect(!CorsStore.covers(entry, .GET, &.{"authorization"})); - try testing.expect(CorsStore.covers(entry, .GET, &.{"x-anything"})); + }); + + try testing.expect(!try store.covers(key, .GET, &.{"authorization"})); + try testing.expect(try store.covers(key, .GET, &.{"x-anything"})); } From fbf7b2f8c865c7499f7c5eb208702b939944f72b Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 12:00:38 -0700 Subject: [PATCH 31/47] cache grant for Cors in doneCallback --- src/network/CorsGate.zig | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index 8978edf96..e7ccc5fd4 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -312,6 +312,9 @@ const CorsPreflightContext = struct { wants_credentials: bool, allowed: bool = false, + acam: ?[]const u8 = null, + acah: ?[]const u8 = null, + acma: ?[]const u8 = null, fn validateHeaders( self: *CorsPreflightContext, @@ -509,15 +512,20 @@ const CorsPreflightContext = struct { self.allowed = self.validateHeaders(acao, acam, acah, acac); if (self.allowed) { - self.cacheGrant(acam, acah, acma) catch |err| { - log.warn(.cors, "preflight cache store failed", .{ .url = self.url, .err = err }); - }; + self.acam = acam; + self.acah = acah; + self.acma = acma; } return .proceed; } fn doneCallback(ctx_ptr: *anyopaque) anyerror!void { const self: *CorsPreflightContext = @ptrCast(@alignCast(ctx_ptr)); + if (self.allowed) { + self.cacheGrant(self.acam, self.acah, self.acma) catch |err| { + log.warn(.cors, "preflight cache store failed", .{ .url = self.url, .err = err }); + }; + } self.resolve(self.allowed); } From 682e69041982bb3c0b86dd567c0d9d2e7858a3ca Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 12:05:07 -0700 Subject: [PATCH 32/47] remove useless dupe in CorsStore --- src/network/CorsGate.zig | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index e7ccc5fd4..de5e1e3ef 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -419,8 +419,6 @@ const CorsPreflightContext = struct { const capped_s: u64 = @min(max_age_s, 7200); const capped_ms = capped_s * 1000; - const allocator = self.arena.allocator(); - const methods_wildcard = acam != null and std.mem.eql(u8, acam.?, "*") and !self.wants_credentials; var methods = std.EnumSet(http.Method).initEmpty(); if (!methods_wildcard) { @@ -434,14 +432,6 @@ const CorsPreflightContext = struct { } const headers_wildcard = acah != null and std.mem.eql(u8, acah.?, "*") and !self.wants_credentials; - var owned_headers: []const []const u8 = &.{}; - if (!headers_wildcard and self.request_headers.len > 0) { - const dup = try allocator.alloc([]const u8, self.request_headers.len); - for (self.request_headers, 0..) |src, i| { - dup[i] = try allocator.dupe(u8, src); - } - owned_headers = dup; - } try self.gate.network.cors_store.put( .{ .origin = self.origin, .target = self.url, .credentials = self.wants_credentials }, @@ -449,7 +439,7 @@ const CorsPreflightContext = struct { .methods_wildcard = methods_wildcard, .methods = methods, .headers_wildcard = headers_wildcard, - .headers = owned_headers, + .headers = if (headers_wildcard) &.{} else self.request_headers, .expires_at = lp.datetime.milliTimestamp(.real) + capped_ms, }, ); From d9539fbbe1572a5e06f2d8acf216dfc44a8e139f Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 23 Sep 2026 12:08:23 -0700 Subject: [PATCH 33/47] check both covers on Request under single mutex --- src/network/CorsGate.zig | 18 ++++++------------ src/network/CorsStore.zig | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index de5e1e3ef..5b904cdc9 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -221,18 +221,12 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result { const authored = try collectAuthoredHeaders(transfer, transfer.arena.allocator()); - var covered = try self.network.cors_store.covers(.{ - .origin = origin, - .target = req.url, - .credentials = wants_credentials, - }, req.method, authored.items); - if (!covered and !wants_credentials) { - covered = try self.network.cors_store.covers(.{ - .origin = origin, - .target = req.url, - .credentials = true, - }, req.method, authored.items); - } + const covered = try self.network.cors_store.coversRequest( + transfer.arena.allocator(), + .{ .origin = origin, .target = req.url, .credentials = wants_credentials }, + req.method, + authored.items, + ); if (covered) { log.debug(.cors, "cross origin", .{ diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index f3688a4a1..6df9c1018 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -187,6 +187,32 @@ pub fn covers( return matches(entry.*, method, authored_headers); } +pub fn coversRequest( + self: *CorsStore, + allocator: std.mem.Allocator, + key: Key, + method: http.Method, + authored_headers: []const []const u8, +) !bool { + const primary_key = try key.build(allocator); + defer allocator.free(primary_key); + + self.mutex.lockUncancelable(lp.io); + defer self.mutex.unlock(lp.io); + + if (self.getWithExpiration(primary_key)) |entry| { + if (matches(entry.*, method, authored_headers)) return true; + } + + if (key.credentials) return false; + + const cred_key = try (Key{ .origin = key.origin, .target = key.target, .credentials = true }).build(allocator); + defer allocator.free(cred_key); + + const entry = self.getWithExpiration(cred_key) orelse return false; + return matches(entry.*, method, authored_headers); +} + /// Insert or merge a CORS grant for (origin, target). `entry` is not /// consumed: `put` copies whatever it needs (via `dupe`/`merge`, which /// always allocate their own copies) and never takes ownership of From 1151eaebf3bb84fa8daaa14ab5676492d9fd1d51 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 24 Sep 2026 07:24:15 +0800 Subject: [PATCH 34/47] mem: SemanticTree and AXNode recursive walk -> iterative Following https://github.com/lightpanda-io/browser/pull/3573 and https://github.com/lightpanda-io/browser/pull/3602 this makes the two recursive walks iterative, preventing a SO on deep trees. --- src/SemanticTree.zig | 128 +++++++++++++++++++++++++++----------- src/server/cdp/AXNode.zig | 43 +++++++------ 2 files changed, 115 insertions(+), 56 deletions(-) diff --git a/src/SemanticTree.zig b/src/SemanticTree.zig index aab3576ce..d66373490 100644 --- a/src/SemanticTree.zig +++ b/src/SemanticTree.zig @@ -79,7 +79,7 @@ pub fn jsonStringify(self: @This(), jw: *std.json.Stringify) error{WriteFailed}! .listener_targets = listener_targets, .label_index = &label_index, }; - self.walk(&ctx, self.dom_node, null, &visitor, 1, 0) catch |err| { + self.walk(&ctx, &visitor) catch |err| { log.err(.app, "semantic tree json dump failed", .{ .err = err }); return error.WriteFailed; }; @@ -98,7 +98,7 @@ pub fn textStringify(self: @This(), writer: *std.Io.Writer) error{WriteFailed}!v .listener_targets = listener_targets, .label_index = &label_index, }; - self.walk(&ctx, self.dom_node, null, &visitor, 1, 0) catch |err| { + self.walk(&ctx, &visitor) catch |err| { log.err(.app, "semantic tree text dump failed", .{ .err = err }); return error.WriteFailed; }; @@ -130,15 +130,60 @@ const WalkContext = struct { label_index: *Label.LabelByForIndex, }; -fn walk( +// A node whose children are still being walked +const Open = struct { + next_child: ?*Node, + // for the children's xpath index + tag_counts: std.StringArrayHashMapUnmanaged(usize) = .empty, + name: ?[]const u8, // The children's parent_name + xpath_len: usize, + visited: bool, +}; + +fn walk(self: @This(), ctx: *WalkContext, visitor: anytype) !void { + var stack: std.ArrayList(Open) = .empty; + defer stack.deinit(self.arena); + + try self.visitNode(ctx, &stack, self.dom_node, null, visitor, 1); + while (stack.items.len > 0) { + // Everything read from `top` is read before visitNode, which can grow (move) the stack. + const top = &stack.items[stack.items.len - 1]; + if (top.next_child) |child| { + top.next_child = child._next; + + var tag: []const u8 = "text()"; + if (child.is(Element)) |el| { + tag = el.getTagNameLower(); + } + const gop = try top.tag_counts.getOrPut(self.arena, tag); + if (!gop.found_existing) { + gop.value_ptr.* = 0; + } + gop.value_ptr.* += 1; + + try self.visitNode(ctx, &stack, child, top.name, visitor, gop.value_ptr.*); + continue; + } + + const done = stack.pop().?; + if (done.visited) { + try visitor.leave(); + } + ctx.xpath_buffer.shrinkRetainingCapacity(done.xpath_len); + } +} + +// Every ancestor of `node` below the root is open, so the stack's length is its depth. +fn visitNode( self: @This(), ctx: *WalkContext, + stack: *std.ArrayList(Open), node: *Node, parent_name: ?[]const u8, visitor: anytype, index: usize, - current_depth: u32, ) !void { + const current_depth = stack.items.len; if (current_depth > self.max_depth) return; // 1. Skip non-content nodes @@ -216,8 +261,6 @@ fn walk( try appendXPathSegment(node, ctx.xpath_buffer, self.arena, index); const xpath = ctx.xpath_buffer.items; - var name = try axn.getName(self.frame, self.arena, ctx.label_index); - const has_explicit_label = if (node.is(Element)) |el| el.getAttributeInterned("aria-label") != null or el.getAttributeInterned("title") != null else @@ -225,12 +268,14 @@ fn walk( const structural = isStructuralRole(role); - // Filter out computed concatenated names for generic containers without explicit labels. + // No computed concatenated names for generic containers without explicit labels. // This prevents token bloat and ensures their StaticText children aren't incorrectly pruned. // We ignore interactivity because a generic wrapper with an event listener still shouldn't hoist all text. - if (name != null and structural and !has_explicit_label) { - name = null; - } + // Not computing it also keeps a deep chain of containers from being O(depth²). + const name = if (structural and !has_explicit_label) + null + else + try axn.getName(self.frame, self.arena, ctx.label_index); var should_visit = true; if (self.interactive_only) { @@ -285,32 +330,12 @@ fn walk( did_visit = false; } - if (should_walk_children) { - // If we are printing this node normally OR skipping it and unrolling its children, - // we walk the children iterator. - var it = node.childrenIterator(); - var tag_counts: std.StringArrayHashMapUnmanaged(usize) = .empty; - while (it.next()) |child| { - var tag: []const u8 = "text()"; - if (child.is(Element)) |el| { - tag = el.getTagNameLower(); - } - - const gop = try tag_counts.getOrPut(self.arena, tag); - if (!gop.found_existing) { - gop.value_ptr.* = 0; - } - gop.value_ptr.* += 1; - - try self.walk(ctx, child, name, visitor, gop.value_ptr.*, current_depth + 1); - } - } - - if (did_visit) { - try visitor.leave(); - } - - ctx.xpath_buffer.shrinkRetainingCapacity(initial_xpath_len); + try stack.append(self.arena, .{ + .next_child = if (should_walk_children) node._first_child else null, + .name = name, + .xpath_len = initial_xpath_len, + .visited = did_visit, + }); } fn extractSelectOptions(node: *Node, frame: *Frame, arena: std.mem.Allocator) ![]OptionData { @@ -787,3 +812,34 @@ test "SemanticTree max_depth" { try testing.expect(std.mem.indexOf(u8, text_str, "other") == null); } + +test "SemanticTree: deep nesting doesn't overflow the native stack" { + var registry: NodeRegistry = .init(testing.allocator); + defer registry.deinit(); + + const frame = try testing.createFrame(); + defer testing.test_session.closeAllPages(); + + // The link's name comes from its content: the whole chain. The s are + // pruned, so the JSON only nests link > text. SVG, as an HTML element's + // pointer-events lookup walks its ancestors: O(depth²). + const depth = 50_000; + const doc = frame.window._document; + var top = try doc.createTextNode("deep"); + for (0..depth) |_| { + const parent = (try doc.createElementNS("http://www.w3.org/2000/svg", "g", frame)).asNode(); + _ = try parent.appendChild(top, frame); + top = parent; + } + const link = try doc.createElement("a", null, frame); + try link.setAttribute(.wrap("href"), .wrap("#"), frame); + _ = try link.asNode().appendChild(top, frame); + + const st: Self = try .init(testing.arena_allocator, link.asNode(), ®istry, frame, .{}); + const json_str = try std.json.Stringify.valueAlloc(testing.allocator, st, .{}); + defer testing.allocator.free(json_str); + + try testing.expect(std.mem.indexOf(u8, json_str, "\"role\":\"link\",\"name\":\"deep\"") != null); + try testing.expectEqual(depth, std.mem.count(u8, json_str, "/g[1]")); + try testing.expect(std.mem.endsWith(u8, json_str, "/text()[1]\",\"nodeType\":3,\"nodeValue\":\"deep\",\"children\":[]}]}")); +} diff --git a/src/server/cdp/AXNode.zig b/src/server/cdp/AXNode.zig index 64dc8e703..af0fc17e0 100644 --- a/src/server/cdp/AXNode.zig +++ b/src/server/cdp/AXNode.zig @@ -22,6 +22,7 @@ const lp = @import("lightpanda"); const Frame = @import("../../browser/Frame.zig"); const DOMNode = @import("../../browser/webapi/Node.zig"); const Label = @import("../../browser/webapi/element/html/Label.zig"); +const TreeWalker = @import("../../browser/webapi/TreeWalker.zig"); const interactive = @import("../../browser/interactive.zig"); const NodeRegistry = @import("../../NodeRegistry.zig"); @@ -1058,7 +1059,7 @@ fn writeName( if (use_name_for_content) { var buf: std.Io.Writer.Allocating = .init(scratchAllocator(temp_arena, frame)); - try writeAccessibleNameFallback(node, &buf.writer, frame); + try writeAccessibleNameFallback(node, &buf.writer); if (buf.written().len > 0) { try writeString(buf.written(), w); return .contents; @@ -1085,9 +1086,22 @@ fn writeName( }; } -fn writeAccessibleNameFallback(node: *DOMNode, writer: *std.Io.Writer, frame: *Frame) !void { - var it = node.childrenIterator(); - while (it.next()) |child| { +fn writeAccessibleNameFallback(node: *DOMNode, writer: *std.Io.Writer) !void { + var tw = TreeWalker.FullExcludeSelf.init(node, .{}); + while (tw.next()) |child| { + const parent = child._parent.?; + const in_svg = if (parent.is(DOMNode.Element)) |p| p.getTag() == .svg else false; + if (in_svg and parent != node) { + // Inside an SVG, only a names it + const is_title = if (child.is(DOMNode.Element)) |el| std.mem.eql(u8, el.getTagNameLower(), "title") else false; + if (is_title) { + try writer.writeByte(' '); + } else { + tw.skipChildren(); + } + continue; + } + switch (child._type) { .cdata => { const cd = child.subtype(DOMNode.CData); @@ -1101,26 +1115,15 @@ fn writeAccessibleNameFallback(node: *DOMNode, writer: *std.Io.Writer, frame: *F }, .element => { const el = child.subtype(DOMNode.Element); - if (el.getTag() == .img) { + const tag = el.getTag(); + if (tag == .img) { if (el.getAttributeSafe(.wrap("alt"))) |alt| { try writer.writeAll(alt); try writer.writeByte(' '); } - } else if (el.getTag() == .svg) { - // Try to find a <title> inside SVG - var sit = child.childrenIterator(); - while (sit.next()) |s_child| { - if (s_child.is(DOMNode.Element)) |s_el| { - if (std.mem.eql(u8, s_el.getTagNameLower(), "title")) { - try writeAccessibleNameFallback(s_child, writer, frame); - try writer.writeByte(' '); - } - } - } - } else { - if (!el.getTag().isMetadata()) { - try writeAccessibleNameFallback(child, writer, frame); - } + tw.skipChildren(); + } else if (tag != .svg and tag.isMetadata()) { + tw.skipChildren(); } }, else => {}, From eba58d7d576534e506ab538f6d1f65a36d0a290b Mon Sep 17 00:00:00 2001 From: Karl Seguin <k@openmymind.io> Date: Thu, 24 Sep 2026 09:38:34 +0800 Subject: [PATCH 35/47] webapi: Sanitizer API usage Builds ontop of https://github.com/lightpanda-io/browser/pull/3604 to actually use a Sanitizer across 6 apis (some of which we didn't have at all, and some of which were incomplete). Namely setHtml and setHTMLUnsafe for Element, ShadowRoot and Document. --- src/browser/frame/parse.zig | 41 +++ src/browser/markdown.zig | 2 +- src/browser/screenshot.zig | 2 +- src/browser/tests/sanitizer.html | 233 ++++++++++++++ src/browser/webapi/DOMParser.zig | 38 +-- src/browser/webapi/Document.zig | 11 + src/browser/webapi/DocumentFragment.zig | 6 - src/browser/webapi/Element.zig | 18 +- src/browser/webapi/Node.zig | 22 ++ src/browser/webapi/Sanitizer.zig | 397 +++++++++++++++++++++++- src/browser/webapi/ShadowRoot.zig | 10 +- 11 files changed, 724 insertions(+), 56 deletions(-) diff --git a/src/browser/frame/parse.zig b/src/browser/frame/parse.zig index 946fb0978..b697db90e 100644 --- a/src/browser/frame/parse.zig +++ b/src/browser/frame/parse.zig @@ -16,12 +16,15 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. +const std = @import("std"); + const Frame = @import("../Frame.zig"); const Parser = @import("../parser/Parser.zig"); const Node = @import("../webapi/Node.zig"); const Element = @import("../webapi/Element.zig"); const Document = @import("../webapi/Document.zig"); +const HTMLDocument = @import("../webapi/HTMLDocument.zig"); const ShadowRoot = @import("../webapi/ShadowRoot.zig"); const slotting = @import("../webapi/element/slotting.zig"); @@ -101,6 +104,44 @@ pub fn fragment(frame: *Frame, node: *Node, html: []const u8, opts: FragmentPars try Element.Html.Picture.childrenInserted(node, frame); } +pub const HtmlDocumentOpts = struct { + allow_declarative_shadow: bool = false, +}; + +// Build a detached HTMLDocument from `html` (DOMParser.parseFromString and +// Document.parseHTML). The caller sets its URL. +pub fn htmlDocument(frame: *Frame, html: []const u8, opts: HtmlDocumentOpts) !*HTMLDocument { + const arena = try frame.getArena(.medium, "parse.htmlDocument"); + defer arena.release(); + + // Frame-side hooks triggered from `Build.created` / `nodeIsReady` + // (external stylesheet fetches, script execution, mutation-observer + // fan-out, default-script injection) treat the parsed nodes as detached + // and skip side effects on the live document. + const previous_parse_mode = frame._parse_mode; + frame._parse_mode = .fragment; + defer frame._parse_mode = previous_parse_mode; + + const doc = try frame._factory.document(HTMLDocument{ ._proto = undefined }); + + var normalized = std.mem.trim(u8, html, &std.ascii.whitespace); + if (normalized.len == 0) { + normalized = "<html></html>"; + } + + var parser = Parser.init(arena.allocator(), doc.asNode(), frame, .{ + .allow_declarative_shadow = opts.allow_declarative_shadow, + }); + parser.parse(normalized); + if (parser.terminated) { + return error.ExecutionTerminated; + } + if (parser.err) |pe| { + return pe.err; + } + return doc; +} + // Build a detached XMLDocument from `xml` (DOMParser.parseFromString and // XMLHttpRequest.responseXML). Returns null when the input isn't well-formed // XML. diff --git a/src/browser/markdown.zig b/src/browser/markdown.zig index d777fa760..c7c137f2d 100644 --- a/src/browser/markdown.zig +++ b/src/browser/markdown.zig @@ -952,7 +952,7 @@ test "browser.markdown: declarative shadow DOM renders through piercing" { const host = try doc.createElement("div", null, frame); try host.setHTMLUnsafe( \\<div><template shadowrootmode="open"><p>shadow content</p></template></div> - , frame); + , null, frame); var aw: std.Io.Writer.Allocating = .init(testing.allocator); defer aw.deinit(); diff --git a/src/browser/screenshot.zig b/src/browser/screenshot.zig index 8237b0577..00d88b337 100644 --- a/src/browser/screenshot.zig +++ b/src/browser/screenshot.zig @@ -1468,7 +1468,7 @@ test "browser.screenshot: shadow dom and slots" { const div = try doc.createElement("div", null, frame); try div.setHTMLUnsafe( \\<x-host><template shadowrootmode="open"><p>shadow <slot></slot></p></template>light</x-host> - , frame); + , null, frame); var builder: Builder = .{ .arena = testing.arena_allocator, .frame = frame, .tree = .{ .frame = frame, .state = .{ .root = div.asNode() } } }; try builder.render(div.asNode()); diff --git a/src/browser/tests/sanitizer.html b/src/browser/tests/sanitizer.html index 0f85b0c61..e11a37d17 100644 --- a/src/browser/tests/sanitizer.html +++ b/src/browser/tests/sanitizer.html @@ -368,3 +368,236 @@ testing.expectEqual(false, config.javascriptURLs); } </script> + +<script id=setHTML> +{ + const div = document.createElement('div'); + div.setHTML('<p id=a onclick="x()" title=t data-x=1>hi<script>boom()<\/script><!-- c --></p><iframe></iframe>'); + testing.expectEqual('<p title="t">hi</p>', div.innerHTML); + + // an explicit "default" is the same thing + div.setHTML('<b onclick="x()">b</b>', {sanitizer: 'default'}); + testing.expectEqual('<b>b</b>', div.innerHTML); + + testing.expectError('TypeError', () => div.setHTML('x', {sanitizer: 'nope'})); + testing.expectError('TypeError', () => div.setHTML('x', {sanitizer: {elements: [], removeElements: []}})); + + div.setHTML(''); + testing.expectEqual('', div.innerHTML); +} +</script> + +<script id=setHTMLConfig> +{ + const div = document.createElement('div'); + + // A dictionary on a safe method defaults to not keeping comments or data-*. + div.setHTML('<p data-x=1 id=i>a<!--c--></p>', {sanitizer: {attributes: ['id']}}); + testing.expectEqual('<p id="i">a</p>', div.innerHTML); + + // ... but unsafe methods, like the constructor, default to keeping them. + div.setHTMLUnsafe('<p data-x=1 id=i>a<!--c--></p>', {sanitizer: {attributes: ['id']}}); + testing.expectEqual('<p data-x="1" id="i">a<!--c--></p>', div.innerHTML); + + div.setHTML('<div><p>a<b>b</b></p><i>i</i></div>', {sanitizer: {elements: ['div', 'p']}}); + testing.expectEqual('<div><p>a</p></div>', div.innerHTML); + + div.setHTML('<div><p>a<b>b<i>i</i></b>c</p></div>', {sanitizer: {replaceWithChildrenElements: ['b', 'p']}}); + testing.expectEqual('<div>ab<i>i</i>c</div>', div.innerHTML); + + div.setHTML('<div><span>s</span><em>e</em></div>', {sanitizer: {removeElements: ['span']}}); + testing.expectEqual('<div><em>e</em></div>', div.innerHTML); + + // per-element attribute lists + div.setHTML('<p id=1 title=2>a</p><em id=3 title=4>b</em>', {sanitizer: { + elements: [{name: 'p', attributes: ['id']}, {name: 'em', removeAttributes: ['title']}], + attributes: ['title'], + }}); + testing.expectEqual('<p id="1" title="2">a</p><em>b</em>', div.innerHTML); + + // an element's removeAttributes must be a subset of the global attributes + testing.expectError('TypeError', () => div.setHTML('x', {sanitizer: { + elements: [{name: 'em', removeAttributes: ['id']}], + attributes: ['title'], + }})); + + // A safe method still removes unsafe markup the config allows. + div.setHTML('<script>x()<\/script><b onclick=x()>b</b>', {sanitizer: {elements: ['script', 'b'], attributes: ['onclick']}}); + testing.expectEqual('<b>b</b>', div.innerHTML); +} +</script> + +<script id=setHTMLUnsafe> +{ + const div = document.createElement('div'); + div.setHTMLUnsafe('<b onclick="x()">b</b><script>x()<\/script><!--c-->'); + testing.expectEqual('<b onclick="x()">b</b><script>x()<\/script><!--c-->', div.innerHTML); + + // The sanitizer's own configuration is used as-is. + const sanitizer = new Sanitizer({removeElements: ['i']}); + const before = sanitizer.get(); + div.setHTMLUnsafe('<b onclick="x()">b</b><i>i</i>', {sanitizer}); + testing.expectEqual('<b onclick="x()">b</b>', div.innerHTML); + + // A safe method must not remove unsafe from the caller's Sanitizer. + div.setHTML('<b onclick="x()">b</b><i>i</i>', {sanitizer}); + testing.expectEqual('<b>b</b>', div.innerHTML); + testing.expectEqual(before, sanitizer.get()); + + // The default configuration on an unsafe method is still the default one + div.setHTMLUnsafe('<b onclick="x()">b</b><script><\/script>', {sanitizer: 'default'}); + testing.expectEqual('<b>b</b>', div.innerHTML); +} +</script> + +<script id=textMerge> +{ + // Text left adjacent by a removal is merged, as it would be had the node + // never been parsed. + const div = document.createElement('div'); + div.setHTML('a <!-- c --> b'); + testing.expectEqual(1, div.childNodes.length); + testing.expectEqual('a b', div.firstChild.data); + + div.setHTML('<p>x<script>s<\/script>y<!--c-->z<b>b</b></p>'); + testing.expectEqual(2, div.firstChild.childNodes.length); + testing.expectEqual('xyz', div.firstChild.firstChild.data); + + // replaced elements merge at both edges + div.setHTML('<p>x<span>y<i>i</i>z</span>w</p>', {sanitizer: {replaceWithChildrenElements: ['span']}}); + const p = div.firstChild; + testing.expectEqual(3, p.childNodes.length); + testing.expectEqual('xy', p.childNodes[0].data); + testing.expectEqual('zw', p.childNodes[2].data); + + div.setHTML('<p>x<b><i>y</i></b>z</p>', {sanitizer: {replaceWithChildrenElements: ['b', 'i']}}); + testing.expectEqual(1, div.firstChild.childNodes.length); + testing.expectEqual('xyz', div.firstChild.firstChild.data); + + // nothing removed: nothing touched + div.setHTMLUnsafe('<p>x<!--c-->y</p>'); + testing.expectEqual(3, div.firstChild.childNodes.length); + + // in the other trees too + const doc = Document.parseHTML('a<!--c-->b<template>c<!--c-->d</template>', {sanitizer: {elements: ['html', 'head', 'body', 'template']}}); + testing.expectEqual(2, doc.body.childNodes.length); + testing.expectEqual('ab', doc.body.firstChild.data); + testing.expectEqual(1, doc.body.lastChild.content.childNodes.length); + testing.expectEqual('cd', doc.body.lastChild.content.firstChild.data); +} +</script> + +<script id=scriptContext> +{ + const script = document.createElement('script'); + script.textContent = 'untouched'; + script.setHTML('<b>b</b>'); + testing.expectEqual('untouched', script.textContent); + + script.setHTMLUnsafe('<b>b</b>'); + testing.expectEqual('<b>b</b>', script.innerHTML); +} +</script> + +<script id=javascriptURLs> +{ + const div = document.createElement('div'); + + // safe: always removed, whatever the config says + div.setHTML('<a href="javascript:x()">a</a><a href="https://x/">b</a>', {sanitizer: {javascriptURLs: true}}); + testing.expectEqual('<a>a</a><a href="https://x/">b</a>', div.innerHTML); + + // unsafe: removed only when the config says so + div.setHTMLUnsafe('<a href="javascript:x()">a</a>', {sanitizer: {}}); + testing.expectEqual('<a href="javascript:x()">a</a>', div.innerHTML); + + const off = {sanitizer: {javascriptURLs: false}}; + for (const url of ['javascript:x()', ' JaVaScRiPt:x()', '\x01java\nscript:x()', 'java\tscript:x()']) { + const a = document.createElement('a'); + a.setAttribute('href', url); + div.setHTMLUnsafe(a.outerHTML, off); + testing.expectEqual(null, div.firstChild.getAttribute('href'), {script_id: 'javascriptURLs'}); + } + div.setHTMLUnsafe('<a href="javascriptx:x()">a</a><a href="xjavascript:x()">b</a><p href="javascript:x()"></p>', off); + testing.expectEqual('<a href="javascriptx:x()">a</a><a href="xjavascript:x()">b</a><p href="javascript:x()"></p>', div.innerHTML); + + div.setHTMLUnsafe('<area href="javascript:x()"><form action="javascript:x()"><button formaction="javascript:x()"></button></form>', off); + testing.expectEqual('<area><form><button></button></form>', div.innerHTML); + + div.setHTMLUnsafe('<svg><a href="javascript:x()"></a><a xlink:href="javascript:x()"></a></svg>', off); + testing.expectEqual('<svg><a></a><a></a></svg>', div.innerHTML); + + div.setHTMLUnsafe('<math><mi href="javascript:x()"></mi></math>', off); + testing.expectEqual('<math><mi></mi></math>', div.innerHTML); + + div.setHTMLUnsafe('<svg><animate attributeName="href"></animate><set attributeName="xlink:href"></set><animate attributeName="x"></animate></svg>', off); + testing.expectEqual('<svg><animate></animate><set></set><animate attributeName="x"></animate></svg>', div.innerHTML); +} +</script> + +<script id=nestedTrees> +{ + const div = document.createElement('div'); + div.setHTML('<template><b onclick=x()>b</b><script><\/script></template>', {sanitizer: {elements: ['template', 'b', 'script']}}); + testing.expectEqual('<b>b</b>', div.firstChild.innerHTML); + + const host = document.createElement('div'); + host.setHTMLUnsafe('<div><template shadowrootmode=open><i onclick=x()>i</i><script><\/script></template></div>', {sanitizer: {removeElements: ['script'], removeAttributes: ['onclick']}}); + testing.expectEqual('<i>i</i>', host.firstChild.shadowRoot.innerHTML); + + // setHTML on a template sets its contents + const template = document.createElement('template'); + template.setHTML('<b onclick=x()>b</b>'); + testing.expectEqual(0, template.childNodes.length); + testing.expectEqual('<b>b</b>', template.content.firstChild.outerHTML); +} +</script> + +<script id=shadowRoot> +{ + const host = document.createElement('div'); + const root = host.attachShadow({mode: 'open'}); + root.setHTML('<b onclick=x()>b</b><script><\/script>'); + testing.expectEqual('<b>b</b>', root.innerHTML); + + root.setHTMLUnsafe('<b onclick=x()>b</b>'); + testing.expectEqual('<b onclick="x()">b</b>', root.innerHTML); + + root.setHTMLUnsafe('<b onclick=x()>b</b>', {sanitizer: {}}); + testing.expectEqual('<b onclick="x()">b</b>', root.innerHTML); +} +</script> + +<script id=mutationRecord> +{ + const div = document.createElement('div'); + div.innerHTML = '<p>old</p>'; + const observer = new MutationObserver(() => {}); + observer.observe(div, {childList: true}); + div.setHTML('<b>a</b><i>b</i><script><\/script>'); + const records = observer.takeRecords(); + testing.expectEqual(1, records.length); + testing.expectEqual(1, records[0].removedNodes.length); + testing.expectEqual(2, records[0].addedNodes.length); +} +</script> + +<script id=parseHTML> +{ + const doc = Document.parseHTML('<title>t

a diff --git a/src/browser/webapi/DOMParser.zig b/src/browser/webapi/DOMParser.zig index f3f02fa0a..337118aa5 100644 --- a/src/browser/webapi/DOMParser.zig +++ b/src/browser/webapi/DOMParser.zig @@ -21,11 +21,9 @@ const std = @import("std"); const js = @import("../js/js.zig"); const Frame = @import("../Frame.zig"); -const Parser = @import("../parser/Parser.zig"); const Node = @import("Node.zig"); const Document = @import("Document.zig"); -const HTMLDocument = @import("HTMLDocument.zig"); const DOMParser = @This(); @@ -45,42 +43,8 @@ pub fn parseFromString( switch (target_mime) { .@"text/html" => { - const arena = try frame.getArena(.medium, "DOMParser.parseFromString"); - defer arena.release(); - - // DOMParser builds a detached Document. Borrow the same fragment - // parse-mode that `Frame.parse` uses so frame-side hooks - // triggered from `Build.created` / `nodeIsReady` (external - // stylesheet fetches, script execution, mutation-observer fan-out, - // default-script injection) treat the parsed nodes as detached and - // skip side effects on the live document. The frame's - // `_parse_mode` is restored on exit. - const previous_parse_mode = frame._parse_mode; - frame._parse_mode = .fragment; - defer frame._parse_mode = previous_parse_mode; - - // Create a new HTMLDocument - const doc = try frame._factory.document(HTMLDocument{ - ._proto = undefined, - }); + const doc = try Frame.parse.htmlDocument(frame, html, .{}); doc.asDocument()._url = frame.url; - - var normalized = std.mem.trim(u8, html, &std.ascii.whitespace); - if (normalized.len == 0) { - normalized = ""; - } - - // Parse HTML into the document - var parser = Parser.init(arena.allocator(), doc.asNode(), frame, .{}); - parser.parse(normalized); - if (parser.terminated) { - return error.ExecutionTerminated; - } - - if (parser.err) |pe| { - return pe.err; - } - return doc.asDocument(); }, else => { diff --git a/src/browser/webapi/Document.zig b/src/browser/webapi/Document.zig index 226add2d6..9d0f9c6e7 100644 --- a/src/browser/webapi/Document.zig +++ b/src/browser/webapi/Document.zig @@ -40,6 +40,7 @@ const DOMImplementation = @import("DOMImplementation.zig"); const StyleSheetList = @import("css/StyleSheetList.zig"); const FontFaceSet = @import("css/FontFaceSet.zig"); const Selection = @import("Selection.zig"); +const Sanitizer = @import("Sanitizer.zig"); const XPathResult = @import("XPathResult.zig"); const XPathExpression = @import("XPathExpression.zig"); @@ -1543,6 +1544,16 @@ pub const JsApi = struct { return frame._factory.genericDocument(.{ .url = "about:blank", .charset = "UTF-8" }); } + pub const parseHTML = bridge.function(_parseHTML, .{ .static = true }); + fn _parseHTML(html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !*Document { + return Sanitizer.parseHTML(html, options, true, frame); + } + + pub const parseHTMLUnsafe = bridge.function(_parseHTMLUnsafe, .{ .static = true }); + fn _parseHTMLUnsafe(html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !*Document { + return Sanitizer.parseHTML(html, options, false, frame); + } + pub const onselectionchange = bridge.accessor(Document.getOnSelectionChange, Document.setOnSelectionChange, .{}); pub const onclick = bridge.accessor(Document.getOnClick, Document.setOnClick, .{}); pub const ontouchstart = bridge.accessor(handlerAccessor(.ontouchstart).get, handlerAccessor(.ontouchstart).set, .{}); diff --git a/src/browser/webapi/DocumentFragment.zig b/src/browser/webapi/DocumentFragment.zig index aef884fcc..0457361f0 100644 --- a/src/browser/webapi/DocumentFragment.zig +++ b/src/browser/webapi/DocumentFragment.zig @@ -165,12 +165,6 @@ pub fn setInnerHTML(self: *DocumentFragment, html: []const u8, frame: *Frame) !v return parent.setHTML(html, .{}, frame); } -/// allows declarative shadow dom -pub fn setHTMLUnsafe(self: *DocumentFragment, html: []const u8, frame: *Frame) !void { - const parent = self.asNode(); - return parent.setHTML(html, .{ .allow_declarative_shadow = true }, frame); -} - pub fn cloneFragment(self: *DocumentFragment, deep: bool, document: *const Node.Document, frame: *Frame) !*Node { const fragment = try DocumentFragment.init(document, frame); const fragment_node = fragment.asNode(); diff --git a/src/browser/webapi/Element.zig b/src/browser/webapi/Element.zig index 4283c67ba..89ba05b9b 100644 --- a/src/browser/webapi/Element.zig +++ b/src/browser/webapi/Element.zig @@ -29,6 +29,7 @@ const Node = @import("Node.zig"); const ShadowRoot = @import("ShadowRoot.zig"); const EventTarget = @import("EventTarget.zig"); const collections = @import("collections.zig"); +const Sanitizer = @import("Sanitizer.zig"); const Selector = @import("selector/Selector.zig"); const Animation = @import("animation/Animation.zig"); @@ -627,10 +628,20 @@ pub fn setInnerHTML(self: *Element, html: []const u8, frame: *Frame) !void { return parent.setHTML(html, .{}, frame); } +pub fn setHTML(self: *Element, html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !void { + return Sanitizer.setAndFilterHTML(self.htmlTarget(), self, html, options, true, frame); +} + /// allows declarative shadow dom -pub fn setHTMLUnsafe(self: *Element, html: []const u8, frame: *Frame) !void { - const parent = self.asNode(); - return parent.setHTML(html, .{ .allow_declarative_shadow = true }, frame); +pub fn setHTMLUnsafe(self: *Element, html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !void { + return Sanitizer.setAndFilterHTML(self.htmlTarget(), self, html, options, false, frame); +} + +fn htmlTarget(self: *Element) *Node { + if (self.is(Html.Template)) |template| { + return template.getContent().asNode(); + } + return self.asNode(); } pub fn getId(self: *const Element) ?[]const u8 { @@ -2662,6 +2673,7 @@ pub const JsApi = struct { pub const assignedSlot = bridge.accessor(Element.getAssignedSlot, null, .{}); pub const attachShadow = bridge.function(_attachShadow, .{}); pub const insertAdjacentHTML = bridge.function(Element.insertAdjacentHTML, .{ .ce_reactions = true }); + pub const setHTML = bridge.function(Element.setHTML, .{ .ce_reactions = true }); pub const setHTMLUnsafe = bridge.function(Element.setHTMLUnsafe, .{ .ce_reactions = true }); pub const insertAdjacentElement = bridge.function(Element.insertAdjacentElement, .{ .ce_reactions = true }); pub const insertAdjacentText = bridge.function(Element.insertAdjacentText, .{ .ce_reactions = true }); diff --git a/src/browser/webapi/Node.zig b/src/browser/webapi/Node.zig index 364178b6d..4e885bbf9 100644 --- a/src/browser/webapi/Node.zig +++ b/src/browser/webapi/Node.zig @@ -1613,6 +1613,28 @@ pub fn setHTML(self: *Node, html: []const u8, opts: Frame.parse.FragmentParseOpt } } +pub fn replaceAllWithFragment(self: *Node, fragment: *Node, frame: *Frame) !void { + frame.domChanged(); + + const notify = Frame.observers.hasMutationObservers(frame); + var added: std.ArrayList(*Node) = .empty; + if (notify) { + var it = fragment.childrenIterator(); + while (it.next()) |child| { + try added.append(frame.call_arena, child); + } + } + + const removed = try self.removeAllChildrenCollecting(notify, frame); + try frame.moveAllChildren(fragment, self, null, .silent_parent); + + if (notify and (removed.items.len > 0 or added.items.len > 0)) { + // The point here is to batch all of the adds/remove and get a combined + // mutation record + Frame.observers.notifyChildListChange(frame, self, added.items, removed.items, null, null); + } +} + // Writes a JSON representation of the node and its children pub fn jsonStringify(self: *const Node, writer: *std.json.Stringify) !void { // stupid json api requires this to be const, diff --git a/src/browser/webapi/Sanitizer.zig b/src/browser/webapi/Sanitizer.zig index 3650356af..6cf57a724 100644 --- a/src/browser/webapi/Sanitizer.zig +++ b/src/browser/webapi/Sanitizer.zig @@ -30,7 +30,11 @@ const lp = @import("lightpanda"); const js = @import("../js/js.zig"); const Page = @import("../Page.zig"); +const Frame = @import("../Frame.zig"); +const Node = @import("Node.zig"); +const Element = @import("Element.zig"); +const TreeWalker = @import("TreeWalker.zig"); const defaults = @import("sanitizer_defaults.zig"); const String = lp.String; @@ -221,6 +225,10 @@ const Config = struct { // ?js.Value because not provided, undefined and null are all handled differently pub fn init(configuration_: ?js.Value, exec: *const Execution) !*Sanitizer { + return create(configuration_, true, exec); +} + +fn create(configuration_: ?js.Value, permissive_defaults: bool, exec: *const Execution) !*Sanitizer { const arena = try exec.getPinnedArena(.small, "Sanitizer"); errdefer arena.release(); @@ -247,7 +255,7 @@ pub fn init(configuration_: ?js.Value, exec: *const Execution) !*Sanitizer { } const config: Config = if (configuration.isNull()) .{} else try configuration.toZig(Config); - if (try self.setFromConfig(config) == false) { + if (try self.setFromConfig(config, permissive_defaults) == false) { return exec.js.typeError("invalid Sanitizer configuration"); } } @@ -301,7 +309,7 @@ fn setFromDefault(self: *Sanitizer) !void { self._javascript_urls = false; } -fn setFromConfig(self: *Sanitizer, config: Config) !bool { +fn setFromConfig(self: *Sanitizer, config: Config, permissive_defaults: bool) !bool { var all_new = true; const arena = self._arena; @@ -348,11 +356,11 @@ fn setFromConfig(self: *Sanitizer, config: Config) !bool { self._remove_processing_instructions = try self.targetSet(pis, &all_new); } - self._comments = Config.boolean(config.comments, true); + self._comments = Config.boolean(config.comments, permissive_defaults); if (self._allow_attributes != null or config.dataAttributes != null) { - self._data_attributes = Config.boolean(config.dataAttributes, true); + self._data_attributes = Config.boolean(config.dataAttributes, permissive_defaults); } - self._javascript_urls = Config.boolean(config.javascriptURLs, true); + self._javascript_urls = Config.boolean(config.javascriptURLs, permissive_defaults); if (config.elements == null and config.removeElements == null) { self._remove_elements = .empty; @@ -361,7 +369,11 @@ fn setFromConfig(self: *Sanitizer, config: Config) !bool { self._remove_attributes = .empty; } if (self._allow_processing_instructions == null and self._remove_processing_instructions == null) { - self._remove_processing_instructions = .empty; + if (permissive_defaults) { + self._remove_processing_instructions = .empty; + } else { + self._allow_processing_instructions = .empty; + } } return all_new and self.isValid(); @@ -992,6 +1004,379 @@ fn hasDataAttribute(set: NameSet) bool { return false; } +// Like init: we need to tell the difference between not-set, null and undefined +// AND, this can actually be a Sanitizer config already. +pub const Options = struct { + sanitizer: ?js.Value = null, +}; + +const FromOptions = struct { + owned: bool, + sanitizer: *Sanitizer, + + fn release(self: FromOptions, page: *Page) void { + if (self.owned) { + // We have to free a Sanitizer we created, versus a Sanitizer that + // was passed to use from JS. + self.sanitizer.deinit(page); + } + } +}; + +fn fromOptions(options: ?Options, safe: bool, exec: *const Execution) !?FromOptions { + const spec = blk: { + const o = options orelse break :blk null; + const spec = o.sanitizer orelse break :blk null; + if (spec.isUndefined()) { + break :blk null; + } + if (spec.toZig(*Sanitizer)) |sanitizer| { + return .{ .sanitizer = sanitizer, .owned = false }; + } else |_| {} + break :blk spec; + }; + + if (spec == null and safe == false) { + return null; + } + // A missing spec takes the "default" preset + return .{ .sanitizer = try create(spec, safe == false, exec), .owned = true }; +} + +pub fn setAndFilterHTML(target: *Node, context: *Element, html: []const u8, options: ?Options, safe: bool, frame: *Frame) !void { + if (safe and std.mem.eql(u8, context.getLocalName(), "script")) { + if (context._namespace == .html or context._namespace == .svg) { + // hahaha, nice try! + return; + } + } + + const resolved = try fromOptions(options, safe, &frame.js.execution); + defer if (resolved) |r| r.release(frame.page); + + // Parsed into a detached fragment, so that nothing is connected (no fetch, + // no custom element reaction) until it's been sanitized. + const fragment = (try Node.DocumentFragment.init(target.getDocument(frame), frame)).asNode(); + if (html.len > 0) { + try Frame.parse.fragment(frame, fragment, html, .{ .context = context, .allow_declarative_shadow = true }); + } + if (resolved) |r| { + try r.sanitizer.sanitize(fragment, safe, frame); + } + try target.replaceAllWithFragment(fragment, frame); +} + +pub fn parseHTML(html: []const u8, options: ?Options, safe: bool, frame: *Frame) !*Node.Document { + const resolved = try fromOptions(options, safe, &frame.js.execution); + defer if (resolved) |r| r.release(frame.page); + + const document = (try Frame.parse.htmlDocument(frame, html, .{ .allow_declarative_shadow = true })).asDocument(); + document._url = "about:blank"; + if (resolved) |r| { + try r.sanitizer.sanitize(document.asNode(), safe, frame); + } + return document; +} + +fn sanitize(self: *const Sanitizer, root: *Node, safe: bool, frame: *Frame) !void { + const arena = frame.call_arena; + + // A template's contents and a shadow root are trees of their own + var trees: std.ArrayList(*Node) = .empty; + try trees.append(arena, root); + + var remove_attributes: std.ArrayList([]const u8) = .empty; + + // Parents that lost a child, whose text nodes might now be adjacent. + var touched: std.ArrayList(*Node) = .empty; + + while (trees.pop()) |tree| { + var tw = TreeWalker.FullExcludeSelf.init(tree, .{}); + while (tw.next()) |node| { + const parent = node._parent.?; + const element = node.is(Element) orelse { + if (self.keepNonElement(node) == false) { + tw.skipChildren(); + frame.removeNode(parent, node, .{ .reconnect_to = null }); + try touch(&touched, parent, arena); + } + continue; + }; + + const element_name: Name = .{ .name = .wrap(element.getLocalName()), .namespace = elementNamespace(element, frame) }; + switch (self.elementAction(element_name, safe)) { + .keep => {}, + .remove => { + tw.skipChildren(); + frame.removeNode(parent, node, .{ .reconnect_to = null }); + try touch(&touched, parent, arena); + continue; + }, + .replace => { + // Move the children up; the walker's next node is the + // first of them (or, if there are none, what follows). + // run_ready = false: nothing gets to act on them until + // they've been sanitized. + if (node.firstChild() != null) { + const previous_root = node.getRootNode(.{}); + while (node.firstChild()) |child| { + frame.removeNode(node, child, .{ .reconnect_to = parent }); + try frame.insertNodeRelative(parent, child, .{ .before = node }, .{ .previous_root = previous_root, .run_ready = false }); + } + } + frame.removeNode(parent, node, .{ .reconnect_to = null }); + try touch(&touched, parent, arena); + continue; + }, + } + + if (element.is(Element.Html.Template)) |template| { + try trees.append(arena, template.getContent().asNode()); + } + if (element.hostedShadowRoot(frame)) |shadow_root| { + try trees.append(arena, shadow_root.asNode()); + } + + // Collected first: removing one can run script (attributeChangedCallback) + remove_attributes.clearRetainingCapacity(); + for (element.attributeEntries()) |*entry| { + if (self.keepAttribute(element_name, entry.name(), entry.value(), safe) == false) { + try remove_attributes.append(arena, entry.name()); + } + } + for (remove_attributes.items) |name| { + element.removeAttributeSafe(.wrap(name), frame); + } + } + } + + var buffer: std.ArrayList(u8) = .empty; + for (touched.items) |parent| { + try mergeAdjacentText(parent, &buffer, frame); + } +} + +fn touch(touched: *std.ArrayList(*Node), parent: *Node, arena: Allocator) !void { + // Siblings are removed one after another, so this catches most repeats. + // Those it misses just get a second, no-op, merge. + if (touched.getLastOrNull() != parent) { + try touched.append(arena, parent); + } +} + +// if we removed a node between two text nodes, we need to merge the text ndoes + +fn mergeAdjacentText(parent: *Node, buffer: *std.ArrayList(u8), frame: *Frame) !void { + var child = parent.firstChild(); + while (child) |node| { + var next = node.nextSibling(); + const text = node.is(Node.CData.Text) orelse { + child = next; + continue; + }; + if (next == null or next.?.is(Node.CData.Text) == null) { + child = next; + continue; + } + + buffer.clearRetainingCapacity(); + try buffer.appendSlice(frame.call_arena, text.ownData()); + while (next) |sibling| { + const sibling_text = sibling.is(Node.CData.Text) orelse break; + try buffer.appendSlice(frame.call_arena, sibling_text.ownData()); + next = sibling.nextSibling(); + frame.removeNode(parent, sibling, .{ .reconnect_to = null }); + } + text.asCData()._data = try frame.dupeSSO(buffer.items); + child = next; + } +} + +fn keepNonElement(self: *const Sanitizer, node: *Node) bool { + const cdata = node.is(Node.CData) orelse return true; // doctype + return switch (cdata._type) { + .text, .cdata_section => true, + .comment => self._comments == true, + .processing_instruction => { + const target = cdata.subtype(Node.CData.ProcessingInstruction)._target; + if (self._allow_processing_instructions) |allowed| { + return allowed.contains(target); + } + return self._remove_processing_instructions.?.contains(target) == false; + }, + }; +} + +fn elementAction(self: *const Sanitizer, name: Name, safe: bool) enum { keep, remove, replace } { + if (safe) { + for (defaults.baseline_remove_elements) |unsafe| { + if (staticName(unsafe).eql(name)) { + return .remove; + } + } + } + if (self._replace_elements) |replace| { + if (replace.contains(name)) { + return .replace; + } + } + if (self._allow_elements) |allowed| { + return if (allowed.contains(name)) .keep else .remove; + } + return if (self._remove_elements.?.contains(name)) .remove else .keep; +} + +fn keepAttribute(self: *const Sanitizer, element: Name, qualified_name: []const u8, value: []const u8, safe: bool) bool { + const name = attributeName(element.namespace, qualified_name); + + const element_allowed = self._element_allow_attributes.getPtr(element); + if (self._element_remove_attributes.getPtr(element)) |removed| { + if (removed.contains(name)) { + return false; + } + } + + if (self._allow_attributes) |allowed| { + if (allowed.contains(name) == false and + (element_allowed == null or element_allowed.?.contains(name) == false) and + (self._data_attributes != true or name.isDataAttribute() == false)) + { + return false; + } + } else { + if (element_allowed) |set| { + if (set.contains(name) == false) { + return false; + } + } else if (self._remove_attributes.?.contains(name)) { + return false; + } + } + + if (safe and name.namespace == .none and isEventHandler(qualified_name)) { + return false; + } + + if (safe or self._javascript_urls != true) { + if (isNavigatingURLAttribute(element, name) and isJavascriptURL(value)) { + return false; + } + if (isAnimatingURLAttribute(element, name) and (std.mem.eql(u8, value, "href") or std.mem.eql(u8, value, "xlink:href"))) { + return false; + } + } + return true; +} + +fn elementNamespace(element: *Element, frame: *Frame) Namespace { + return switch (element._namespace) { + .html => .xhtml, + .svg => .svg, + .mathml => .mathml, + .xml => .xml, + .null => .none, + .unknown => .intern(element.getNamespaceUri(frame)), + }; +} + +// Attributes' namespaces aren't tracked, but the HTML parser only ever gives a +// namespace to these attributes of foreign (SVG/MathML) elements. +// https://html.spec.whatwg.org/#adjust-foreign-attributes +const foreign_attributes = std.StaticStringMap(defaults.Name).initComptime(.{ + .{ "xlink:actuate", defaults.Name{ .name = "actuate", .namespace = .xlink } }, + .{ "xlink:arcrole", defaults.Name{ .name = "arcrole", .namespace = .xlink } }, + .{ "xlink:href", defaults.Name{ .name = "href", .namespace = .xlink } }, + .{ "xlink:role", defaults.Name{ .name = "role", .namespace = .xlink } }, + .{ "xlink:show", defaults.Name{ .name = "show", .namespace = .xlink } }, + .{ "xlink:title", defaults.Name{ .name = "title", .namespace = .xlink } }, + .{ "xlink:type", defaults.Name{ .name = "type", .namespace = .xlink } }, + .{ "xml:lang", defaults.Name{ .name = "lang", .namespace = .xml } }, + .{ "xml:space", defaults.Name{ .name = "space", .namespace = .xml } }, + .{ "xmlns", defaults.Name{ .name = "xmlns", .namespace = .xmlns } }, + .{ "xmlns:xlink", defaults.Name{ .name = "xlink", .namespace = .xmlns } }, +}); + +fn attributeName(element_namespace: Namespace, qualified_name: []const u8) Name { + if (element_namespace == .svg or element_namespace == .mathml) { + if (foreign_attributes.get(qualified_name)) |name| { + return staticName(name); + } + } + return .{ .name = .wrap(qualified_name), .namespace = .none }; +} + +fn isEventHandler(name: []const u8) bool { + if (std.mem.startsWith(u8, name, "on") == false) { + return false; + } + return std.sort.binarySearch([]const u8, defaults.event_handler_attributes, name, struct { + fn order(key: []const u8, item: []const u8) std.math.Order { + return std.mem.order(u8, key, item); + } + }.order) != null; +} + +// https://html.spec.whatwg.org/#built-in-navigating-url-attributes-list +fn isNavigatingURLAttribute(element: Name, attribute: Name) bool { + const local = attribute.name.str(); + switch (element.namespace) { + .xhtml => { + if (attribute.namespace != .none) { + return false; + } + const tag = element.name.str(); + if (std.mem.eql(u8, tag, "a") or std.mem.eql(u8, tag, "area")) { + return std.mem.eql(u8, local, "href"); + } + if (std.mem.eql(u8, tag, "form")) { + return std.mem.eql(u8, local, "action"); + } + if (std.mem.eql(u8, tag, "button") or std.mem.eql(u8, tag, "input")) { + return std.mem.eql(u8, local, "formaction"); + } + return false; + }, + // any MathML element, not just + .svg, .mathml => { + if (element.namespace == .svg and std.mem.eql(u8, element.name.str(), "a") == false) { + return false; + } + return (attribute.namespace == .none or attribute.namespace == .xlink) and std.mem.eql(u8, local, "href"); + }, + else => return false, + } +} + +fn isAnimatingURLAttribute(element: Name, attribute: Name) bool { + if (element.namespace != .svg or attribute.namespace != .none) { + return false; + } + if (std.mem.eql(u8, attribute.name.str(), "attributeName") == false) { + return false; + } + const tag = element.name.str(); + return std.mem.eql(u8, tag, "animate") or std.mem.eql(u8, tag, "animateTransform") or std.mem.eql(u8, tag, "set"); +} + +fn isJavascriptURL(value: []const u8) bool { + const trimmed = std.mem.trimStart(u8, value, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f "); + const scheme = "javascript:"; + var i: usize = 0; + for (trimmed) |c| { + if (c == '\t' or c == '\n' or c == '\r') { + continue; + } + if (std.ascii.toLower(c) != scheme[i]) { + return false; + } + i += 1; + if (i == scheme.len) { + return true; + } + } + return false; +} + pub const JsApi = struct { pub const bridge = js.Bridge(Sanitizer); diff --git a/src/browser/webapi/ShadowRoot.zig b/src/browser/webapi/ShadowRoot.zig index 99f6c1566..ac18e3935 100644 --- a/src/browser/webapi/ShadowRoot.zig +++ b/src/browser/webapi/ShadowRoot.zig @@ -24,6 +24,7 @@ const Frame = @import("../Frame.zig"); const Node = @import("Node.zig"); const Element = @import("Element.zig"); +const Sanitizer = @import("Sanitizer.zig"); const DocumentFragment = @import("DocumentFragment.zig"); const ShadowRoot = @This(); @@ -110,8 +111,12 @@ fn getSerializable(self: *const ShadowRoot) bool { return self._serializable; } -pub fn setHTMLUnsafe(self: *ShadowRoot, html: []const u8, frame: *Frame) !void { - return self.asDocumentFragment().setHTMLUnsafe(html, frame); +pub fn setHTML(self: *ShadowRoot, html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !void { + return Sanitizer.setAndFilterHTML(self.asNode(), self._host, html, options, true, frame); +} + +pub fn setHTMLUnsafe(self: *ShadowRoot, html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !void { + return Sanitizer.setAndFilterHTML(self.asNode(), self._host, html, options, false, frame); } pub fn getHTML(self: *ShadowRoot, opts: dump.Opts.Shadow.Declarative, writer: *std.Io.Writer, frame: *Frame) !void { @@ -219,6 +224,7 @@ pub const JsApi = struct { return self.getElementById(try value.toZig([]const u8), frame); } pub const adoptedStyleSheets = bridge.accessor(ShadowRoot.getAdoptedStyleSheets, ShadowRoot.setAdoptedStyleSheets, .{}); + pub const setHTML = bridge.function(ShadowRoot.setHTML, .{ .ce_reactions = true }); pub const setHTMLUnsafe = bridge.function(ShadowRoot.setHTMLUnsafe, .{ .ce_reactions = true }); pub const getHTML = bridge.function(_getHTML, .{}); const GetHTMLOpts = struct { From 0f44c3ec51627fcdb42ac01a01845d3b95e9394f Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 24 Sep 2026 11:24:10 +0800 Subject: [PATCH 36/47] webapi: Legacy constuctor API We previously supported the legacy constructors via new Image() and new Audio() and https://github.com/lightpanda-io/browser/pull/3620 adds support for new Option(). In most cases, that was good enough, but it wasn't quite up to spec, e.g. new HTMLImageElement() still worked and HtMLImageElement showed up in window. This PR cleans it up by giving each one a distinct constructor for their legacy function and NOT creating the default one bridge.constructor would otherwise create. --- src/browser/js/Snapshot.zig | 60 ++++++++++++++++------ src/browser/tests/element/html/image.html | 20 ++++++++ src/browser/tests/element/html/media.html | 20 ++++++++ src/browser/tests/element/html/option.html | 20 ++++++++ 4 files changed, 105 insertions(+), 15 deletions(-) diff --git a/src/browser/js/Snapshot.zig b/src/browser/js/Snapshot.zig index c7a33ae95..d7c537473 100644 --- a/src/browser/js/Snapshot.zig +++ b/src/browser/js/Snapshot.zig @@ -325,22 +325,18 @@ fn createSnapshotContext( const template_index = comptime bridge.JsApiLookup.getId(JsApi); const func = v8.v8__FunctionTemplate__GetFunction(templates[template_index], context); if (@hasDecl(JsApi.Meta, "name")) { + const name = JsApi.Meta.name; + const v8_class_name = v8.v8__String__NewFromUtf8(isolate, name.ptr, v8.kNormal, @intCast(name.len)); + var maybe_result: v8.MaybeBool = undefined; + // Web IDL: interface objects on the global are non-enumerable. + v8.v8__Object__DefineOwnProperty(global_obj, context, v8_class_name, func, v8.DontEnum, &maybe_result); + if (@hasDecl(JsApi.Meta, "constructor_alias")) { const alias = JsApi.Meta.constructor_alias; - const v8_class_name = v8.v8__String__NewFromUtf8(isolate, alias.ptr, v8.kNormal, @intCast(alias.len)); - var maybe_result: v8.MaybeBool = undefined; - v8.v8__Object__Set(global_obj, context, v8_class_name, func, &maybe_result); - - const name = JsApi.Meta.name; - const illegal_class_name = v8.v8__String__NewFromUtf8(isolate, name.ptr, v8.kNormal, @intCast(name.len)); - var maybe_result2: v8.MaybeBool = undefined; - v8.v8__Object__DefineOwnProperty(global_obj, context, illegal_class_name, func, 0, &maybe_result2); - } else { - const name = JsApi.Meta.name; - const v8_class_name = v8.v8__String__NewFromUtf8(isolate, name.ptr, v8.kNormal, @intCast(name.len)); - var maybe_result: v8.MaybeBool = undefined; - // Web IDL: interface objects on the global are non-enumerable. - v8.v8__Object__DefineOwnProperty(global_obj, context, v8_class_name, func, v8.DontEnum, &maybe_result); + const alias_func = generateLegacyFactoryFunction(JsApi, isolate, templates[template_index], func.?, context.?); + const v8_alias_name = v8.v8__String__NewFromUtf8(isolate, alias.ptr, v8.kNormal, @intCast(alias.len)); + var maybe_alias_result: v8.MaybeBool = undefined; + v8.v8__Object__DefineOwnProperty(global_obj, context, v8_alias_name, @ptrCast(alias_func), v8.DontEnum, &maybe_alias_result); } } @@ -720,7 +716,9 @@ fn protoIndexLookup(comptime JsApi: type) ?u16 { // Generate a constructor template for a JsApi type (public for reuse) fn generateConstructor(comptime JsApi: type, isolate: *v8.Isolate) *const v8.FunctionTemplate { const callback, const arity = comptime blk: { - if (@hasDecl(JsApi, "constructor")) { + // The constructor belongs to the legacy factory function (`Image`), + // see generateLegacyFactoryFunction. + if (@hasDecl(JsApi, "constructor") and !@hasDecl(JsApi.Meta, "constructor_alias")) { break :blk .{ JsApi.constructor.func, JsApi.constructor.arity }; } if (inheritsFromHtmlElement(JsApi)) { @@ -748,6 +746,38 @@ fn generateConstructor(comptime JsApi: type, isolate: *v8.Isolate) *const v8.Fun return template; } +// https://webidl.spec.whatwg.org/#legacy-factory-functions +// `Image`, `Audio`, `Option`: a function distinct from the interface object +// (so `new HTMLImageElement()` stays illegal and `Image.name` is "Image"), +// whose `prototype` is the interface's prototype object. +fn generateLegacyFactoryFunction(comptime JsApi: type, isolate: *v8.Isolate, interface_template: *const v8.FunctionTemplate, interface_func: *const v8.Function, context: *const v8.Context) *const v8.Function { + const alias = JsApi.Meta.constructor_alias; + const template = v8.v8__FunctionTemplate__New__Config(isolate, &.{ + .length = JsApi.constructor.arity, + .callback = JsApi.constructor.func, + .behavior = v8.kConstructorBehavior_Allow, + }).?; + // Inherit so that the objects we construct pass the interface's + // accessor and method signature checks. + v8.v8__FunctionTemplate__Inherit(template, interface_template); + { + const internal_field_count = comptime countInternalFields(JsApi); + if (internal_field_count > 0) { + const instance_template = v8.v8__FunctionTemplate__InstanceTemplate(template); + v8.v8__ObjectTemplate__SetInternalFieldCount(instance_template, internal_field_count); + } + } + const class_name = v8.v8__String__NewFromUtf8(isolate, alias.ptr, v8.kNormal, @intCast(alias.len)); + v8.v8__FunctionTemplate__SetClassName(template, class_name); + + const func = v8.v8__FunctionTemplate__GetFunction(template, context).?; + const prototype_key = v8.v8__String__NewFromUtf8(isolate, "prototype", v8.kNormal, 9); + const interface_prototype = v8.v8__Object__Get(@ptrCast(interface_func), context, prototype_key).?; + var maybe_result: v8.MaybeBool = undefined; + v8.v8__Object__DefineOwnProperty(@ptrCast(func), context, prototype_key, interface_prototype, v8.ReadOnly + v8.DontEnum + v8.DontDelete, &maybe_result); + return func; +} + // hard-coded special case for HtmlElement which can be extended but not // instantiated. fn inheritsFromHtmlElement(comptime JsApi: type) bool { diff --git a/src/browser/tests/element/html/image.html b/src/browser/tests/element/html/image.html index fcb9455e4..a778285cb 100644 --- a/src/browser/tests/element/html/image.html +++ b/src/browser/tests/element/html/image.html @@ -179,3 +179,23 @@ img.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACw='; testing.expectEqual(undefined, await img.decode()); + + diff --git a/src/browser/tests/element/html/media.html b/src/browser/tests/element/html/media.html index a0e23f437..3d248e075 100644 --- a/src/browser/tests/element/html/media.html +++ b/src/browser/tests/element/html/media.html @@ -308,3 +308,23 @@ testing.expectEqual(true, video.paused); } + + diff --git a/src/browser/tests/element/html/option.html b/src/browser/tests/element/html/option.html index e35cc306e..93bafa0b9 100644 --- a/src/browser/tests/element/html/option.html +++ b/src/browser/tests/element/html/option.html @@ -257,3 +257,23 @@ testing.expectEqual(1, select.selectedIndex) } + + From 5b994c10cd5b48bd0a7ad852c84c9f0e307151b1 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 24 Sep 2026 12:51:51 +0800 Subject: [PATCH 37/47] http: preserve preload script errors Preloaded modules would discard errors in the hope that re-fetching the script when it was needed, might work. This reverses that decision and stores the error state. When a preload fails, that failure sticks. This does mean that a transient failure doesn't get a second chance. But it also means we don't log the failure multiple times (I noticed this when using adblocking and seeing duplicate failures for the same endpoint). Since we don't keep trying, it cuts down the CDP flow too. --- src/browser/ScriptManager.zig | 61 +++++++++++++++++-- src/browser/ScriptManagerBase.zig | 47 +++++++++++--- .../tests/fixtures/preload_failed.html | 8 +++ src/browser/tests/fixtures/preload_failed.js | 1 + .../tests/fixtures/preload_failed_module.js | 1 + 5 files changed, 105 insertions(+), 13 deletions(-) create mode 100644 src/browser/tests/fixtures/preload_failed.html create mode 100644 src/browser/tests/fixtures/preload_failed.js create mode 100644 src/browser/tests/fixtures/preload_failed_module.js diff --git a/src/browser/ScriptManager.zig b/src/browser/ScriptManager.zig index a0437c64a..08fced465 100644 --- a/src/browser/ScriptManager.zig +++ b/src/browser/ScriptManager.zig @@ -199,7 +199,7 @@ fn waitForPreload(self: *ScriptManager, url: [:0]const u8) ?*Script { _ = client.tickSync(200) catch return null; continue; }, - .done => |script| { + .done, .failed => |script| { // Preload scripts are single-use. We return it and it becomes // the caller's responsibility to free. _ = self.preloaded_scripts.remove(url); @@ -318,7 +318,7 @@ pub fn addFromElement(self: *ScriptManager, comptime from_parser: bool, script_e if (mode != .normal) { var preloaded = self.takePreload(remote_url); if (preloaded == null and kind == .module) { - preloaded = self.base.takeModuleHint(remote_url); + preloaded = try self.base.takeModuleHint(remote_url); } if (preloaded) |pre| { if (comptime lp.IS_DEBUG) { @@ -545,6 +545,7 @@ const PreloadedScript = struct { const State = union(enum) { loading: *Script, done: *Script, + failed: *Script, }; pub fn deinit(self: PreloadedScript) void { @@ -583,10 +584,12 @@ const PreloadedScript = struct { log.warn(.http, "script fetch error", .{ .err = err, .req = script.url, .extra = "preload", .status = script.status }); } + script.status = 0; // status == 0 is correctly treated as an error throughout + script.complete = true; + const self: *ScriptManager = @fieldParentPtr("base", script.manager); - _ = self.preloaded_scripts.remove(script.url); + self.preloaded_scripts.getPtr(script.url).?.state = .{ .failed = script }; script.queueHintEvent(.@"error"); - script.deinit(); } // Owner-driven teardown killed this preload fetch via Transfer.kill, which @@ -726,6 +729,52 @@ test "ScriptManager: preload whose submit fails synchronously releases its arena const url = "http://127.0.0.1:9582/fails-at-submit.js"; // A fetch was started (and failed), so the hint's error event fires. try testing.expectEqual(true, try sm.preloadScript(null, url)); - // errorCallback consumed the entry; nothing dangles in the map. - try testing.expectEqual(false, sm.preloaded_scripts.contains(url)); + // The failed entry stays for a + + +

+
content
+
content
+
+ + diff --git a/src/browser/webapi/CSS.zig b/src/browser/webapi/CSS.zig index 213064d7b..136b8a276 100644 --- a/src/browser/webapi/CSS.zig +++ b/src/browser/webapi/CSS.zig @@ -19,7 +19,6 @@ const std = @import("std"); const js = @import("../js/js.zig"); const Frame = @import("../Frame.zig"); -const units = @import("../css/units.zig"); const Tokenizer = @import("../css/Tokenizer.zig"); const CSS = @This(); @@ -27,18 +26,6 @@ _pad: bool = false, pub const init: CSS = .{}; -// parseDimension plus viewport-relative units, which the faux layout -// resolves against the page viewport. -pub fn parseDimensionViewport(value: []const u8, frame: *Frame) ?f64 { - const parsed = units.parse(value) catch return null; - return switch (parsed.unit) { - .none, .px => parsed.value, - .vh => parsed.value * @as(f64, @floatFromInt(frame.page.getViewport().height)) / 100.0, - .vw => parsed.value * @as(f64, @floatFromInt(frame.page.getViewport().width)) / 100.0, - else => null, - }; -} - // Extract the X value from a transfrom. This could come from a translate, // translatex, translate3d or matrix function. pub fn parseTranslateX(value: []const u8) f64 { diff --git a/src/browser/webapi/Element.zig b/src/browser/webapi/Element.zig index 4283c67ba..ff9d2e801 100644 --- a/src/browser/webapi/Element.zig +++ b/src/browser/webapi/Element.zig @@ -1486,27 +1486,34 @@ pub const Axis = enum { }; pub fn getElementAxis(self: *Element, frame: *Frame, comptime axis: Axis) Axis.State { - if (self.inlineStyle(frame)) |style| { - const decl = style.asCSSStyleDeclaration(); - if (CSS.parseDimensionViewport(decl.getPropertyValue(@tagName(axis), frame), frame)) |v| { + const tag = self.getTag(); + const root = tag == .html or tag == .body; + + if (self.ownerFrame(frame)) |owner| { + const style_manager = &owner._style_manager; + // Roots take only an inline size: a sheet's `height: 100vh` on body + // would shrink the box every synthetic position must fit in. + const size = if (root) style_manager.inlineSize(self, axis) else style_manager.declaredSize(self, axis); + if (size) |v| { return .{ .value = v, .explicit = true }; } } - switch (self.getTag()) { - // Root containers get large default size to contain descendant positions. - // With calculateDocumentPosition using linear depth scaling (100px per level), - // even very deep trees (100 levels) stay within 10,000px. - // 100M pixels is plausible for very long documents. - .html, .body => return .{ .value = if (axis == .width) 1920.0 else 100_000_000.0 }, - .img, .iframe => { - if (self.getAttributeSafe(comptime .wrap(@tagName(axis)))) |attr| { - if (std.fmt.parseFloat(f64, attr)) |parsed| { - return .{ .value = parsed, .explicit = true }; - } else |_| {} - } - }, - else => {}, + // Root containers get large default size to contain descendant positions. + // With calculateDocumentPosition using linear depth scaling (100px per level), + // even very deep trees (100 levels) stay within 10,000px. + // 100M pixels is plausible for very long documents. + if (root) { + return .{ .value = if (axis == .width) 1920.0 else 100_000_000.0 }; + } + + // Presentational attributes lose to CSS sizes. + if (tag == .img or tag == .iframe) { + if (self.getAttributeSafe(comptime .wrap(@tagName(axis)))) |attr| { + if (std.fmt.parseFloat(f64, attr)) |parsed| { + return .{ .value = parsed, .explicit = true }; + } else |_| {} + } } return .{ .value = 5.0 }; From ee2b97d9f8b405143a61b98b0bcb6060cf4ebcb3 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Thu, 24 Sep 2026 12:24:54 -0700 Subject: [PATCH 42/47] fix ordering of store help entries --- src/help.zon | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/help.zon b/src/help.zon index 65b9d323c..f48bc9091 100644 --- a/src/help.zon +++ b/src/help.zon @@ -396,6 +396,9 @@ \\ --cookie-jar \\ Path to a JSON file to save cookies to on exit (write-only). \\ Defaults to no cookie saving. + \\ --cors-store-entry-limit + \\ Maximum number of entries kept in the CorsStore. 0 means no limit. + \\ Defaults to 1000. \\ --experimental-features \\ Enable an experimental, unstable feature. Can be passed multiple times. \\ Behavior may change or be removed without notice. @@ -502,15 +505,12 @@ \\ --obey-robots \\ Fetches and obeys robots.txt of the target page. \\ Defaults to false. - \\ --robot-store-entry-limit - \\ Maximum number of entries kept in the RobotStore. 0 means no limit. - \\ Defaults to 1000. - \\ --cors-store-entry-limit - \\ Maximum number of entries kept in the CorsStore. 0 means no limit. - \\ Defaults to 1000. \\ --proxy-bearer-token \\ Token sent for bearer authentication with the proxy: \\ Proxy-Authorization: Bearer . + \\ --robot-store-entry-limit + \\ Maximum number of entries kept in the RobotStore. 0 means no limit. + \\ Defaults to 1000. \\ --timezone \\ Time zone used by Date and Intl, e.g. Europe/Paris or UTC. \\ Defaults to the host time zone. From 4957d109d3b5dbc73ed13ef0105e5358eec550c3 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Thu, 24 Sep 2026 12:26:24 -0700 Subject: [PATCH 43/47] use coversRequest everywhere in CorsStore --- src/network/CorsStore.zig | 57 +++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/src/network/CorsStore.zig b/src/network/CorsStore.zig index 6df9c1018..6674542b1 100644 --- a/src/network/CorsStore.zig +++ b/src/network/CorsStore.zig @@ -169,24 +169,6 @@ fn matches(entry: Entry, method: http.Method, authored_headers: []const []const return true; } -/// Whether a cached grant for `key` covers this method/headers combination. -/// A miss (expired or absent entry) is treated as not covered. -pub fn covers( - self: *CorsStore, - key: Key, - method: http.Method, - authored_headers: []const []const u8, -) !bool { - const cache_key = try key.build(self.allocator); - defer self.allocator.free(cache_key); - - self.mutex.lockUncancelable(lp.io); - defer self.mutex.unlock(lp.io); - - const entry = self.getWithExpiration(cache_key) orelse return false; - return matches(entry.*, method, authored_headers); -} - pub fn coversRequest( self: *CorsStore, allocator: std.mem.Allocator, @@ -273,30 +255,35 @@ test "CorsStore: put then covers, miss on different origin/target/credentials" { .expires_at = lp.datetime.milliTimestamp(.real) + 60_000, }); - try testing.expect(try store.covers( + try testing.expect(try store.coversRequest( + allocator, .{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, .POST, &.{}, )); - try testing.expect(!try store.covers( + try testing.expect(!try store.coversRequest( + allocator, .{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, .PUT, &.{}, )); - try testing.expect(!try store.covers( + try testing.expect(!try store.coversRequest( + allocator, .{ .origin = "https://b.example", .target = "https://api.example", .credentials = false }, .POST, &.{}, )); - try testing.expect(!try store.covers( + try testing.expect(!try store.coversRequest( + allocator, .{ .origin = "https://a.example", .target = "https://other.example", .credentials = false }, .POST, &.{}, )); // Same origin/target but different credentials mode: separate entry, must miss. - try testing.expect(!try store.covers( + try testing.expect(!try store.coversRequest( + allocator, .{ .origin = "https://a.example", .target = "https://api.example", .credentials = true }, .POST, &.{}, @@ -316,7 +303,8 @@ test "CorsStore: expired entries are treated as a miss on covers" { .expires_at = lp.datetime.milliTimestamp(.real) - 1, }); - try testing.expect(!try store.covers( + try testing.expect(!try store.coversRequest( + allocator, .{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, .GET, &.{}, @@ -352,9 +340,9 @@ test "CorsStore: put merges into existing entry rather than clobbering" { }); freeHeaders(allocator, h2); - try testing.expect(try store.covers(key, .POST, &.{"x-one"})); - try testing.expect(try store.covers(key, .PUT, &.{"x-two"})); - try testing.expect(!try store.covers(key, .DELETE, &.{})); + try testing.expect(try store.coversRequest(allocator, key, .POST, &.{"x-one"})); + try testing.expect(try store.coversRequest(allocator, key, .PUT, &.{"x-two"})); + try testing.expect(!try store.coversRequest(allocator, key, .DELETE, &.{})); } test "CorsStore: credentialed and non-credentialed grants for same origin/target stay separate" { @@ -388,24 +376,27 @@ test "CorsStore: credentialed and non-credentialed grants for same origin/target // A credentialed request asking for an arbitrary header must be rejected // against the credentialed entry, even though the non-cred entry has a wildcard. - try testing.expect(!try store.covers( + try testing.expect(!try store.coversRequest( + allocator, .{ .origin = origin, .target = target, .credentials = true }, .GET, &.{"x-anything"}, )); - try testing.expect(try store.covers( + try testing.expect(try store.coversRequest( + allocator, .{ .origin = origin, .target = target, .credentials = true }, .GET, &.{"x-custom"}, )); - try testing.expect(!try store.covers( + try testing.expect(!try store.coversRequest( + allocator, .{ .origin = origin, .target = target, .credentials = true }, .PUT, &.{}, )); // The non-credentialed entry's wildcard still works for non-cred requests. - try testing.expect(try store.covers(.{ .origin = origin, .target = target, .credentials = false }, .GET, &.{"x-anything"})); + try testing.expect(try store.coversRequest(allocator, .{ .origin = origin, .target = target, .credentials = false }, .GET, &.{"x-anything"})); } test "CorsStore: covers never lets a wildcard cover Authorization" { @@ -422,6 +413,6 @@ test "CorsStore: covers never lets a wildcard cover Authorization" { .expires_at = std.math.maxInt(u64), }); - try testing.expect(!try store.covers(key, .GET, &.{"authorization"})); - try testing.expect(try store.covers(key, .GET, &.{"x-anything"})); + try testing.expect(!try store.coversRequest(allocator, key, .GET, &.{"authorization"})); + try testing.expect(try store.coversRequest(allocator, key, .GET, &.{"x-anything"})); } From 6aa0fffab39adcecadf213ca8f40fb4ed8215921 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Thu, 24 Sep 2026 12:29:57 -0700 Subject: [PATCH 44/47] collectAuthoredHeaders just once in CorsGate --- src/network/CorsGate.zig | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index 5b904cdc9..bec549ed2 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -246,7 +246,7 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result { }); lp.metrics.cors_check.incr(.preflight); - try self.fetchThenResume(transfer); + try self.fetchThenResume(transfer, authored.items); return .pending; } @@ -538,31 +538,16 @@ const CorsPreflightContext = struct { } }; -fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void { +fn fetchThenResume(self: *CorsGate, transfer: *Transfer, authored_headers: []const []const u8) !void { const url = transfer.req.url; const origin = transfer.effectiveOrigin(); - var header_names: std.ArrayList([]const u8) = .empty; - for (transfer.req_headers.items) |hdr| { - if (hdr.source != .author) continue; - if (isSafelistedHeader(hdr.name, hdr.value)) continue; - try header_names.append( - transfer.arena.allocator(), - try std.ascii.allocLowerString(transfer.arena.allocator(), hdr.name), - ); - } - std.mem.sort([]const u8, header_names.items, {}, struct { - fn lessThan(_: void, a: []const u8, b: []const u8) bool { - return std.mem.lessThan(u8, a, b); - } - }.lessThan); - const cors_key = CorsKey{ .url = url, .origin = origin, .method = transfer.req.method, .wants_credentials = transfer.req.credentials_mode == .include, - .authored_headers = header_names.items, + .authored_headers = authored_headers, }; const key = try cors_key.build(transfer.arena.allocator()); @@ -585,8 +570,8 @@ fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void { const referer: ?[]const u8 = transfer.findRequestHeader("referer"); - const owned_header_names = try arena.alloc([]const u8, header_names.items.len); - for (header_names.items, 0..) |name, i| { + const owned_header_names = try arena.alloc([]const u8, authored_headers.len); + for (authored_headers, 0..) |name, i| { owned_header_names[i] = try arena.dupe(u8, name); } @@ -642,8 +627,8 @@ fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void { ); // Access-Control-Allow-Headers - if (header_names.items.len > 0) { - const request_headers_value = try std.mem.join(arena.allocator(), ",", header_names.items); + if (authored_headers.len > 0) { + const request_headers_value = try std.mem.join(arena.allocator(), ",", authored_headers); try fetch_transfer.setHeader( ACCESS_CONTROL_REQUEST_HEADERS, request_headers_value, From acd71e5f2991ce61b40005b26f055383f5fc0ae0 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Thu, 24 Sep 2026 12:30:44 -0700 Subject: [PATCH 45/47] collect allowed headers from response --- src/network/CorsGate.zig | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/network/CorsGate.zig b/src/network/CorsGate.zig index bec549ed2..fdcd9b58a 100644 --- a/src/network/CorsGate.zig +++ b/src/network/CorsGate.zig @@ -427,13 +427,25 @@ const CorsPreflightContext = struct { const headers_wildcard = acah != null and std.mem.eql(u8, acah.?, "*") and !self.wants_credentials; + var allowed_headers: std.ArrayList([]const u8) = .empty; + if (!headers_wildcard) { + if (acah) |list| { + var it = std.mem.splitScalar(u8, list, ','); + while (it.next()) |raw| { + const token = std.mem.trim(u8, raw, &std.ascii.whitespace); + if (token.len == 0) continue; + try allowed_headers.append(self.arena.allocator(), token); + } + } + } + try self.gate.network.cors_store.put( .{ .origin = self.origin, .target = self.url, .credentials = self.wants_credentials }, .{ .methods_wildcard = methods_wildcard, .methods = methods, .headers_wildcard = headers_wildcard, - .headers = if (headers_wildcard) &.{} else self.request_headers, + .headers = allowed_headers.items, .expires_at = lp.datetime.milliTimestamp(.real) + capped_ms, }, ); From 07880245b21be3b919251f2276f081656abe11ae Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 25 Sep 2026 01:01:57 +0000 Subject: [PATCH 46/47] orderfile: regenerate the hot-code profile hot set 16652KB resident at 4KB fault-around: 21492 text, 21950 rodata symbols --- orderfile/lightpanda.ld | 4601 +++++++++++++++++++-------------------- orderfile/v8.txt | 346 ++- 2 files changed, 2442 insertions(+), 2505 deletions(-) diff --git a/orderfile/lightpanda.ld b/orderfile/lightpanda.ld index 95a42784a..0e942efb7 100644 --- a/orderfile/lightpanda.ld +++ b/orderfile/lightpanda.ld @@ -26,42 +26,43 @@ SECTIONS { ".text.network.Certificates.init" ".text.network.http.Connection.reset" ".text.provider.listChatModelIds" + ".text.browser.webapi.collections.RadioNodeList.getAtIndex" + ".text.browser.webapi.collections.NodeList.getAtIndex" ".text.network.adblock.AdBlocker.addToTrie" ".text.network.adblock.AdBlocker.fromConfig" ".text.storage.sqlite.Sqlite.Conn.rollback" - ".text.storage.sqlite.Sqlite.Conn.exec__anon_140305" + ".text.storage.sqlite.Sqlite.Conn.exec__anon_141258" ".text.network.Network.init" ".text.App.init" ".text.sys.net.epoll_ctl" ".text.server.Server.init" - ".text.Sighandler.on__anon_141520" - ".text.Sighandler.on__anon_141678" + ".text.Sighandler.on__anon_142472" + ".text.Sighandler.on__anon_142630" ".text.Sighandler.deadline" ".text.mcp.HttpServer.init" - ".text.Sighandler.on__anon_141867" + ".text.Sighandler.on__anon_142819" ".text.mcp.HttpServer.run" ".text.main.run" ".text.start.main" ".text.Io.Threaded.deinit" ".text.unlikely.Io.Threaded.Thread.futexWaitInner" ".text.Io.Threaded.mutexLock" - ".text.log.fatal__anon_142086" + ".text.log.fatal__anon_143038" ".text.process.exit" ".text.log.writeErased" ".text.log.logToErased" ".text.log.logKVs" ".text.debug.lockStderr" ".text.Io.lockStderr" - ".text.debug.print__anon_142896" + ".text.debug.print__anon_143847" ".text.Io.Writer.alignBuffer" ".text.Io.Writer.splatByteAll" ".text.Io.Writer.writeSplat" - ".text.Io.Writer.printFloat__anon_143662" - ".text.fmt.float.formatDecimal__anon_143749" - ".text.fmt.float.round__anon_143770" - ".text.fmt.float.binaryToDecimal__anon_143739" - ".text.Io.Writer.printFloat__anon_147240" - ".text.Io.Writer.print__anon_142766" + ".text.fmt.float.formatScientific__anon_144697" + ".text.fmt.float.round__anon_144721" + ".text.fmt.float.binaryToDecimal__anon_144690" + ".text.Io.Writer.printFloat__anon_148191" + ".text.Io.Writer.print__anon_143717" ".text.base64.Base64Encoder.encode" ".text.Io.Writer.writeByte" ".text.Io.Writer.writeAll" @@ -71,18 +72,17 @@ SECTIONS { ".text.Io.Writer.failingRebase" ".text.Io.Writer.noopFlush" ".text.Io.Writer.fixedDrain" - ".text.Sighandler.on__anon_142035.TypeErased.start" + ".text.Sighandler.on__anon_142987.TypeErased.start" + ".text.Thread.PosixThreadImpl.spawn__anon_148356.Instance.entryFn" ".text.agent.settings.saveRemembered" ".text.browser.js.Env.init" ".text.network.UrlBlocklist.init" ".text.browser.Browser.init" - ".text.ArenaPool._acquire__anon_149369" + ".text.ArenaPool._acquire__anon_150320" ".text.browser.Browser.newSession" ".text.ToolSession.restartSession" ".text.ToolSession.init" ".text.provider.Client.init" - ".text.agent.Terminal.printScriptDone" - ".text.agent.Spinner.emitAbove" ".text.agent.Spinner.renderLocked" ".text.Io.Writer.Allocating.toOwnedSlice" ".text.script.Runtime.deinit" @@ -90,11 +90,11 @@ SECTIONS { ".text.script.Runtime.printCompletion" ".text.script.Runtime.writeConsoleLine" ".text.script.Runtime.formatRejection" - ".text.ArenaPool._acquire__anon_155764" + ".text.ArenaPool._acquire__anon_156713" ".text.browser.Factory.registerDocument" ".text.browser.webapi.Performance.init" - ".text.ArenaPool._acquire__anon_160623" - ".text.Arena.dupe__anon_160634" + ".text.ArenaPool._acquire__anon_161561" + ".text.Arena.dupe__anon_161572" ".text.browser.js.Origin.init" ".text.browser.Page.getOrCreateOrigin" ".text.browser.js.Env.createContext" @@ -105,8 +105,9 @@ SECTIONS { ".text.browser.Frame.init" ".text.browser.URL.getOrigin" ".text.browser.js.Context.setOrigin" - ".text.ArenaPool._acquire__anon_161265" + ".text.ArenaPool._acquire__anon_162194" ".text.browser.webapi.event.NavigationCurrentEntryChangeEvent.initWithTrusted" + ".text.browser.webapi.navigation.Navigation.dispatch" ".text.browser.webapi.navigation.Navigation.fireCurrentEntryChangeEvent" ".text.browser.webapi.Event.initTrusted" ".text.browser.webapi.navigation.NavigationHistoryEntry.fireDispose" @@ -117,7 +118,7 @@ SECTIONS { ".text.network.HttpClient.Transfer.putHeader" ".text.browser.Frame.navigate" ".text.browser.Session._processFrameNavigation" - ".text.ArenaPool._acquire__anon_162179" + ".text.ArenaPool._acquire__anon_163108" ".text.browser.Session.allocatePage" ".text.browser.Session.processPageQueuedNavigation" ".text.browser.js.Scheduler.run" @@ -125,43 +126,43 @@ SECTIONS { ".text.network.HttpClient.setFetchMetadataHeaders" ".text.ascii.allocLowerString" ".text.network.SingleFlight.enter" - ".text.network.CorsGate.fetchThenResume" ".text.network.cache.Cache.get" ".text.network.HttpClient.Transfer.bufferEvents" ".text.network.HttpClient.Transfer.bufferCached" ".text.browser.URL.getRobotsUrl" ".text.network.HttpClient.pipeline" ".text.network.HttpClient.startPending" - ".text.browser.webapi.storage.Cookie.percentEncode__anon_163985" + ".text.browser.webapi.storage.Cookie.percentEncode__anon_164925" ".text.browser.webapi.storage.Cookie.parsePath" + ".text.browser.webapi.storage.Cookie.parseDomain" + ".text.datetime.Parser.time" + ".text.browser.webapi.storage.Cookie.parse" + ".text.browser.webapi.storage.Cookie.Jar.add__anon_165243" ".text.browser.webapi.storage.Cookie.Jar.populateFromResponse" ".text.network.HttpClient.Transfer.materializeResponse" - ".text.browser.URL.resolve__anon_164422" + ".text.browser.URL.resolve__anon_165360" ".text.browser.referrer.compute" ".text.network.HttpClient.Transfer.applyRedirectTarget" ".text.network.HttpClient.Transfer.handleRedirect" - ".text.storage.sqlite.Sqlite.Conn.exec__anon_164667" + ".text.storage.sqlite.Sqlite.Conn.exec__anon_165605" ".text.network.HttpClient.processOneMessage" ".text.network.HttpClient.processMessages" ".text.network.HttpClient.drainInbox" ".text.network.HttpClient._tick" - ".text.browser.Runner._tick__anon_154738" + ".text.browser.Runner._tick__anon_155689" ".text.script.Runtime.formatCaught" - ".text.browser.Page.findFrameBy__anon_165153" + ".text.browser.Page.findFrameBy__anon_166091" ".text.server.Link.send" ".text.server.bidi.BiDi.sendError" ".text.server.bidi.BiDi.replyError" ".text.server.bidi.script.resolveTarget" ".text.browser.js.Local.compile" ".text.server.bidi.script.serialize" - ".text.browser.js.Value.toStringSliceWithAlloc" - ".text.server.bidi.script.sendException" - ".text.server.bidi.script.processMessage" ".text.server.bidi.browser.processMessage" ".text.browser.Session.createPage" ".text.server.bidi.browsing_context.announceRealm" ".text.server.bidi.browsing_context.openContext" - ".text.browser.URL.resolve__anon_167189" + ".text.browser.URL.resolve__anon_168127" ".text.browser.URL.resolveNavigation" ".text.browser.Session.initiateRootNavigation" ".text.server.bidi.browsing_context.startNavigation" @@ -173,7 +174,9 @@ SECTIONS { ".text.browser.webapi.selector.Selector.querySelectorAll" ".text.browser.webapi.Node.getElementsByTagName" ".text.server.bidi.browsing_context.Locator.locate" - ".text.log.writeThunk__anon_168585__struct_168593.write" + ".text.server.bidi.input.processMessage" + ".text.server.bidi.BiDi.Command.failed" + ".text.log.writeThunk__anon_169509__struct_169517.write" ".text.json.Scanner.skipWhitespaceCheckEnd" ".text.json.Scanner.endOfBufferInString" ".text.json.Scanner.next" @@ -183,12 +186,13 @@ SECTIONS { ".text.json.Scanner.skipValue" ".text.json.Scanner.peekNextTokenType" ".text.array_list.AlignedManaged(u8,null).ensureTotalCapacity" - ".text.json.static.innerParse__anon_169136" - ".text.json.static.innerParse__anon_169256" + ".text.json.static.innerParse__anon_170060" + ".text.json.static.innerParse__anon_170180" ".text.array_list.AlignedManaged(u8,null).toOwnedSlice" - ".text.json.static.sliceToInt__anon_169342" - ".text.json.static.innerParse__anon_169289" - ".text.fmt.parse_float.parseFloat__anon_169352" + ".text.json.static.sliceToInt__anon_170266" + ".text.json.static.innerParse__anon_170213" + ".text.fmt.parse_float.parseFloat__anon_170276" + ".text.unlikely.fmt.parse_float.convert_slow.convertSlow__anon_170344" ".text.fmt.parse_float.decimal.Decimal(f128).round" ".text.fmt.parse_float.decimal.Decimal(f128).leftShift" ".text.fmt.parse_float.decimal.Decimal(f128).rightShift" @@ -206,8 +210,8 @@ SECTIONS { ".text.json.Stringify.outputSpecialEscape" ".text.server.bidi.input.Pending.cancelled" ".text.server.bidi.input.Pending.resumeFromScheduler" - ".text.json.Stringify.write__anon_171026" - ".text.json.Stringify.write__anon_171199" + ".text.json.Stringify.write__anon_171950" + ".text.json.Stringify.write__anon_172123" ".text.browser.webapi.event.KeyboardEvent.Key.fromString" ".text.browser.webapi.net.FormData.initWithCharset" ".text.browser.webapi.element.Attribute.List.getEntryAndNormalizedName" @@ -215,33 +219,51 @@ SECTIONS { ".text.browser.webapi.element.Attribute.List._put" ".text.browser.webapi.element.html.Dialog.close" ".text.browser.webapi.KeyValueList.writeFormLineEnd" - ".text.browser.webapi.KeyValueList.urlEncodeValueUtf8__anon_174457" - ".text.browser.webapi.KeyValueList.urlEncodeFormValue" - ".text.browser.webapi.net.FormData.urlEncodeEntry" - ".text.browser.webapi.net.FormData.encodeForCharset" + ".text.browser.webapi.KeyValueList.urlEncodeValueUtf8__anon_175189" + ".text.browser.StyleManager.rebuildIfDirty" + ".text.browser.StyleManager.ownProps" ".text.browser.StyleManager.compute" ".text.browser.webapi.Element.Tag.isHiddenByUaStylesheet" ".text.hash.wyhash.Wyhash.final" ".text.browser.StyleManager.checkRules" ".text.hash.wyhash.Wyhash.hash" ".text.unlikely.hash_map.HashMapUnmanaged(\*browser.webapi.Element,browser.StyleManager.Props,hash_map.AutoContext(\*browser.webapi.Element),80).grow" + ".text.sort.block.block__anon_179012" + ".text.math.ldexp.ldexp__anon_180236" + ".text.browser.css.Tokenizer.consumeString" + ".text.browser.css.Tokenizer.consumeComment" + ".text.browser.css.Tokenizer.startsWith" ".text.browser.css.Parser.RulesIterator.next" ".text.browser.webapi.Node.getTextContent" ".text.browser.StyleManager.applyLayerAtRule" ".text.browser.css.MediaQuery.matches" - ".text.mem.findPos__anon_180551" + ".text.mem.findPos__anon_181282" ".text.browser.css.MediaQuery.stripDevice" - ".text.mem.findPosLinear__anon_180562" + ".text.mem.findPosLinear__anon_181293" ".text.browser.css.MediaQuery.parseLengthPx" ".text.browser.css.MediaQuery.trimWsAndComments" ".text.browser.StyleManager.internLayer" + ".text.browser.webapi.Element.ScrollEventTask.run" + ".text.browser.webapi.Element.contentAxis__anon_182429" + ".text.browser.webapi.Element.isVisible" + ".text.browser.StyleManager.isHidden" ".text.unlikely.hash_map.HashMapUnmanaged(\*browser.webapi.Element,browser.webapi.Element.ScrollPosition,hash_map.AutoContext(\*browser.webapi.Element),80).grow" - ".text.browser.webapi.Element.clientAxis__anon_181680" - ".text.browser.webapi.Element.getElementAxis__anon_181675" - ".text.fmt.parse_float.parseFloat__anon_181818" + ".text.browser.webapi.Element.clientAxis__anon_182411" + ".text.browser.webapi.Element.getElementAxis__anon_182406" + ".text.fmt.parse_float.parseFloat__anon_182549" + ".text.unlikely.fmt.parse_float.convert_slow.convertSlow__anon_182595" + ".text.fmt.parse_float.decimal.Decimal(f64).round" ".text.browser.webapi.css.CSSStyleDeclaration.getPropertyValue" ".text.browser.webapi.css.CSSStyleDeclaration.resolvedDimension" ".text.browser.webapi.Element.getTagNameLower" + ".text.browser.webapi.css.CSSStyleDeclaration.AxisPair.formatValue" + ".text.browser.webapi.css.CSSStyleDeclaration.declaredValue" + ".text.browser.webapi.css.CSSStyleDeclaration.axisPair" + ".text.Io.File.Reader.readVec" + ".text.Io.Reader.stream" + ".text.Io.File.Reader.readVecStreaming" + ".text.Io.File.Reader.readVecPositional" + ".text.Io.File.Reader.seekBy" ".text.Io.File.Reader.discard" ".text.Io.Writer.Discarding.sendFile" ".text.Io.File.Reader.getSize" @@ -249,142 +271,136 @@ SECTIONS { ".text.Io.File.Reader.stream" ".text.array_list.Aligned(debug.Symbol,null).append" ".text.debug.Dwarf.DebugRangeIterator.init" - ".text.debug.Dwarf.readAddress" - ".text.debug.Dwarf.DebugRangeIterator.next" ".text.debug.ElfFile.load" ".text.debug.ElfFile.DebugInfoSearchPaths.native" ".text.Io.Threaded.scanEnviron" ".text.Io.Writer.printHex" ".text.debug.ElfFile.loadInner" ".text.browser.Frame.HashChangeCallback.run" - ".text.browser.js.Local.mapZigInstanceToJs__anon_205002" - ".text.browser.js.Local.mapZigInstanceToJs__anon_205295" - ".text.browser.js.Function.tryCallWithThis__anon_204896" - ".text.browser.js.Function.callWithThisRethrow__anon_205468" + ".text.browser.js.Local.mapZigInstanceToJs__anon_205733" + ".text.browser.js.Local.mapZigInstanceToJs__anon_206026" + ".text.browser.js.Function.tryCallWithThis__anon_205627" + ".text.browser.js.Function.callWithThisRethrow__anon_206199" ".text.browser.js.Local.eval" - ".text.browser.js.Function.callWithThisRethrow__anon_205565" + ".text.browser.js.Function.callWithThisRethrow__anon_206296" ".text.browser.EventManagerBase.removeListener" ".text.browser.js.Value.toStringSlice" - ".text.browser.js.js.newTrackedSlot__anon_205731" + ".text.browser.js.js.newTrackedSlot__anon_206462" ".text.browser.webapi.event.ErrorEvent.initWithTrusted" - ".text.browser.js.Function.call__anon_205858" - ".text.browser.webapi.Window.reportError" - ".text.log.Value.initRuntime__anon_206401.Thunk.logFmt" - ".text.log.writeThunk__anon_206449__struct_206455.write" - ".text.browser.js.TryCatch.Caught.format" - ".text.log.warn__anon_205506" + ".text.browser.js.Function.call__anon_206589" ".text.browser.EventManagerBase.Listener.reportException" - ".text.browser.js.Local.resolveT__anon_207641.Wrap.releaseRefFromZig" - ".text.browser.js.Local.resolveT__anon_207641.Wrap.releaseRef" - ".text.browser.js.Local.resolveT__anon_207641.Wrap.acquireRef" - ".text.browser.js.Local.resolveT__anon_208181.Wrap.releaseRefFromZig" - ".text.browser.js.Local.resolveT__anon_208181.Wrap.releaseRef" - ".text.crash_handler.report__anon_210423" - ".text.unlikely.crash_handler.crash__anon_210402" + ".text.browser.js.Local.resolveT__anon_208372.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_208372.Wrap.releaseRef" + ".text.browser.js.Local.resolveT__anon_208372.Wrap.acquireRef" + ".text.browser.js.Local.resolveT__anon_208912.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_208912.Wrap.releaseRef" + ".text.browser.js.Local.resolveT__anon_208912.Wrap.acquireRef" + ".text.unlikely.lightpanda.assertionFailure__anon_209027" + ".text.crash_handler.report__anon_209131" + ".text.unlikely.crash_handler.crash__anon_209038" + ".text.unlikely.crash_handler.crash__anon_211133" ".text.hash_map.HashMapUnmanaged(usize,browser.js.js.FinalizerCallback,hash_map.AutoContext(usize),80).getOrPut" - ".text.browser.js.Local.resolveT__anon_210828.Wrap.releaseRefFromZig" - ".text.browser.js.Local.resolveT__anon_210828.Wrap.releaseRef" - ".text.browser.js.Local.resolveT__anon_210828.Wrap.acquireRef" + ".text.browser.js.Local.resolveT__anon_211559.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_211559.Wrap.releaseRef" + ".text.browser.js.Local.resolveT__anon_211559.Wrap.acquireRef" ".text.browser.webapi.net.XMLHttpRequest.releaseRef" ".text.browser.webapi.net.XMLHttpRequestEventTarget.releaseListeners" ".text.browser.js.Function.Global.deinit" ".text.browser.webapi.net.XMLHttpRequest.clearResponse" ".text.network.HttpClient.Transfer.cancel" - ".text.unlikely.lightpanda.assertionFailure__anon_210973" + ".text.unlikely.lightpanda.assertionFailure__anon_211704" ".text.network.HttpClient.Transfer.abort" - ".text.crash_handler.report__anon_211075" - ".text.unlikely.crash_handler.crash__anon_211049" + ".text.crash_handler.report__anon_211806" + ".text.unlikely.crash_handler.crash__anon_211780" ".text.network.HttpClient.Transfer.requestFailed" ".text.browser.webapi.Performance.notifyObservers" ".text.browser.webapi.Performance.insertOrdered" ".text.network.HttpClient.Transfer.recordResourceTiming" - ".text.log.writeThunk__anon_211832__struct_211838.write" - ".text.browser.js.Local.mapZigInstanceToJs__anon_212143" - ".text.browser.webapi.Performance.scheduleDelivery__struct_211377.run" + ".text.log.writeThunk__anon_212563__struct_212569.write" + ".text.browser.js.Local.mapZigInstanceToJs__anon_212874" + ".text.browser.webapi.Performance.scheduleDelivery__struct_212108.run" ".text.array_list.Aligned(\*browser.webapi.Performance.Entry,null).append" - ".text.browser.webapi.Performance.scheduleBufferFull__struct_211219.run" - ".text.browser.js.Execution.hasDirectListeners__anon_211218" - ".text.browser.EventManagerBase.dispatchDirect__anon_213234" - ".text.log.warn__anon_213252" - ".text.hash_map.HashMapUnmanaged(browser.EventManagerBase.EventKey,\*DoublyLinkedList,browser.EventManagerBase.EventKeyContext,80).getIndex__anon_213316" + ".text.browser.webapi.Performance.scheduleBufferFull__struct_211950.run" + ".text.browser.js.Execution.hasDirectListeners__anon_211949" + ".text.browser.EventManagerBase.dispatchDirect__anon_213965" + ".text.log.warn__anon_213983" + ".text.hash_map.HashMapUnmanaged(browser.EventManagerBase.EventKey,\*DoublyLinkedList,browser.EventManagerBase.EventKeyContext,80).getIndex__anon_214047" ".text.hash.wyhash.Wyhash.update" ".text.network.HttpClient.Transfer.timingAllowPassed" ".text.unlikely.hash_map.HashMapUnmanaged(usize,browser.js.js.FinalizerCallback,hash_map.AutoContext(usize),80).grow" - ".text.browser.js.Local.resolveT__anon_213476.Wrap.releaseRefFromZig" - ".text.browser.js.Local.resolveT__anon_213476.Wrap.releaseRef" - ".text.unlikely.crash_handler.crash__anon_216438" - ".text.browser.js.Local.resolveValue__anon_215949" - ".text.browser.js.Local.resolveValue__anon_216693" - ".text.browser.js.Local.resolveT__anon_215804.Wrap.releaseRef" - ".text.browser.js.Local.resolveT__anon_215804.Wrap.acquireRef" - ".text.browser.js.Local.resolveT__anon_227074.Wrap.releaseRefFromZig" - ".text.browser.webapi.storage.idb.IDBTransaction.releaseRef" - ".text.browser.js.Local.resolveT__anon_227444.Wrap.releaseRefFromZig" - ".text.unlikely.lightpanda.assertionFailure__anon_227695" - ".text.browser.js.Local.resolveT__anon_227444.Wrap.releaseRef" - ".text.crash_handler.report__anon_228399" - ".text.unlikely.crash_handler.crash__anon_228378" - ".text.browser.URL.eqlDocument" - ".text.browser.Frame.hasRelToken" - ".text.fmt.allocPrintSentinel__anon_174690" - ".text.fmt.allocPrintSentinel__anon_174685" - ".text.Io.Writer.Allocating.toOwnedSliceSentinel__anon_228850" + ".text.browser.js.Local.resolveT__anon_214207.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_214207.Wrap.releaseRef" + ".text.browser.js.Local.resolveT__anon_214207.Wrap.acquireRef" + ".text.browser.js.Local.resolveT__anon_215390.Wrap.releaseRefFromZig" + ".text.browser.webapi.net.WebSocket.releaseRef" + ".text.browser.js.Local.resolveT__anon_215390.Wrap.releaseRef" + ".text.browser.js.Local.resolveT__anon_215390.Wrap.acquireRef" + ".text.unlikely.lightpanda.assertionFailure__anon_215642" + ".text.crash_handler.report__anon_215700" + ".text.unlikely.crash_handler.crash__anon_217169" + ".text.browser.js.Local.resolveValue__anon_216680" + ".text.browser.js.Local.resolveValue__anon_217424" + ".text.browser.js.Local.resolveT__anon_216535.Wrap.releaseRef" + ".text.fmt.allocPrintSentinel__anon_175422" + ".text.fmt.allocPrintSentinel__anon_175417" + ".text.Io.Writer.Allocating.toOwnedSliceSentinel__anon_229581" ".text.browser.webapi.element.html.Form.normalizeEnctype" ".text.browser.webapi.net.FormData.releaseRef" ".text.browser.webapi.element.html.Body.Build.attributeChange" ".text.browser.Frame.headersForRequest" ".text.browser.Frame.queueElementEvent" ".text.browser.webapi.element.html.Image.imageAddedCallback" - ".text.browser.Frame.scheduleNavigation" ".text.browser.Frame.iframeAddedCallback" ".text.browser.webapi.element.html.IFrame.Build.attributeChange" - ".text.browser.webapi.element.html.Input.sanitizeValue__anon_229463" + ".text.browser.webapi.element.html.Input.sanitizeValue__anon_230194" ".text.browser.webapi.element.html.Input.Build.attributeChange" ".text.browser.webapi.element.html.Meta.processRefresh" ".text.browser.webapi.element.html.Meta.Build.attributeChange" ".text.browser.webapi.element.html.Option.Build.attributeChange" + ".text.browser.ScriptManagerBase.takeModuleHint" ".text.network.HttpClient.blockOn" ".text.network.HttpClient.Transfer.submitSync" - ".text.browser.Frame.scriptAddedCallback__anon_229676" - ".text.browser.js.Context.enqueueMicrotask__anon_231010__struct_231033.run" - ".text.browser.js.Local.mapZigInstanceToJs__anon_231263" - ".text.browser.js.Local.zigValueToJs__anon_231283" - ".text.unlikely.lightpanda.assertionFailure__anon_231605" - ".text.crash_handler.report__anon_231705" - ".text.unlikely.crash_handler.crash__anon_231664" - ".text.browser.js.Local.resolveT__anon_231729.Wrap.releaseRefFromZig" - ".text.browser.js.Local.resolveT__anon_231729.Wrap.releaseRef" - ".text.browser.js.Local.resolveT__anon_231774.Wrap.releaseRefFromZig" - ".text.browser.js.Local.resolveT__anon_231774.Wrap.releaseRef" + ".text.browser.js.Context.enqueueMicrotask__anon_231796__struct_231819.run" + ".text.browser.js.Local.mapZigInstanceToJs__anon_232049" + ".text.browser.js.Local.zigValueToJs__anon_232069" + ".text.unlikely.lightpanda.assertionFailure__anon_232391" + ".text.crash_handler.report__anon_232491" + ".text.unlikely.crash_handler.crash__anon_232450" + ".text.browser.js.Local.resolveT__anon_232515.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_232515.Wrap.releaseRef" + ".text.browser.js.Local.resolveT__anon_232560.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_232560.Wrap.releaseRef" ".text.browser.webapi.MutationObserver.releaseRef" - ".text.unlikely.lightpanda.assertionFailure__anon_231827" - ".text.crash_handler.report__anon_231852" - ".text.unlikely.crash_handler.crash__anon_231831" + ".text.unlikely.lightpanda.assertionFailure__anon_232613" + ".text.crash_handler.report__anon_232638" + ".text.unlikely.crash_handler.crash__anon_232617" ".text.browser.webapi.MutationObserver.disconnect" ".text.browser.webapi.Node.getRootNode" ".text.browser.webapi.Element.hostedShadowRoot" ".text.browser.webapi.element.slotting.slotAttributeChanged" ".text.browser.frame.observers.notifyAttributeChange" - ".text.browser.js.Context.enqueueMicrotask__anon_232619__struct_232647.run" - ".text.crash_handler.report__anon_233245" - ".text.unlikely.crash_handler.crash__anon_233210" + ".text.browser.js.Context.enqueueMicrotask__anon_233405__struct_233433.run" + ".text.browser.js.Local.resolveT__anon_233912.Wrap.releaseRef" + ".text.unlikely.lightpanda.assertionFailure__anon_233992" + ".text.crash_handler.report__anon_234031" + ".text.unlikely.crash_handler.crash__anon_233996" ".text.browser.webapi.element.html.Custom.enqueueAttributeChangedCallbackOnElement" ".text.__zig_tag_name_browser.webapi.Element.Tag" - ".text.browser.js.Context.enqueueMicrotask__anon_233426__struct_233620.run" - ".text.log.writeThunk__anon_233619__struct_233625.write" - ".text.browser.js.Local.jsValueToZig__anon_233753" + ".text.browser.js.Context.enqueueMicrotask__anon_234212__struct_234406.run" + ".text.log.writeThunk__anon_234405__struct_234411.write" + ".text.browser.js.Local.jsValueToZig__anon_234539" ".text.browser.webapi.CustomElementRegistry.upgradeCustomElement" ".text.browser.webapi.element.html.Custom.fireReaction" ".text.array_list.Aligned(browser.CustomElementReactions.Reaction,null).append" - ".text.browser.js.Local.mapZigInstanceToJs__anon_233867" + ".text.browser.js.Local.mapZigInstanceToJs__anon_234653" ".text.browser.js.Object.getFunction" - ".text.browser.js.Function._tryCallWithThis__anon_233931" - ".text.browser.js.Object.callMethod__anon_233898" - ".text.browser.js.Object.callMethod__anon_234084" - ".text.browser.js.Local.zigValueToJs__anon_234155" - ".text.browser.js.Local.mapZigInstanceToJs__anon_234258" - ".text.browser.js.Object.callMethod__anon_234216" - ".text.browser.webapi.element.html.Custom.enqueueConnectedCallbackOnElement__anon_233695" + ".text.browser.js.Function._tryCallWithThis__anon_234717" + ".text.browser.js.Object.callMethod__anon_234684" + ".text.browser.js.Object.callMethod__anon_234870" + ".text.browser.js.Local.zigValueToJs__anon_234941" + ".text.browser.js.Local.mapZigInstanceToJs__anon_235044" + ".text.browser.js.Object.callMethod__anon_235002" + ".text.browser.webapi.element.html.Custom.enqueueConnectedCallbackOnElement__anon_234481" ".text.hash_map.HashMapUnmanaged(\*browser.webapi.Element,void,hash_map.AutoContext(\*browser.webapi.Element),80).getOrPutContext" ".text.unlikely.hash_map.HashMapUnmanaged(\*browser.webapi.Element,void,hash_map.AutoContext(\*browser.webapi.Element),80).grow" ".text.browser.webapi.element.html.Select.resetToDefaultSelection" @@ -394,35 +410,35 @@ SECTIONS { ".text.browser.ScriptManagerBase.Script.queueHintEvent" ".text.browser.ScriptManagerBase.Script.dataCallback" ".text.browser.ScriptManagerBase.Script.headerCallback" - ".text.unlikely.lightpanda.assertionFailure__anon_235655" - ".text.unlikely.lightpanda.assertionFailure__anon_235648" - ".text.crash_handler.report__anon_235776" - ".text.unlikely.crash_handler.crash__anon_235749" - ".text.crash_handler.report__anon_236040" - ".text.unlikely.crash_handler.crash__anon_235751" + ".text.unlikely.lightpanda.assertionFailure__anon_236428" + ".text.crash_handler.report__anon_236536" + ".text.unlikely.crash_handler.crash__anon_236506" + ".text.unlikely.crash_handler.crash__anon_236544" ".text.browser.ScriptManagerBase.Script.startCallback" ".text.browser.ScriptManager.evalNow" ".text.browser.ImportMap.sortedNormalizedSpecifierMap" ".text.browser.ImportMap.mergeEntries" ".text.browser.js.Context.compileModule" ".text.browser.js.Module.persist" - ".text.browser.ImportMap.resolveImportsMatch" - ".text.browser.ScriptManagerBase.preloadImport" - ".text.browser.js.Context.postCompileModule" - ".text.browser.js.Context.evaluateModule__anon_236593" - ".text.browser.js.Context.module__anon_236494" + ".text.browser.js.Context.evaluateModule__anon_237355" + ".text.browser.js.Context.module__anon_237256" ".text.browser.ScriptManagerBase.Script.eval" + ".text.log.warn__anon_237668" + ".text.unlikely.lightpanda.assertionFailure__anon_237623" + ".text.hash_map.HashMapUnmanaged(\[\]const u8,browser.js.Context.ModuleEntry,hash_map.StringContext,80).getPtr" + ".text.crash_handler.report__anon_237798" + ".text.unlikely.crash_handler.crash__anon_237793" ".text.array_hash_map.Custom(\[\]const u8,json.hashmap.ArrayHashMap(\?\[\]const u8),array_hash_map.StringContext,true).getOrPut" - ".text.json.static.innerParse__anon_238775" + ".text.json.static.innerParse__anon_239512" ".text.array_hash_map.Custom(\[\]const u8,\?\[\]const u8,array_hash_map.StringContext,true).getOrPut" ".text.array_hash_map.Custom(\[\]const u8,\?\[\]const u8,array_hash_map.StringContext,true).deinit" ".text.browser.ScriptManagerBase.Script.executeCallback" - ".text.log.info__anon_230000" - ".text.unlikely.builtin.panic__struct_229923.panic" + ".text.log.info__anon_230786" + ".text.unlikely.builtin.panic__struct_230709.panic" ".text.unlikely.crash_handler.panic" ".text.network.HttpClient.releaseBlocking" - ".text.crash_handler.report__anon_239197" - ".text.unlikely.crash_handler.crash__anon_239160" + ".text.crash_handler.report__anon_239934" + ".text.unlikely.crash_handler.crash__anon_239897" ".text.unlikely.hash_map.HashMapUnmanaged(u32,u32,hash_map.AutoContext(u32),80).grow" ".text.network.HttpClient.SyncContext.shutdownCallback" ".text.network.HttpClient.SyncContext.errorCallback" @@ -430,10 +446,10 @@ SECTIONS { ".text.network.HttpClient.SyncContext.dataCallback" ".text.network.HttpClient.SyncContext.headerCallback" ".text.network.HttpClient.hasPendingTeardown" - ".text.unlikely.lightpanda.assertionFailure__anon_239338" - ".text.log.writeValue__anon_239365" - ".text.crash_handler.report__anon_239369" - ".text.unlikely.crash_handler.crash__anon_239347" + ".text.unlikely.lightpanda.assertionFailure__anon_240075" + ".text.log.writeValue__anon_240102" + ".text.crash_handler.report__anon_240106" + ".text.unlikely.crash_handler.crash__anon_240084" ".text.browser.ScriptManagerBase.Script.deinit" ".text.browser.ScriptManager.corsSettings" ".text.browser.ScriptManagerBase.evaluate" @@ -443,7 +459,7 @@ SECTIONS { ".text.browser.webapi.element.html.Input.uncheckRadioGroup" ".text.browser.webapi.element.html.Input.sameFormOwner" ".text.browser.webapi.element.html.Input.RadioGroupIterator.next" - ".text.fmt.allocPrint__anon_229537" + ".text.fmt.allocPrint__anon_230268" ".text.browser.webapi.element.html.Input.snapToStep" ".text.browser.webapi.element.html.Input.isValidFloatingPoint" ".text.browser.webapi.element.html.Input.isValidTime" @@ -451,7 +467,7 @@ SECTIONS { ".text.browser.webapi.element.html.Input.isValidDate" ".text.browser.Frame.fireElementEvent" ".text.browser.Frame.dispatchQueuedEvents" - ".text.browser.Frame.queueElementEvent__struct_229347.cleanup" + ".text.browser.Frame.queueElementEvent__struct_230078.cleanup" ".text.browser.frame.resource_load.ImageLoad.errorCallback" ".text.browser.frame.resource_load.ImageLoad.doneCallback" ".text.browser.frame.resource_load.ImageLoad.settle" @@ -461,14 +477,20 @@ SECTIONS { ".text.browser.frame.resource_load.ImageLoad.failed" ".text.browser.webapi.element.html.Image.selectSource" ".text.browser.webapi.element.html.Image.pickCandidate" - ".text.unlikely.crash_handler.crash__anon_241641" + ".text.browser.js.Context.stringToPersistedFunction__anon_242350" + ".text.browser.webapi.Window.setWindowReflectingHandlerFromAttribute" + ".text.unlikely.lightpanda.assertionFailure__anon_229826" + ".text.crash_handler.report__anon_242439" + ".text.unlikely.crash_handler.crash__anon_242389" ".text.browser.Frame.domChanged" ".text.browser.webapi.Node.compareDocumentPosition" - ".text.browser.js.Context.enqueueMicrotask__anon_241850__struct_241852.run" - ".text.browser.js.Context.enqueueMicrotask__anon_241867__struct_241869.run" + ".text.browser.js.Context.enqueueMicrotask__anon_242598__struct_242600.run" + ".text.browser.js.Context.enqueueMicrotask__anon_242615__struct_242617.run" ".text.browser.webapi.IntersectionObserver.checkIntersection" ".text.hash_map.HashMapUnmanaged(\[\]const u8,\*browser.webapi.Element,hash_map.StringContext,80).getOrPutContext" - ".text.browser.js.Context.enqueueMicrotask__anon_241980__struct_242135.run" + ".text.browser.js.Context.enqueueMicrotask__anon_242728__struct_242883.run" + ".text.browser.webapi.element.Attribute.List._delete" + ".text.browser.webapi.element.html.Body.Build.attributeRemove" ".text.browser.webapi.element.html.Input.Build.attributeRemove" ".text.browser.webapi.element.html.Option.Build.attributeRemove" ".text.browser.webapi.element.html.Select.Build.attributeRemove" @@ -477,30 +499,37 @@ SECTIONS { ".text.browser.webapi.element.html.Option.getValue" ".text.browser.webapi.element.html.Input.getValue" ".text.browser.webapi.Element.isDisabled" - ".text.browser.webapi.Element.hasDisabledConcept" - ".text.browser.webapi.collections.node_live.NodeLive(.form).matches" - ".text.unlikely.lightpanda.assertionFailure__anon_173511" - ".text.browser.webapi.element.html.ValidityState.getValid" - ".text.browser.js.Function.tryCallWithThis__anon_245153" - ".text.browser.EventManager.dispatchPhase__anon_245181" + ".text.browser.EventManager.dispatchPhase__anon_245861" + ".text.browser.js.Function.tryCallWithThis__anon_245896" + ".text.browser.EventManager.dispatchPhase__anon_245924" ".text.browser.EventManager.dispatchNode" - ".text.browser.EventManager.dispatchDirect__anon_245199" + ".text.browser.EventManager.dispatchDirect__anon_245942" ".text.browser.EventManager.dispatch" - ".text.browser.EventManagerBase.Listener.run__anon_245229" - ".text.log.warn__anon_245240" + ".text.browser.EventManagerBase.Listener.run__anon_245972" + ".text.log.warn__anon_245983" ".text.browser.webapi.element.Html.getAttributeFunction" ".text.__zig_tag_name_browser.webapi.global_event_handlers.Handler" ".text.browser.EventManager.getInlineHandler" ".text.hash_map.HashMapUnmanaged(browser.webapi.global_event_handlers.Key,browser.js.Function.Global,browser.webapi.global_event_handlers.Context,80).remove" ".text.hash_map.HashMapUnmanaged(browser.webapi.global_event_handlers.Key,browser.js.Function.Global,browser.webapi.global_event_handlers.Context,80).put" ".text.unlikely.hash_map.HashMapUnmanaged(browser.webapi.global_event_handlers.Key,browser.js.Function.Global,browser.webapi.global_event_handlers.Context,80).grow" - ".text.browser.EventManagerBase.Listener.run__anon_245141" - ".text.log.warn__anon_248192" + ".text.browser.EventManagerBase.Listener.run__anon_245884" + ".text.log.warn__anon_248935" ".text.browser.EventManager.AdjustedTargets.apply" ".text.browser.EventManager.listenersFor" - ".text.log.warn__anon_245104" - ".text.log.warn__anon_245080" + ".text.log.warn__anon_245847" + ".text.log.warn__anon_245823" ".text.browser.webapi.element.Html.getTabIndex" + ".text.browser.webapi.element.text_entry.TextEntry(browser.webapi.element.html.Input).caretTarget" + ".text.log.warn__anon_245659" + ".text.browser.frame.user_input.JavascriptUrlTask.finalize" + ".text.browser.frame.user_input.JavascriptUrlTask.run" + ".text.browser.webapi.Element.previousElementSibling" + ".text.browser.webapi.element.popover.hideUnrelatedAutos" + ".text.browser.webapi.element.popover.show" + ".text.browser.webapi.element.popover.hide" + ".text.browser.webapi.element.popover.hasChanged" + ".text.browser.webapi.element.popover.getInvokerAction" ".text.browser.webapi.element.popover.getState" ".text.browser.webapi.element.html.Label.getControl" ".text.browser.webapi.element.html.Button.getForm" @@ -515,11 +544,15 @@ SECTIONS { ".text.browser.webapi.EventCounts.getIndex" ".text.string.String.eqlSlice" ".text.browser.webapi.element.text_entry.TextEntry(browser.webapi.element.html.Input).innerInsert" - ".text.server.bidi.remote_value.Remote.jsonStringify__anon_251797" - ".text.Io.Writer.print__anon_251877" - ".text.json.Stringify.write__anon_251829" + ".text.browser.webapi.event.KeyboardEvent.Key.asString" + ".text.browser.webapi.Event.releaseRef" + ".text.unlikely.lightpanda.assertionFailure__anon_249916" + ".text.crash_handler.report__anon_249953" + ".text.server.bidi.remote_value.Remote.jsonStringify__anon_252540" + ".text.Io.Writer.print__anon_252620" + ".text.json.Stringify.write__anon_252572" ".text.browser.webapi.Node.getLength" - ".text.fmt.allocPrint__anon_168083" + ".text.fmt.allocPrint__anon_169007" ".text.browser.webapi.CData.getLength" ".text.hash_map.HashMapUnmanaged(\*browser.webapi.Node,\*NodeRegistry.Node,NodeRegistry.NodeContext,80).remove" ".text.unlikely.hash_map.HashMapUnmanaged(u32,\*NodeRegistry.Node,hash_map.AutoContext(u32),80).grow" @@ -532,13 +565,18 @@ SECTIONS { ".text.browser.webapi.Element.getTag" ".text.string.String.intern" ".text.browser.webapi.collections.node_live.NodeLive(.tag).matches" - ".text.meta.stringToEnum__anon_252792" + ".text.meta.stringToEnum__anon_253535" ".text.browser.xpath.Parser.parse" - ".text.browser.xpath.Parser.parseExpr" + ".text.browser.xpath.functions.containsFn" + ".text.browser.xpath.functions.startsWithFn" + ".text.browser.xpath.functions.concatFn" + ".text.browser.xpath.functions.stringFn" ".text.browser.webapi.Element.getTagNameSpec" ".text.browser.webapi.Element.upperTagName" ".text.browser.webapi.Document.getElementById" ".text.browser.xpath.Evaluator.evalStep" + ".text.hash_map.HashMapUnmanaged(browser.webapi.element.Attribute.List.LookupKey,\*browser.webapi.element.Attribute,hash_map.AutoContext(browser.webapi.element.Attribute.List.LookupKey),80).getOrPutContext" + ".text.browser.xpath.Evaluator.appendDescendants" ".text.unlikely.hash_map.HashMapUnmanaged(browser.webapi.element.Attribute.List.LookupKey,\*browser.webapi.element.Attribute,hash_map.AutoContext(browser.webapi.element.Attribute.List.LookupKey),80).grow" ".text.browser.xpath.result.toNumber" ".text.browser.xpath.Evaluator.cmpString" @@ -563,10 +601,10 @@ SECTIONS { ".text.server.bidi.browsing_context.badSelector" ".text.browser.Frame.getElementByIdFromNode" ".text.browser.webapi.ShadowRoot.getElementById" - ".text.array_hash_map.Custom(\[\]const u8,browser.webapi.selector.Selector.Cache.Entry,array_hash_map.StringContext,true).getSlotByKey__anon_256711" - ".text.array_hash_map.Custom(\[\]const u8,browser.webapi.selector.Selector.Cache.Entry,array_hash_map.StringContext,true).getSlotByKey__anon_256703" - ".text.array_hash_map.Custom(\[\]const u8,browser.webapi.selector.Selector.Cache.Entry,array_hash_map.StringContext,true).getSlotByKey__anon_256738" - ".text.array_hash_map.Custom(\[\]const u8,browser.webapi.selector.Selector.Cache.Entry,array_hash_map.StringContext,true).getIndexAdapted__anon_256565" + ".text.array_hash_map.Custom(\[\]const u8,browser.webapi.selector.Selector.Cache.Entry,array_hash_map.StringContext,true).getSlotByKey__anon_257452" + ".text.array_hash_map.Custom(\[\]const u8,browser.webapi.selector.Selector.Cache.Entry,array_hash_map.StringContext,true).getSlotByKey__anon_257444" + ".text.array_hash_map.Custom(\[\]const u8,browser.webapi.selector.Selector.Cache.Entry,array_hash_map.StringContext,true).getSlotByKey__anon_257479" + ".text.array_hash_map.Custom(\[\]const u8,browser.webapi.selector.Selector.Cache.Entry,array_hash_map.StringContext,true).getIndexAdapted__anon_257306" ".text.browser.webapi.selector.Parser.parseList" ".text.browser.webapi.selector.Parser.parseEscape" ".text.browser.webapi.selector.Parser.consumeEscapedIdentTail" @@ -580,29 +618,29 @@ SECTIONS { ".text.server.bidi.remote_value.nodeFromSharedId" ".text.array_hash_map.Custom(\[\]const u8,json.dynamic.Value,array_hash_map.StringContext,true).get" ".text.hash_map.HashMapUnmanaged(u32,\*NodeRegistry.Node,hash_map.AutoContext(u32),80).get" - ".text.mem.Allocator.alloc__anon_167417" - ".text.json.static.innerParse__anon_258041" - ".text.json.Stringify.write__anon_258081" - ".text.json.static.innerParse__anon_258146" - ".text.json.static.innerParse__anon_258240" - ".text.json.static.sliceToInt__anon_258291" - ".text.json.static.innerParse__anon_258265" - ".text.json.static.innerParse__anon_258127" - ".text.json.static.innerParse__anon_258484" - ".text.fmt.parseInt__anon_258542" - ".text.json.Stringify.write__anon_258813" - ".text.json.static.innerParse__anon_258830" - ".text.log.err__anon_258916" + ".text.mem.Allocator.alloc__anon_168354" + ".text.json.static.innerParse__anon_258782" + ".text.json.Stringify.write__anon_258822" + ".text.json.static.innerParse__anon_258887" + ".text.json.static.innerParse__anon_258981" + ".text.json.static.sliceToInt__anon_259032" + ".text.json.static.innerParse__anon_259006" + ".text.json.static.innerParse__anon_258868" + ".text.json.static.innerParse__anon_259225" + ".text.fmt.parseInt__anon_259283" + ".text.json.Stringify.write__anon_259554" + ".text.json.static.innerParse__anon_259571" + ".text.log.err__anon_259657" ".text.browser.Session.discardPendingPage" ".text.browser.Frame.abortTransfers" - ".text.unlikely.lightpanda.assertionFailure__anon_167225" - ".text.fmt.allocPrintSentinel__anon_167188" + ".text.unlikely.lightpanda.assertionFailure__anon_168163" + ".text.fmt.allocPrintSentinel__anon_168126" ".text.browser.webapi.net.WebSocket.kill" - ".text.json.Stringify.write__anon_259164" - ".text.json.static.innerParse__anon_259181" - ".text.json.static.innerParse__anon_259237" - ".text.json.static.innerParse__anon_259226" - ".text.array_list.AlignedManaged(u8,null).toOwnedSliceSentinel__anon_259527" + ".text.json.Stringify.write__anon_259905" + ".text.json.static.innerParse__anon_259922" + ".text.json.static.innerParse__anon_259978" + ".text.json.static.innerParse__anon_259967" + ".text.array_list.AlignedManaged(u8,null).toOwnedSliceSentinel__anon_260268" ".text.browser.Session.PageHandle.frame" ".text.browser.Session.processDestroyQueues" ".text.browser.webapi.ServiceWorkerGlobalScope.deinit" @@ -615,129 +653,118 @@ SECTIONS { ".text.browser.webapi.ServiceWorkerGlobalScope.setState" ".text.browser.webapi.ServiceWorker.StateChangeCallback.cancelled" ".text.browser.webapi.ServiceWorker.StateChangeCallback.run" - ".text.browser.EventManagerBase.dispatchDirect__anon_260471" - ".text.json.Stringify.write__anon_262132" - ".text.json.static.innerParse__anon_262159" + ".text.browser.EventManagerBase.dispatchDirect__anon_261212" + ".text.json.static.innerParse__anon_262829" + ".text.json.Stringify.write__anon_262873" + ".text.json.static.innerParse__anon_262900" ".text.Inbox.push" ".text.server.bidi.remote_value.Serializer.items" - ".text.browser.js.Function._tryCallWithThis__anon_262720" - ".text.browser.js.Object.callMethod__anon_262709" + ".text.browser.js.Function._tryCallWithThis__anon_263461" + ".text.browser.js.Object.callMethod__anon_263450" ".text.server.bidi.remote_value.Serializer.date" - ".text.browser.js.Object.get__anon_262737" - ".text.browser.js.Object.get__anon_262746" + ".text.browser.js.Object.get__anon_263478" + ".text.browser.js.Object.get__anon_263487" ".text.browser.js.Object.Iterator.next" ".text.server.bidi.remote_value.Serializer.properties" ".text.browser.webapi.collections.RadioNodeList.getLength" ".text.browser.webapi.collections.NodeList.length" - ".text.browser.webapi.collections.RadioNodeList.getAtIndex" - ".text.browser.webapi.collections.NodeList.getAtIndex" ".text.server.bidi.remote_value.Serializer.platform" ".text.server.bidi.remote_value.Serializer.remote" - ".text.browser.webapi.DOMException.fromError" - ".text.browser.Session.currentFrame" - ".text.server.http.fillHeader__anon_166033" + ".text.server.http.fillHeader__anon_166971" ".text.server.Server.Worker.notifyLoop" ".text.http.Status.phrase" ".text.browser.js.Local.newBigInt" - ".text.browser.js.Object.set__anon_266360" - ".text.browser.js.Local.mapZigInstanceToJs__anon_266368" + ".text.browser.js.Object.set__anon_267033" + ".text.browser.js.Local.mapZigInstanceToJs__anon_267041" ".text.server.bidi.remote_value.toJs" - ".text.server.bidi.script.toJs" - ".text.browser.js.Function.callWithThisRethrow__anon_266412" - ".text.server.bidi.remote_value.specialNumber" - ".text.meta.stringToEnum__anon_266303" ".text.browser.RenderTree.resolve" ".text.browser.screenshot.collect" ".text.browser.screenshot.preparePng" ".text.browser.pdf.prepare" ".text.browser.markdown.dump" ".text.browser.webapi.element.html.Custom.checkAndAttachBuiltIn" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271340" - ".text.browser.frame.node_factory.createHtmlElementT__anon_272269" - ".text.browser.frame.node_factory.constructForToken__anon_272350" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270600" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270605" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270623" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270658" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270745" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270750" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270755" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270760" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270779" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270884" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270933" - ".text.browser.frame.node_factory.createHtmlElementT__anon_270980" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271007" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271049" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271054" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271101" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271149" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271154" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271159" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271164" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271276" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272013" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272942" + ".text.browser.frame.node_factory.constructForToken__anon_273023" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271273" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271278" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271296" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271331" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271418" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271423" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271428" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271433" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271452" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271557" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271606" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271653" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271680" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271722" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271727" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271774" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271822" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271827" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271832" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271837" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271949" ".text.browser.webapi.element.html.Meta.Build.created" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271281" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271954" ".text.browser.webapi.css.CSSStyleSheet.initWithOwner" ".text.browser.webapi.Document.getStyleSheets" ".text.browser.webapi.css.StyleSheetList.add" ".text.browser.webapi.element.html.Link.linkAddedCallback" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271286" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271291" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271296" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271301" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271306" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271311" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271335" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271506" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271511" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271536" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271959" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271964" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271969" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271974" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271979" + ".text.browser.frame.node_factory.createHtmlElementT__anon_271984" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272008" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272179" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272184" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272209" ".text.browser.webapi.element.html.Input.Build.created" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271585" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271590" - ".text.browser.frame.node_factory.createHtmlElementT__anon_271595" - ".text.browser.Factory.svgElement__anon_279856" - ".text.browser.frame.node_factory.createSvgElementT__anon_272670" - ".text.browser.Factory.svgElement__anon_279926" - ".text.browser.frame.node_factory.createSvgElementT__anon_272687" - ".text.browser.Factory.svgElement__anon_279999" - ".text.browser.frame.node_factory.createSvgElementT__anon_272692" - ".text.browser.Factory.svgElement__anon_280069" - ".text.browser.frame.node_factory.createElementNS__anon_270577" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272258" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272263" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272268" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272273" + ".text.browser.frame.node_factory.createHtmlMediaElementT__anon_272283" + ".text.browser.frame.node_factory.createHtmlMediaElementT__anon_272287" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272314" + ".text.browser.frame.node_factory.createHtmlElementT__anon_272319" + ".text.browser.Factory.svgElement__anon_280672" + ".text.browser.frame.node_factory.createSvgElementT__anon_273365" + ".text.browser.Factory.svgElement__anon_280742" + ".text.browser.frame.node_factory.createElementNS__anon_271250" ".text.browser.webapi.Document.createElement" - ".text.browser.webapi.Node.checkDocumentElementRules__anon_280198" - ".text.browser.webapi.Node.ensurePreInsertValidity__anon_280182" + ".text.browser.webapi.Node.checkDocumentElementRules__anon_280871" + ".text.browser.webapi.Node.ensurePreInsertValidity__anon_280855" ".text.browser.Frame.adoptNodeTree" ".text.browser.webapi.element.html.Picture.childInserted" ".text.browser.webapi.element.html.Style.getSheet" ".text.browser.webapi.element.html.Style.styleAddedCallback" - ".text.browser.Frame.nodeIsReady__anon_280348" + ".text.browser.Frame.nodeIsReady__anon_281021" ".text.browser.Frame.nodeIsReadySubtree" - ".text.browser.Frame._insertNodeRelative__anon_280275" + ".text.browser.Frame._insertNodeRelative__anon_280948" ".text.browser.Frame.moveAllChildren" ".text.browser.webapi.Node.appendChild" ".text.browser.webapi.Node.insertBeforeInner" - ".text.server.cdp.CDP.Command.sendResult__anon_270429" - ".text.server.cdp.CDP.Command.sendResult__anon_280436" + ".text.browser.dump.rootUncapped" ".text.browser.interactive.buildListenerTargetMap" ".text.browser.webapi.HTMLDocument.getTitle" - ".text.server.cdp.AXNode.getName.TextCaptureWriter.write__anon_280892" - ".text.server.cdp.AXNode.stripWhitespaces__anon_280925" - ".text.server.cdp.AXNode.writeString__anon_280908" + ".text.server.cdp.AXNode.getName.TextCaptureWriter.write__anon_281565" + ".text.server.cdp.AXNode.stripWhitespaces__anon_281598" + ".text.server.cdp.AXNode.writeString__anon_281581" ".text.browser.webapi.element.html.Label.LabelByForIndex.lookup" - ".text.server.cdp.AXNode.writeLabelInnerText__anon_280977" + ".text.server.cdp.AXNode.writeLabelInnerText__anon_281650" ".text.server.cdp.AXNode.writeAccessibleNameFallback" - ".text.browser.Runner.waitForSelector" - ".text.browser.actions.waitForSelector" - ".text.server.cdp.CDP.Command.sendResult__anon_282696" - ".text.server.cdp.CDP.Command.sendResult__anon_269277" + ".text.server.cdp.CDP.Command.sendResult__anon_283370" + ".text.server.cdp.CDP.Command.sendResult__anon_269950" ".text.server.cdp.domains.lp.processMessage" - ".text.server.cdp.domains.dom.processMessage" - ".text.server.cdp.domains.css.processMessage" - ".text.server.cdp.CDP.Command.sendResult__anon_284637" + ".text.server.cdp.CDP.Command.sendResult__anon_285311" ".text.server.cdp.domains.page.getFrameTree" ".text.server.cdp.domains.page.getNavigationHistory" - ".text.server.cdp.CDP.sendEvent__anon_284877" + ".text.server.cdp.CDP.sendEvent__anon_285551" ".text.server.cdp.domains.page.setLifecycleEventsEnabled" ".text.server.cdp.CDP.BrowserContext.createIsolatedWorld" ".text.server.cdp.domains.page.addScriptToEvaluateOnNewDocument" @@ -748,51 +775,56 @@ SECTIONS { ".text.server.cdp.domains.page.navigate" ".text.server.cdp.CDP.dispatchCommand" ".text.server.cdp.CDP.dispatchParsed" - ".text.json.static.innerParse__anon_285286" + ".text.json.static.innerParse__anon_285960" ".text.server.cdp.CDP.IsolatedWorld.removeContext" - ".text.unlikely.lightpanda.assertionFailure__anon_285143" - ".text.crash_handler.report__anon_285658" - ".text.unlikely.crash_handler.crash__anon_285625" + ".text.unlikely.lightpanda.assertionFailure__anon_285817" + ".text.crash_handler.report__anon_286332" + ".text.unlikely.crash_handler.crash__anon_286299" ".text.server.cdp.CDP.BrowserContext.removeIsolatedWorld" ".text.server.cdp.CDP.IsolatedWorld.removeAllContexts" ".text.server.cdp.CDP.BrowserContext.findIsolatedWorld" ".text.server.cdp.id.toLoaderId" ".text.server.cdp.id.toFrameId" - ".text.unlikely.lightpanda.assertionFailure__anon_284845" + ".text.unlikely.lightpanda.assertionFailure__anon_285519" ".text.server.cdp.CDP.BrowserContext.onFrameNetworkAlmostIdle" - ".text.log.writeValue__anon_286291" - ".text.unlikely.fmt.parse_float.convert_slow.convertSlow__anon_295132" - ".text.fmt.parse_float.convert_eisel_lemire.convertEiselLemire__anon_295128" + ".text.log.writeValue__anon_286965" + ".text.crash_handler.report__anon_286969" + ".text.fmt.parse_float.parseFloat__anon_295786" + ".text.unlikely.fmt.parse_float.convert_slow.convertSlow__anon_295806" + ".text.fmt.parse_float.convert_eisel_lemire.convertEiselLemire__anon_295802" ".text.server.cdp.CDP.BrowserContext.closeTarget" ".text.server.cdp.domains.page.close" - ".text.json.static.innerParse__anon_295508" - ".text.json.static.innerParse__anon_295575" + ".text.json.static.innerParse__anon_296182" + ".text.json.static.innerParse__anon_296249" ".text.server.cdp.CDP.BrowserContext.fetchDisableForSession" ".text.server.cdp.CDP.BrowserContext.fetchDisable" - ".text.server.cdp.domains.page.doReload" + ".text.unlikely.lightpanda.assertionFailure__anon_295974" + ".text.unlikely.lightpanda.assertionFailure__anon_296456" + ".text.crash_handler.report__anon_296485" ".text.browser.Frame.stopLoading" ".text.browser.Frame.cancelQueuedNavigation" ".text.server.cdp.domains.page.navigateToHistoryEntry" - ".text.json.static.innerParse__anon_296061" - ".text.json.Stringify.value__anon_285218" - ".text.json.Stringify.value__anon_285049" + ".text.json.static.innerParse__anon_296735" + ".text.json.Stringify.value__anon_285892" + ".text.json.Stringify.value__anon_285723" ".text.browser.Frame.IdleNotification.check" - ".text.json.Stringify.value__anon_284745" - ".text.json.Stringify.value__anon_284695" + ".text.json.Stringify.value__anon_285419" + ".text.json.Stringify.value__anon_285369" ".text.server.cdp.domains.page.handleJavaScriptDialog" - ".text.server.cdp.domains.page.FrameTreeWriter.write__anon_296324" - ".text.server.cdp.domains.page.FrameWriter.write__anon_296346" - ".text.log.warn__anon_284183" - ".text.json.static.sliceToInt__anon_297547" - ".text.json.static.innerParse__anon_297517" - ".text.unlikely.log.scoped(.default).err__anon_283861" - ".text.array_hash_map.Custom(\[\]const u8,network.ClockCache.Entry(network.Robots.RobotStore.RobotsEntry),array_hash_map.StringContext,true).getIndexAdapted__anon_300965" + ".text.server.cdp.domains.page.FrameTreeWriter.write__anon_296998" + ".text.server.cdp.domains.page.FrameWriter.write__anon_297020" + ".text.log.warn__anon_284857" + ".text.json.static.sliceToInt__anon_298221" + ".text.json.static.innerParse__anon_298191" + ".text.unlikely.log.scoped(.default).err__anon_284535" + ".text.server.cdp.domains.dom.findMainWorldContext" + ".text.array_hash_map.Custom(\[\]const u8,network.ClockCache.Entry(network.Robots.RobotStore.RobotsEntry),array_hash_map.StringContext,true).getIndexAdapted__anon_301639" ".text.array_list.Aligned(browser.structured_data.Property,null).append" ".text.array_list.Aligned(SemanticTree.OptionData,null).append" - ".text.fmt.allocPrint__anon_281588" - ".text.fmt.bufPrint__anon_281380" - ".text.browser.webapi.CSS.needsEscape__anon_281368" - ".text.log.writeThunk__anon_301758__struct_301760.write" + ".text.fmt.allocPrint__anon_282262" + ".text.browser.SelectorPath.matchCount" + ".text.fmt.allocPrint__anon_282120" + ".text.log.writeThunk__anon_302432__struct_302434.write" ".text.Regex.Context.cFree" ".text.Regex.Context.cMalloc" ".text.heap.StackFallbackAllocator(24576).free" @@ -801,41 +833,41 @@ SECTIONS { ".text.heap.StackFallbackAllocator(24576).alloc" ".text.server.cdp.AXNode.nameFromContentRole" ".text.browser.interactive.classifyInteractivity" + ".text.json.Stringify.value__anon_281324" ".text.array_hash_map.Custom(\[\]const u8,usize,array_hash_map.StringContext,true).getOrPut" + ".text.array_list.Aligned(SemanticTree.Open,null).append" ".text.array_list.Aligned(u8,null).ensureUnusedCapacity" - ".text.json.static.innerParse__anon_303580" - ".text.browser.dump.hasShellToken" + ".text.json.static.innerParse__anon_304357" ".text.browser.dump.hasRole" ".text.browser.dump.hasSectioningAncestor" - ".text.log.err__anon_280394" + ".text.log.err__anon_281067" ".text.browser.StyleManager.cascadeChanged" - ".text.log.err__anon_280372" + ".text.log.err__anon_281045" ".text.browser.webapi.element.slotting.insertionSteps" ".text.browser.webapi.element.html.Select.childInserted" ".text.browser.webapi.element.html.Select.ListChange.processInserted" - ".text.unlikely.lightpanda.assertionFailure__anon_280309" - ".text.crash_handler.report__anon_304955" - ".text.unlikely.crash_handler.crash__anon_304949" - ".text.unlikely.lightpanda.assertionFailure__anon_280298" - ".text.crash_handler.report__anon_304972" - ".text.unlikely.crash_handler.crash__anon_304970" - ".text.unlikely.lightpanda.assertionFailure__anon_280285" + ".text.unlikely.lightpanda.assertionFailure__anon_280982" + ".text.crash_handler.report__anon_305732" + ".text.unlikely.crash_handler.crash__anon_305726" + ".text.unlikely.lightpanda.assertionFailure__anon_280971" + ".text.crash_handler.report__anon_305749" + ".text.unlikely.crash_handler.crash__anon_305747" + ".text.unlikely.lightpanda.assertionFailure__anon_280958" ".text.browser.Frame.removeNode" - ".text.browser.webapi.element.html.Custom.enqueueShadowTreeCallbacks__anon_305028" + ".text.browser.webapi.element.html.Custom.enqueueShadowTreeCallbacks__anon_305805" ".text.browser.webapi.element.html.Custom.enqueueDisconnectedCallbackOnElement" ".text.browser.frame.observers.notifyChildListChange" - ".text.browser.webapi.element.html.Custom.enqueueShadowTreeCallbacks__anon_280414" - ".text.log.warn__anon_274579" + ".text.browser.webapi.element.html.Custom.enqueueShadowTreeCallbacks__anon_281087" + ".text.log.warn__anon_275252" ".text.browser.webapi.css.CSSStyleSheet.getCssRules" ".text.browser.webapi.css.CSSStyleSheet.replaceSync" ".text.browser.webapi.css.CSSStyleDeclaration.formatDeclarationEnd" ".text.browser.webapi.css.CSSStyleDeclaration.format" - ".text.browser.webapi.css.CSSStyleSheet.parseInto" ".text.browser.webapi.css.CSSStyleSheet.atRuleTypeFor" - ".text.log.warn__anon_274509" - ".text.log.info__anon_274496" - ".text.log.warn__anon_274482" - ".text.log.warn__anon_274475" + ".text.log.warn__anon_275182" + ".text.log.info__anon_275169" + ".text.log.warn__anon_275155" + ".text.log.warn__anon_275148" ".text.browser.ScriptManager.preloadScript" ".text.browser.frame.preload.scriptHint" ".text.browser.ScriptManager.PreloadedScript.shutdownCallback" @@ -846,172 +878,181 @@ SECTIONS { ".text.browser.ScriptManagerBase.preloadModuleHint" ".text.browser.frame.preload.moduleHint" ".text.browser.frame.node_factory.notSupportedError" - ".text.json.static.innerParse__anon_311201" - ".text.json.Stringify.value__anon_282755" - ".text.json.Stringify.value__anon_282716" - ".text.json.Stringify.value__anon_282545" - ".text.json.Stringify.write__anon_311847" - ".text.json.Stringify.write__anon_311875" - ".text.json.Stringify.value__anon_281106" - ".text.json.Stringify.value__anon_280566" - ".text.json.Stringify.value__anon_280516" + ".text.browser.dump.deep" + ".text.browser.RenderTree.measureChild" + ".text.json.static.innerParse__anon_311988" + ".text.json.static.innerParse__anon_311978" + ".text.json.Stringify.value__anon_283429" + ".text.json.Stringify.value__anon_283390" + ".text.json.Stringify.value__anon_283219" + ".text.json.Stringify.write__anon_312624" + ".text.json.Stringify.write__anon_312652" + ".text.json.Stringify.value__anon_281780" + ".text.json.Stringify.value__anon_281239" + ".text.json.Stringify.value__anon_281189" ".text.server.cdp.domains.inspector.processMessage" ".text.server.cdp.domains.emulation.setUserAgentOverride" ".text.server.cdp.domains.emulation.processMessage" - ".text.json.static.innerParse__anon_313642" + ".text.json.static.innerParse__anon_314424" ".text.browser.Frame.viewportChanged" ".text.browser.webapi.event.MediaQueryListEvent.initWithTrusted" - ".text.log.warn__anon_314052" + ".text.log.warn__anon_314834" ".text.network.http.Connection.setTlsVerify" ".text.server.cdp.domains.console.processMessage" - ".text.server.cdp.CDP.BrowserContext.onConsoleMessage" ".text.server.cdp.domains.storage.processMessage" ".text.browser.webapi.storage.Cookie.Jar.removeExpired" - ".text.json.static.innerParse__anon_315615" - ".text.json.static.innerParse__anon_315673" - ".text.json.Stringify.value__anon_315463" - ".text.server.cdp.domains.storage.writeCookie__anon_316937" - ".text.json.Stringify.write__anon_316882" + ".text.json.static.innerParse__anon_316397" + ".text.json.static.innerParse__anon_316455" + ".text.json.Stringify.value__anon_316245" + ".text.server.cdp.domains.storage.writeCookie__anon_317719" + ".text.json.Stringify.write__anon_317664" ".text.server.cdp.domains.network.processMessage" - ".text.json.Stringify.value__anon_317828" - ".text.hash.auto_hash.autoHash__anon_318304" - ".text.array_hash_map.Custom(server.cdp.CDP.BrowserContext.CapturedKey,server.cdp.CDP.BrowserContext.CapturedResponse,array_hash_map.AutoContext(server.cdp.CDP.BrowserContext.CapturedKey),true).getIndexAdapted__anon_318329" + ".text.json.Stringify.value__anon_318610" + ".text.hash.auto_hash.autoHash__anon_319086" + ".text.array_hash_map.Custom(server.cdp.CDP.BrowserContext.CapturedKey,server.cdp.CDP.BrowserContext.CapturedResponse,array_hash_map.AutoContext(server.cdp.CDP.BrowserContext.CapturedKey),true).getIndexAdapted__anon_319111" ".text.browser.URL.isLoopbackHost" ".text.Io.net.IpAddress.parseLiteral" - ".text.json.static.innerParse__anon_318592" + ".text.json.static.innerParse__anon_319374" + ".text.json.static.innerParse__anon_319772" ".text.server.cdp.CDP.BrowserContext.onHttpRequestServedFromCache" ".text.server.cdp.id.toRequestId" - ".text.unlikely.lightpanda.assertionFailure__anon_317309" - ".text.crash_handler.report__anon_319502" - ".text.unlikely.crash_handler.crash__anon_319462" + ".text.unlikely.lightpanda.assertionFailure__anon_318091" + ".text.crash_handler.report__anon_320284" + ".text.unlikely.crash_handler.crash__anon_320244" ".text.browser.Mime.parse" ".text.server.cdp.CDP.BrowserContext.onHttpResponseHeadersDone" - ".text.unlikely.lightpanda.assertionFailure__anon_317267" - ".text.crash_handler.report__anon_319695" - ".text.unlikely.crash_handler.crash__anon_319676" - ".text.server.cdp.SafeString.writeQuoted__anon_319873" - ".text.server.cdp.SafeString.writeObjectField__anon_319855" - ".text.json.Stringify.write__anon_319741" - ".text.json.Stringify.write__anon_319882" + ".text.unlikely.lightpanda.assertionFailure__anon_318049" + ".text.crash_handler.report__anon_320477" + ".text.unlikely.crash_handler.crash__anon_320458" + ".text.server.cdp.SafeString.writeQuoted__anon_320655" + ".text.server.cdp.SafeString.writeObjectField__anon_320637" + ".text.json.Stringify.write__anon_320523" + ".text.json.Stringify.write__anon_320664" ".text.server.cdp.CDP.BrowserContext.onHttpResponseData" - ".text.unlikely.lightpanda.assertionFailure__anon_321144" - ".text.unlikely.lightpanda.assertionFailure__anon_317226" - ".text.crash_handler.report__anon_321206" - ".text.unlikely.crash_handler.crash__anon_321182" + ".text.unlikely.lightpanda.assertionFailure__anon_321926" + ".text.unlikely.lightpanda.assertionFailure__anon_318008" + ".text.crash_handler.report__anon_321988" + ".text.unlikely.crash_handler.crash__anon_321964" ".text.server.cdp.CDP.BrowserContext.onHttpRequestDone" - ".text.unlikely.lightpanda.assertionFailure__anon_317186" + ".text.unlikely.lightpanda.assertionFailure__anon_317968" ".text.server.cdp.CDP.BrowserContext.onHttpRequestStart" - ".text.crash_handler.report__anon_321394" - ".text.unlikely.crash_handler.crash__anon_321293" - ".text.browser.webapi.storage.Cookie.Jar.forRequest__anon_321625" + ".text.crash_handler.report__anon_322176" + ".text.unlikely.crash_handler.crash__anon_322075" + ".text.browser.webapi.storage.Cookie.Jar.forRequest__anon_322407" ".text.network.HttpClient.Transfer.getCookieString" - ".text.json.Stringify.write__anon_321457" + ".text.json.Stringify.write__anon_322239" ".text.browser.webapi.storage.Cookie.areSameSite" ".text.browser.webapi.storage.Cookie.areHostsSameSite" ".text.unlikely.hash_map.HashMapUnmanaged(server.cdp.CDP.BrowserContext.CapturedKey,\[\]const u8,hash_map.AutoContext(server.cdp.CDP.BrowserContext.CapturedKey),80).grow" ".text.server.cdp.CDP.BrowserContext.onHttpRequestFail" - ".text.unlikely.lightpanda.assertionFailure__anon_321810" - ".text.json.Stringify.value__anon_317849" - ".text.json.Stringify.value__anon_317633" - ".text.json.Stringify.value__anon_317591" + ".text.unlikely.lightpanda.assertionFailure__anon_322592" + ".text.json.Stringify.value__anon_318631" + ".text.json.Stringify.value__anon_318415" + ".text.json.Stringify.value__anon_318373" ".text.network.HttpClient.clearUrlBlocklist" ".text.server.cdp.CDP.BrowserContext.clearCapturedResponses" - ".text.unlikely.lightpanda.assertionFailure__anon_322246" - ".text.crash_handler.report__anon_322270" + ".text.unlikely.lightpanda.assertionFailure__anon_323028" + ".text.crash_handler.report__anon_323052" + ".text.crash_handler.report__anon_323188" + ".text.unlikely.crash_handler.crash__anon_323156" + ".text.json.Stringify.value__anon_318695" ".text.browser.webapi.storage.Cookie.appliesTo" ".text.server.cdp.domains.runtime.processMessage" ".text.browser.webapi.storage.Cookie.matchesHost" ".text.server.cdp.CDP.BrowserContext.onRuntimeConsoleMessage" - ".text.server.cdp.CDP.Command.sendResult__anon_326098" + ".text.server.cdp.domains.webmcp.respondError" + ".text.server.cdp.domains.webmcp.respondCompleted" + ".text.server.cdp.CDP.Command.sendResult__anon_326880" ".text.server.cdp.domains.webmcp.processMessage" - ".text.unlikely.crash_handler.crash__anon_327313" - ".text.unlikely.lightpanda.assertionFailure__anon_327317" - ".text.crash_handler.report__anon_327353" - ".text.unlikely.crash_handler.crash__anon_327337" + ".text.crash_handler.report__anon_328135" + ".text.unlikely.crash_handler.crash__anon_328119" ".text.server.cdp.domains.audits.processMessage" - ".text.server.cdp.CDP.Command.sendEvent__anon_327964" + ".text.server.cdp.CDP.Command.sendEvent__anon_328746" ".text.server.cdp.domains.target.doAttachtoTarget" ".text.server.cdp.CDP.Command.createBrowserContext" - ".text.server.cdp.CDP.Command.sendEvent__anon_328657" - ".text.server.cdp.CDP.Command.sendResult__anon_328684" + ".text.server.cdp.CDP.Command.sendEvent__anon_329439" + ".text.server.cdp.CDP.Command.sendResult__anon_329466" ".text.server.cdp.domains.target.processMessage" - ".text.json.Stringify.value__anon_328704" - ".text.fmt.allocPrint__anon_328647" - ".text.json.Stringify.write__anon_328798" - ".text.unlikely.lightpanda.assertionFailure__anon_328638" - ".text.unlikely.lightpanda.assertionFailure__anon_328633" - ".text.unlikely.lightpanda.assertionFailure__anon_328560" - ".text.crash_handler.report__anon_328934" - ".text.unlikely.crash_handler.crash__anon_328916" + ".text.json.Stringify.value__anon_329486" + ".text.fmt.allocPrint__anon_329429" + ".text.json.Stringify.write__anon_329580" + ".text.unlikely.lightpanda.assertionFailure__anon_329420" + ".text.unlikely.lightpanda.assertionFailure__anon_329415" + ".text.unlikely.lightpanda.assertionFailure__anon_329342" + ".text.crash_handler.report__anon_329716" + ".text.unlikely.crash_handler.crash__anon_329698" ".text.server.cdp.CDP.BrowserContext.onJavascriptDialogOpening" - ".text.unlikely.crash_handler.crash__anon_329021" + ".text.unlikely.crash_handler.crash__anon_329803" ".text.server.cdp.CDP.BrowserContext.onFrameLoaded" - ".text.unlikely.lightpanda.assertionFailure__anon_328483" + ".text.unlikely.lightpanda.assertionFailure__anon_329265" ".text.server.cdp.CDP.BrowserContext.onFrameDOMContentLoaded" - ".text.crash_handler.report__anon_329245" - ".text.unlikely.crash_handler.crash__anon_329194" - ".text.unlikely.lightpanda.assertionFailure__anon_328450" - ".text.crash_handler.report__anon_329287" - ".text.unlikely.crash_handler.crash__anon_329253" + ".text.crash_handler.report__anon_330027" + ".text.unlikely.crash_handler.crash__anon_329976" + ".text.unlikely.lightpanda.assertionFailure__anon_329232" + ".text.crash_handler.report__anon_330069" + ".text.unlikely.crash_handler.crash__anon_330035" ".text.server.cdp.CDP.BrowserContext.onFrameDestroyed" - ".text.unlikely.lightpanda.assertionFailure__anon_328428" - ".text.crash_handler.report__anon_329311" - ".text.unlikely.crash_handler.crash__anon_329538" - ".text.server.cdp.CDP.sendEvent__anon_329654" + ".text.unlikely.lightpanda.assertionFailure__anon_329210" + ".text.crash_handler.report__anon_330093" + ".text.server.cdp.CDP.BrowserContext.onFrameNavigatedWithinDocument" + ".text.unlikely.lightpanda.assertionFailure__anon_329135" + ".text.crash_handler.report__anon_330339" + ".text.unlikely.crash_handler.crash__anon_330320" + ".text.server.cdp.CDP.sendEvent__anon_330436" ".text.server.cdp.CDP.BrowserContext.onFrameNavigated" - ".text.unlikely.lightpanda.assertionFailure__anon_328332" - ".text.crash_handler.report__anon_330225" - ".text.unlikely.crash_handler.crash__anon_330202" + ".text.unlikely.lightpanda.assertionFailure__anon_329114" + ".text.crash_handler.report__anon_331007" + ".text.unlikely.crash_handler.crash__anon_330984" ".text.server.cdp.CDP.BrowserContext.onFrameNavigate" - ".text.unlikely.lightpanda.assertionFailure__anon_328311" - ".text.crash_handler.report__anon_330383" - ".text.unlikely.crash_handler.crash__anon_330364" + ".text.unlikely.lightpanda.assertionFailure__anon_329093" + ".text.crash_handler.report__anon_331165" + ".text.unlikely.crash_handler.crash__anon_331146" ".text.server.cdp.CDP.BrowserContext.reset" ".text.server.cdp.CDP.BrowserContext.onFrameCreated" ".text.browser.js.Inspector.stopSession" ".text.server.cdp.CDP.BrowserContext.deinit" - ".text.unlikely.lightpanda.assertionFailure__anon_328284" - ".text.crash_handler.report__anon_330606" - ".text.unlikely.crash_handler.crash__anon_330585" + ".text.unlikely.lightpanda.assertionFailure__anon_329066" + ".text.crash_handler.report__anon_331388" + ".text.unlikely.crash_handler.crash__anon_331367" ".text.Notification.unregisterAll" ".text.server.cdp.CDP.BrowserContext.onFrameRemove" ".text.cookies.loadFromFile" ".text.server.cdp.CDP.BrowserContext.sendInspectorMessage" ".text.server.cdp.CDP.BrowserContext.onInspectorEvent" - ".text.unlikely.lightpanda.assertionFailure__anon_331070" + ".text.unlikely.lightpanda.assertionFailure__anon_331852" ".text.server.cdp.CDP.BrowserContext.onInspectorResponse" - ".text.unlikely.lightpanda.assertionFailure__anon_328125" + ".text.unlikely.lightpanda.assertionFailure__anon_328907" ".text.server.cdp.CDP.resolveSessionId" - ".text.json.Stringify.value__anon_328034" + ".text.json.Stringify.value__anon_328816" ".text.browser.Frame.getTitle" ".text.server.cdp.CDP.BrowserContext.getTitle" - ".text.json.Stringify.value__anon_327878" - ".text.json.Stringify.write__anon_332349" + ".text.json.Stringify.value__anon_328660" + ".text.json.Stringify.write__anon_333131" ".text.server.cdp.CDP.dispatch" - ".text.server.cdp.CDP.Command.sendEvent__anon_332451" - ".text.log.err__anon_332445" - ".text.json.static.parseFromSliceLeaky__anon_332434" - ".text.json.static.innerParse__anon_332628" - ".text.json.Stringify.value__anon_332855" - ".text.json.Stringify.value__anon_332886" - ".text.json.Stringify.value__anon_332830" - ".text.json.Stringify.value__anon_328600" - ".text.json.Stringify.value__anon_328092" - ".text.json.Stringify.value__anon_328056" + ".text.server.cdp.CDP.Command.sendEvent__anon_333233" + ".text.log.err__anon_333227" + ".text.json.static.parseFromSliceLeaky__anon_333216" + ".text.json.static.innerParse__anon_333410" + ".text.json.Stringify.value__anon_333637" + ".text.json.Stringify.value__anon_333668" + ".text.json.Stringify.value__anon_333612" + ".text.json.Stringify.value__anon_329382" + ".text.json.Stringify.value__anon_328874" + ".text.json.Stringify.value__anon_328838" ".text.server.cdp.domains.input.processMessage" ".text.network.HttpClient.Transfer.seedHeaders" ".text.server.cdp.domains.fetch.processMessage" ".text.server.cdp.AXNode.isIgnore" ".text.server.cdp.AXNode.isHidden" - ".text.json.Stringify.value__anon_339481" - ".text.json.Stringify.value__anon_282921" + ".text.json.Stringify.value__anon_340269" + ".text.json.Stringify.value__anon_283595" ".text.server.Driver.onDisconnect" ".text.server.Link.destroy" ".text.server.Link.deinit" ".text.server.bidi.http_command.navigateTo" ".text.server.bidi.http_command.getCurrentUrl" ".text.server.bidi.http_command.refresh" - ".text.server.bidi.http_command.elementClick" + ".text.server.bidi.BiDi.Command.sendResult__anon_341928" ".text.browser.webapi.CData.replaceData" ".text.browser.frame.node_factory.createTextNode" ".text.browser.webapi.Node.removeAllChildrenCollecting" @@ -1020,6 +1061,7 @@ SECTIONS { ".text.browser.webapi.Node.setTextContent" ".text.server.bidi.http_command.elementClear" ".text.browser.webapi.element.text_entry.TextEntry(browser.webapi.element.html.Input).setSelectionRange" + ".text.browser.webapi.element.text_entry.TextEntry(browser.webapi.element.html.TextArea).setSelectionRange" ".text.network.cache.Cache.ResponseHeaders.parse" ".text.sys.libcurl.errorCheck" ".text.browser.URL.getUserInfo" @@ -1030,26 +1072,24 @@ SECTIONS { ".text.array_list.Aligned(browser.webapi.storage.Cookie,null).append" ".text.browser.webapi.storage.Cookie.Jar.dispatchChange" ".text.browser.webapi.storage.Cookie.areCookiesEqual" - ".text.log.debug__anon_164283" - ".text.meta.stringToEnum__anon_164148" - ".text.mem.endsWith__anon_164030" - ".text.Uri.Component.percentEncode__anon_164011" - ".text.Io.Writer.print__anon_479759" - ".text.fmt.parseInt__anon_163946" - ".text.mem.findScalarPos__anon_163909" - ".text.mem.span__anon_163829" + ".text.log.debug__anon_165223" + ".text.meta.stringToEnum__anon_165088" + ".text.mem.endsWith__anon_164970" + ".text.Uri.Component.percentEncode__anon_164951" + ".text.Io.Writer.print__anon_480536" + ".text.fmt.parseInt__anon_164886" + ".text.mem.findScalarPos__anon_164849" + ".text.mem.span__anon_164762" ".text.network.http.Connection.getResponseHeader" ".text.network.http.AuthChallenge.parse" ".text.network.http.Connection.getConnectHeader" ".text.network.HttpClient.removeConn" ".text.network.Network.releaseConnection" - ".text.unlikely.lightpanda.assertionFailure__anon_480642" - ".text.unlikely.lightpanda.assertionFailure__anon_480703" - ".text.log.writeValue__anon_480726" - ".text.crash_handler.report__anon_480788" - ".text.unlikely.crash_handler.crash__anon_480705" - ".text.crash_handler.report__anon_481135" - ".text.unlikely.crash_handler.crash__anon_480707" + ".text.unlikely.lightpanda.assertionFailure__anon_481419" + ".text.unlikely.lightpanda.assertionFailure__anon_481480" + ".text.log.writeValue__anon_481503" + ".text.crash_handler.report__anon_481565" + ".text.unlikely.crash_handler.crash__anon_481484" ".text.network.HttpClient.trackConn" ".text.network.HttpClient.makeRequest" ".text.network.Network.getConnection" @@ -1058,39 +1098,29 @@ SECTIONS { ".text.network.HttpClient.Transfer.dataCallback" ".text.browser.URL.getHostname" ".text.network.Network.HostContext.hash" - ".text.hash_map.HashMapUnmanaged(\[\]const u8,u64,network.Network.HostContext,80).getIndex__anon_482203" + ".text.array_list.Aligned(network.Robots.Rule,null).toOwnedSlice" ".text.network.Robots.matchPattern" ".text.network.RobotsGate.RobotsContext.dataCallback" ".text.network.RobotsGate.RobotsContext.headerCallback" - ".text.log.warn__anon_163322" + ".text.log.warn__anon_164255" ".text.browser.URL.getPathname" ".text.network.cache.Cache.evict" - ".text.log.debug__anon_163259" + ".text.log.debug__anon_164192" ".text.array_list.Aligned(network.HttpClient.Event,null).ensureTotalCapacity" - ".text.log.err__anon_163172" - ".text.fmt.allocPrintSentinel__anon_162959" + ".text.log.err__anon_164101" + ".text.fmt.allocPrintSentinel__anon_163888" ".text.network.CorsGate.CorsPreflightContext.shutdownCallback" - ".text.network.CorsGate.CorsPreflightContext.errorCallback" - ".text.network.CorsGate.CorsPreflightContext.resolve" ".text.network.CorsGate.CorsPreflightContext.headerCallback" ".text.ArenaPool.release" ".text.__zig_tag_name_ArenaPool.BucketSize" ".text.network.HttpClient.Transfer.unpark" - ".text.unlikely.lightpanda.assertionFailure__anon_484748" - ".text.unlikely.lightpanda.assertionFailure__anon_484760" - ".text.log.writeValue__anon_484781" - ".text.crash_handler.report__anon_484826" - ".text.unlikely.crash_handler.crash__anon_484762" - ".text.array_list.Aligned(u8,null).append" - ".text.network.CorsGate.isSafelistedHeader" - ".text.network.CorsGate.hasNoCorsUnsafeBytes" - ".text.sort.block.blockSwap__anon_485187" - ".text.mem.reverse__anon_485228" - ".text.log.debug__anon_162749" - ".text.log.debug__anon_162745" + ".text.unlikely.lightpanda.assertionFailure__anon_485521" + ".text.unlikely.lightpanda.assertionFailure__anon_485533" + ".text.log.writeValue__anon_485554" + ".text.crash_handler.report__anon_485599" ".text.network.CorsGate.requiresPreflight" - ".text.log.debug__anon_162739" - ".text.log.debug__anon_162721" + ".text.log.debug__anon_163668" + ".text.log.debug__anon_163650" ".text.browser.URL.isPotentiallyTrustworthy" ".text.network.HttpClient.Transfer.FetchSite.forRequest" ".text.browser.URL.isSameOrigin" @@ -1098,32 +1128,30 @@ SECTIONS { ".text.browser.URL.getPort" ".text.network.adblock.Engine.match" ".text.network.adblock.Engine.matchIn" - ".text.network.adblock.pattern.matchFrom" ".text.network.adblock.domain.matchEntry" ".text.network.adblock.Engine.matchToken" ".text.network.HttpClient.dispatchCompleted" ".text.browser.webapi.Blob.initFromBytes" - ".text.browser.webapi.event.MessageEvent.initWithTrusted" - ".text.browser.EventManagerBase.dispatchDirect__anon_486257" - ".text.log.warn__anon_486409" - ".text.network.HttpClient.Transfer.notify__anon_486202" + ".text.browser.EventManagerBase.dispatchDirect__anon_487030" + ".text.log.warn__anon_487182" + ".text.network.HttpClient.Transfer.notify__anon_486975" ".text.network.HttpClient.Transfer.failDelivery" - ".text.browser.EventManagerBase.dispatchDirect__anon_486178" - ".text.browser.EventManagerBase.dispatchDirect__anon_485811" - ".text.log.warn__anon_486943" + ".text.browser.EventManagerBase.dispatchDirect__anon_486951" + ".text.browser.EventManagerBase.dispatchDirect__anon_486584" + ".text.log.warn__anon_487716" ".text.browser.Browser.msToNextTask" ".text.Watchdog.Heartbeat.exitWait" ".text.browser.Frame.checkIdleNotifications" - ".text.unlikely.lightpanda.assertionFailure__anon_487041" - ".text.unlikely.lightpanda.assertionFailure__anon_487033" + ".text.unlikely.lightpanda.assertionFailure__anon_487814" + ".text.unlikely.lightpanda.assertionFailure__anon_487806" ".text.browser.js.Env.runMicrotasks" ".text.browser.js.Context.Entered.exit" ".text.browser.Browser.sampleJsHeap" - ".text.Notification.dispatch__anon_162370" + ".text.Notification.dispatch__anon_163299" ".text.browser.Session.queuePageDestruction" ".text.browser.Session.tearDownPage" ".text.browser.webapi.navigation.Navigation.onRemoveFrame" - ".text.Notification.dispatch__anon_487306" + ".text.Notification.dispatch__anon_488079" ".text.browser.webapi.encoding.base64.decode" ".text.network.HttpClient.Transfer.submit" ".text.network.HttpClient.Transfer.deinit" @@ -1135,25 +1163,27 @@ SECTIONS { ".text.network.HttpClient.noopShutdown" ".text.browser.Frame.frameDoneCallback" ".text.browser.Frame.frameErrorCallback" - ".text.Notification.dispatch__anon_488043" - ".text.browser.frame.node_factory.createSvgElementT__anon_488932" - ".text.browser.frame.node_factory.createSvgElementT__anon_488936" - ".text.browser.frame.node_factory.createSvgElementT__anon_488940" - ".text.browser.frame.node_factory.createSvgElementT__anon_488944" - ".text.browser.frame.node_factory.createSvgElementT__anon_488948" - ".text.browser.frame.node_factory.createSvgElementT__anon_488952" - ".text.browser.frame.node_factory.createSvgElementT__anon_488956" - ".text.browser.frame.node_factory.createSvgElementT__anon_488960" + ".text.browser.frame.node_factory.createSvgElementT__anon_489693" + ".text.browser.frame.node_factory.createSvgElementT__anon_489697" + ".text.browser.frame.node_factory.createSvgElementT__anon_489701" + ".text.browser.frame.node_factory.createSvgElementT__anon_489705" + ".text.browser.frame.node_factory.createSvgElementT__anon_489709" + ".text.browser.frame.node_factory.createSvgElementT__anon_489713" + ".text.browser.frame.node_factory.createSvgElementT__anon_489717" + ".text.browser.frame.node_factory.createSvgElementT__anon_489721" + ".text.browser.frame.node_factory.createSvgElementT__anon_489725" + ".text.browser.frame.node_factory.createSvgElementT__anon_489729" + ".text.browser.frame.node_factory.createSvgElementT__anon_489733" ".text.browser.parser.Parser.settleDocument" ".text.browser.parser.Parser._appendBeforeSiblingCallback" ".text.browser.Frame.appendNew" ".text.browser.parser.Parser._appendCallback" ".text.browser.parser.Parser.appendBasedOnParentNodeCallback" - ".text.unlikely.lightpanda.assertionFailure__anon_489014" + ".text.unlikely.lightpanda.assertionFailure__anon_489787" ".text.hash_map.HashMapUnmanaged(\*browser.webapi.Element,\[\]const u8,hash_map.AutoContext(\*browser.webapi.Element),80).put" ".text.unlikely.hash_map.HashMapUnmanaged(\*browser.webapi.Element,\[\]const u8,hash_map.AutoContext(\*browser.webapi.Element),80).grow" - ".text.log.err__anon_488626" - ".text.log.warn__anon_488813" + ".text.log.err__anon_489399" + ".text.log.warn__anon_489586" ".text.browser.parser.Parser.appendBeforeSiblingCallback" ".text.browser.parser.Parser.reparentChildrenCallback" ".text.browser.webapi.Node.removeChild" @@ -1174,136 +1204,116 @@ SECTIONS { ".text.browser.parser.Parser.appendCallback" ".text.browser.parser.Parser.getDataCallback" ".text.browser.parser.Parser.createElementCallback" - ".text.unlikely.lightpanda.assertionFailure__anon_489772" - ".text.browser.frame.node_factory.populateElementAttributes__anon_489919" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489915" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490085" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489799" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489803" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489807" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489811" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489815" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489819" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489823" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489827" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489831" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489835" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489839" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489843" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489847" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489851" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489855" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489859" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489863" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489867" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489871" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489875" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489879" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489883" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489887" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489891" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489895" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489899" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489903" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489907" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489911" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489937" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489941" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489945" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489949" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489953" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489957" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489961" - ".text.browser.frame.node_factory.createHtmlMediaElementT__anon_489965" - ".text.browser.frame.node_factory.createHtmlMediaElementT__anon_489969" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489973" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489977" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489981" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489985" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489989" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489993" - ".text.browser.frame.node_factory.createHtmlElementT__anon_489997" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490001" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490005" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490009" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490013" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490017" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490021" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490025" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490029" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490033" - ".text.browser.frame.node_factory.createHtmlElementT__anon_490037" - ".text.browser.frame.node_factory.createSvgElementT__anon_490153" - ".text.browser.frame.node_factory.createSvgElementT__anon_490157" - ".text.browser.frame.node_factory.createSvgElementT__anon_490161" - ".text.browser.frame.node_factory.createSvgElementT__anon_490165" - ".text.browser.frame.node_factory.createSvgElementT__anon_490169" - ".text.browser.frame.node_factory.createSvgElementT__anon_490173" - ".text.browser.frame.node_factory.createSvgElementT__anon_490177" - ".text.browser.frame.node_factory.createSvgElementT__anon_490181" - ".text.browser.frame.node_factory.createSvgElementT__anon_490185" - ".text.browser.frame.node_factory.createSvgElementT__anon_490189" - ".text.browser.frame.node_factory.createSvgElementT__anon_490193" - ".text.browser.frame.node_factory.createSvgElementT__anon_490197" - ".text.browser.frame.node_factory.createSvgElementT__anon_490201" - ".text.browser.frame.node_factory.createSvgElementT__anon_490205" - ".text.browser.frame.node_factory.createSvgElementT__anon_490209" + ".text.unlikely.lightpanda.assertionFailure__anon_490545" + ".text.browser.frame.node_factory.populateElementAttributes__anon_490692" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490688" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490858" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490572" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490576" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490580" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490584" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490588" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490592" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490596" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490600" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490604" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490608" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490612" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490616" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490620" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490624" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490628" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490632" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490636" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490640" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490644" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490648" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490652" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490656" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490660" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490664" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490668" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490672" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490676" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490680" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490684" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490710" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490714" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490718" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490722" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490726" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490730" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490734" + ".text.browser.frame.node_factory.createHtmlMediaElementT__anon_490738" + ".text.browser.frame.node_factory.createHtmlMediaElementT__anon_490742" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490746" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490750" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490754" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490758" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490762" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490766" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490770" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490774" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490778" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490782" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490786" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490790" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490794" + ".text.browser.frame.node_factory.createHtmlElementT__anon_490798" + ".text.browser.frame.node_factory.createSvgElementT__anon_490974" + ".text.browser.frame.node_factory.createSvgElementT__anon_490978" + ".text.browser.frame.node_factory.createSvgElementT__anon_490982" ".text.browser.parser.Parser._createElementCallback" ".text.browser.parser.Parser._createElementCallbackWithDefaultnamespace" ".text.browser.frame.preload.Prescan.callback" - ".text.fmt.allocPrint__anon_489790" + ".text.fmt.allocPrint__anon_490563" ".text.browser.Frame.frameDataCallback" ".text.browser.Mime.sniff" ".text.browser.Mime.findAttrValue" ".text.browser.Frame.frameHeaderDoneCallback" - ".text.Notification.dispatch__anon_490653" - ".text.log.err__anon_490650" - ".text.log.err__anon_490639" - ".text.browser.Frame.sanitizeFilename" ".text.network.http.Header.param" ".text.ascii.findIgnoreCasePos" ".text.browser.URL.isCompleteHTTPUrl" ".text.browser.webapi.event.PageTransitionEvent.initWithTrusted" ".text.browser.Frame.documentIsComplete" - ".text.log.err__anon_491282" - ".text.log.warn__anon_491411" - ".text.log.warn__anon_491432" - ".text.log.err__anon_491404" - ".text.log.err__anon_491397" - ".text.log.warn__anon_491549" + ".text.log.err__anon_492055" + ".text.log.warn__anon_492184" + ".text.log.warn__anon_492205" + ".text.log.err__anon_492177" + ".text.log.err__anon_492170" + ".text.log.warn__anon_492322" ".text.browser.Frame._documentIsLoaded" - ".text.log.err__anon_491599" - ".text.log.warn__anon_161770" - ".text.log.warn__anon_491798" - ".text.log.warn__anon_491829" - ".text.fmt.allocPrint__anon_161360" - ".text.unlikely.lightpanda.assertionFailure__anon_492117" - ".text.Notification.dispatch__anon_161310" - ".text.crash_handler.report__anon_492137" - ".text.unlikely.crash_handler.crash__anon_492119" - ".text.Notification.dispatch__anon_161293" + ".text.log.err__anon_492372" + ".text.log.warn__anon_162699" + ".text.log.warn__anon_492571" + ".text.log.warn__anon_492602" + ".text.fmt.allocPrint__anon_162289" + ".text.unlikely.lightpanda.assertionFailure__anon_492890" + ".text.Notification.dispatch__anon_162239" + ".text.crash_handler.report__anon_492910" + ".text.unlikely.crash_handler.crash__anon_492892" + ".text.Notification.dispatch__anon_162222" ".text.browser.webapi.Document._injectBlank" ".text.browser.parser.Parser.parse" ".text.browser.parser.Parser.init" ".text.browser.Frame.isSecureContext" ".text.browser.js.Context.localScope" - ".text.fmt.allocPrint__anon_161084" - ".text.unlikely.lightpanda.assertionFailure__anon_492441" + ".text.fmt.allocPrint__anon_162022" + ".text.unlikely.lightpanda.assertionFailure__anon_493214" ".text.browser.webapi.Blob.urlBelongsToOrigin" - ".text.crash_handler.report__anon_492483" - ".text.unlikely.crash_handler.crash__anon_492448" - ".text.unlikely.lightpanda.assertionFailure__anon_161001" - ".text.browser.Frame.init__struct_160868.runIdleTasks" - ".text.unlikely.lightpanda.assertionFailure__anon_160859" + ".text.crash_handler.report__anon_493256" + ".text.unlikely.crash_handler.crash__anon_493221" + ".text.unlikely.lightpanda.assertionFailure__anon_161939" + ".text.browser.Frame.init__struct_161806.runIdleTasks" + ".text.unlikely.lightpanda.assertionFailure__anon_161797" ".text.browser.js.Env.destroyContext" ".text.browser.webapi.URL.releaseRef" ".text.browser.js.Context.deinit" - ".text.unlikely.lightpanda.assertionFailure__anon_492700" - ".text.unlikely.lightpanda.assertionFailure__anon_492642" - ".text.crash_handler.report__anon_492738" - ".text.unlikely.crash_handler.crash__anon_492710" - ".text.crash_handler.report__anon_492767" - ".text.unlikely.crash_handler.crash__anon_492712" + ".text.unlikely.lightpanda.assertionFailure__anon_493473" + ".text.unlikely.lightpanda.assertionFailure__anon_493415" + ".text.crash_handler.report__anon_493511" + ".text.crash_handler.report__anon_493540" + ".text.unlikely.crash_handler.crash__anon_493485" ".text.browser.webapi.storage.idb.Manager.detachContext" ".text.browser.webapi.storage.idb.Engine.releaseGate" ".text.browser.ScriptManager.deinit" @@ -1311,49 +1321,47 @@ SECTIONS { ".text.browser.Page.releaseOrigin" ".text.hash_map.HashMapUnmanaged(\[\]const u8,\*browser.js.Origin,hash_map.StringContext,80).remove" ".text.id.uuidv4" - ".text.browser.js.Env.hideServiceWorker__anon_156952" + ".text.browser.js.Env.hideServiceWorker__anon_157891" ".text.browser.ScriptManager.tailHook" ".text.browser.Frame.deinit" ".text.browser.webapi.DedicatedWorkerGlobalScope.deinit" ".text.browser.webapi.AbstractRange.releaseRef" - ".text.unlikely.lightpanda.assertionFailure__anon_493663" - ".text.crash_handler.report__anon_493701" - ".text.unlikely.crash_handler.crash__anon_493675" - ".text.browser.Page.findFrameBy__anon_493679" - ".text.unlikely.lightpanda.assertionFailure__anon_493628" - ".text.crash_handler.report__anon_493745" - ".text.unlikely.crash_handler.crash__anon_493709" + ".text.unlikely.lightpanda.assertionFailure__anon_494436" + ".text.crash_handler.report__anon_494474" + ".text.unlikely.crash_handler.crash__anon_494448" + ".text.browser.Page.findFrameBy__anon_494452" + ".text.unlikely.lightpanda.assertionFailure__anon_494401" + ".text.crash_handler.report__anon_494518" + ".text.unlikely.crash_handler.crash__anon_494482" ".text.slab.SlabAllocator.free" ".text.slab.SlabAllocator.alloc" - ".text.mem.Allocator.realloc__anon_493835" - ".text.array_hash_map.Custom(slab.SlabKey,slab.Slab,slab.SlabAllocator__struct_154966,false).getIndexAdapted__anon_494004" - ".text.unlikely.lightpanda.assertionFailure__anon_155617" + ".text.mem.Allocator.realloc__anon_494608" + ".text.array_hash_map.Custom(slab.SlabKey,slab.Slab,slab.SlabAllocator__struct_155915,false).getIndexAdapted__anon_494777" + ".text.unlikely.lightpanda.assertionFailure__anon_156566" ".text.script.Runtime.failAllPending" ".text.agent.Agent.ScriptOutput.observe" ".text.script.Runtime.consoleCallback" - ".text.crypto.Certificate.rsa.PKCS1v1_5Signature.concatVerify__anon_520909" + ".text.crypto.Certificate.rsa.PKCS1v1_5Signature.concatVerify__anon_521682" ".text.crypto.Sha1.round" - ".text.crypto.Certificate.rsa.encrypt__anon_520925" + ".text.crypto.Certificate.rsa.encrypt__anon_521698" ".text.crypto.ff.Modulus(4096).powPublic" ".text.script.Schema.all" - ".text.unlikely.debug.panic__anon_883219" - ".text.unlikely.debug.panicExtra__anon_883252" + ".text.unlikely.debug.panic__anon_883991" + ".text.unlikely.debug.panicExtra__anon_884024" ".text.array_list.Aligned(\[\]const u8,null).ensureTotalCapacityPrecise" - ".text.unlikely.debug.panic__anon_883119" - ".text.unlikely.debug.panicExtra__anon_883622" - ".text.json.static.parseFromSliceLeaky__anon_494798" + ".text.unlikely.debug.panic__anon_883891" + ".text.unlikely.debug.panicExtra__anon_884394" + ".text.json.static.parseFromSliceLeaky__anon_495571" ".text.script.Runtime.argJson" ".text.script.Runtime.extractSchemaString" ".text.script.Runtime.normalizeExtractSchemaString" - ".text.agent.Terminal.printToolOutcome" ".text.agent.Spinner.cancel" ".text.agent.Terminal.reindentJson" ".text.agent.Spinner.setTool" ".text.agent.Spinner.ensureWorkerLocked" - ".text.Thread.PosixThreadImpl.spawn__anon_885806.Instance.entryFn" + ".text.Thread.PosixThreadImpl.spawn__anon_886578.Instance.entryFn" ".text.lightpanda.timedWait" ".text.agent.Agent.requireLlm" - ".text.agent.prompt_assist.addPartialKeyCompletions" ".text.agent.prompt_assist.addValueCompletions" ".text.agent.prompt_assist.addPrefixedCompletion" ".text.ToolSession.deinit" @@ -1363,9 +1371,9 @@ SECTIONS { ".text.network.SingleFlight.deinit" ".text.browser.Browser.prepareForTeardown" ".text.array_list.Aligned(\*Notification.Listener,null).append" - ".text.unlikely.lightpanda.assertionFailure__anon_151660" - ".text.crash_handler.report__anon_921418" - ".text.unlikely.crash_handler.crash__anon_921391" + ".text.unlikely.lightpanda.assertionFailure__anon_152611" + ".text.crash_handler.report__anon_922190" + ".text.unlikely.crash_handler.crash__anon_922163" ".text.hash_map.HashMapUnmanaged(usize,array_list.Aligned(\*Notification.Listener,null),hash_map.AutoContext(usize),80).getOrPut" ".text.browser.Session.onConsoleMessage" ".text.unlikely.hash_map.HashMapUnmanaged(usize,array_list.Aligned(\*Notification.Listener,null),hash_map.AutoContext(usize),80).grow" @@ -1386,82 +1394,87 @@ SECTIONS { ".text.browser.js.Context.importMetaResolveCallback" ".text.browser.js.Caller.init" ".text.browser.js.Env.oomCallback" - ".text.crash_handler.report__anon_922630" - ".text.browser.js.Local.newCallback__anon_922783__struct_922873.wrap" - ".text.browser.js.Local.jsValueToZig__anon_923019" + ".text.crash_handler.report__anon_923402" + ".text.unlikely.crash_handler.crash__anon_923340" + ".text.browser.js.Local.newCallback__anon_923555__struct_923645.wrap" + ".text.browser.js.Local.jsValueToZig__anon_923791" ".text.browser.webapi.KeyValueList.getAll" ".text.browser.webapi.net.Headers.get" ".text.browser.webapi.net.Response.package" - ".text.browser.js.Local.resolvePromise__anon_923427" + ".text.browser.js.Local.resolvePromise__anon_924199" ".text.browser.webapi.streams.ReadableStreamDefaultReader.read" ".text.browser.webapi.net.Response.StreamConsumer.pumpRead" ".text.browser.webapi.net.Response.consumeAs" - ".text.browser.js.Local.newCallback__anon_923475" - ".text.browser.js.Local.newCallback__anon_923475__struct_923481.wrap" + ".text.browser.js.Local.newCallback__anon_924247" + ".text.browser.js.Local.newCallback__anon_924247__struct_924253.wrap" ".text.browser.webapi.net.Response.StreamConsumer.finish" - ".text.browser.js.Local.jsValueToArrayBufferSlice__anon_923583" - ".text.browser.js.Local.jsValueToZig__anon_923561" - ".text.browser.js.Local.newCallback__anon_923461__struct_923838.wrap" - ".text.browser.js.Local.newCallback__anon_923456__struct_923843.wrap" - ".text.browser.js.Object.set__anon_923997" - ".text.browser.js.Object.set__anon_924087" - ".text.browser.js.Local.zigValueToJs__anon_924063" - ".text.browser.js.PromiseResolver._resolve__anon_923969" - ".text.browser.js.js.simpleZigValueToJs__anon_924081" - ".text.browser.js.Function.call__anon_924263" + ".text.browser.js.Local.jsValueToArrayBufferSlice__anon_924355" + ".text.browser.js.Local.jsValueToZig__anon_924333" + ".text.browser.js.Local.newCallback__anon_924233__struct_924610.wrap" + ".text.browser.js.Local.newCallback__anon_924228__struct_924615.wrap" + ".text.browser.js.Object.set__anon_924769" + ".text.browser.js.Object.set__anon_924859" + ".text.browser.js.Local.zigValueToJs__anon_924835" + ".text.browser.js.PromiseResolver._resolve__anon_924741" + ".text.browser.js.js.simpleZigValueToJs__anon_924853" + ".text.browser.js.Function.call__anon_925035" ".text.browser.webapi.net.body_init.parseFormData" ".text.network.header_parser.Header.parse" - ".text.browser.js.Local.mapZigInstanceToJs__anon_924831" - ".text.zig.ZonGen.addErrorInner__anon_939527" + ".text.browser.js.Local.mapZigInstanceToJs__anon_925603" + ".text.browser.js.Local.resolveT__anon_925703.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_925712.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_925712.Wrap.releaseRef" + ".text.zig.ZonGen.addErrorInner__anon_940299" ".text.array_list.Aligned(u32,null).appendSlice" ".text.array_list.Aligned(u32,null).ensureUnusedCapacity" ".text.array_list.Aligned(u32,null).ensureTotalCapacity" - ".text.zig.ZonGen.addErrorTokNotes__anon_937000" - ".text.zig.ZonGen.errNoteTok__anon_936996" - ".text.zig.ZonGen.addErrorNode__anon_936981" - ".text.zig.ZonGen.addErrorNode__anon_936976" - ".text.zig.ZonGen.addErrorTok__anon_936971" - ".text.zig.ZonGen.addErrorNode__anon_936961" - ".text.zig.ZonGen.addErrorNode__anon_936956" + ".text.zig.ZonGen.addErrorTokNotes__anon_937772" + ".text.zig.ZonGen.errNoteTok__anon_937768" + ".text.zig.ZonGen.addErrorNode__anon_937753" + ".text.zig.ZonGen.addErrorNode__anon_937748" + ".text.zig.ZonGen.addErrorTok__anon_937743" + ".text.zig.ZonGen.addErrorNode__anon_937733" + ".text.zig.ZonGen.addErrorNode__anon_937728" + ".text.hash_map.HashMapUnmanaged(u32,void,hash_map.StringIndexContext,80).deinit" ".text.cookies.saveToFile" ".text.mcp.protocol.JsonEscapingWriter.drain" - ".text.json.Stringify.write__anon_948500" + ".text.json.Stringify.write__anon_949272" ".text.mcp.Server.closeSession" - ".text.hash_map.HashMapUnmanaged(\[\]const u8,\*ToolSession,hash_map.StringContext,80).getIndex__anon_948600" + ".text.hash_map.HashMapUnmanaged(\[\]const u8,\*ToolSession,hash_map.StringContext,80).getIndex__anon_949372" ".text.server.Server.shutdown" ".text.unlikely.hash_map.HashMapUnmanaged(\[\]const u8,\*ToolSession,hash_map.StringContext,80).grow" - ".text.log.fatal__anon_141964" - ".text.Thread.PosixThreadImpl.spawn__anon_950294.Instance.entryFn" + ".text.log.fatal__anon_142916" + ".text.Thread.PosixThreadImpl.spawn__anon_951066.Instance.entryFn" ".text.http.Server.Request.respond" ".text.mcp.HttpServer.deinit" - ".text.Sighandler.on__anon_141867.TypeErased.start" - ".text.log.writeThunk__anon_951245__struct_951246.write" - ".text.Thread.PosixThreadImpl.spawn__anon_951415.Instance.entryFn" + ".text.Sighandler.on__anon_142819.TypeErased.start" + ".text.log.writeThunk__anon_952017__struct_952018.write" + ".text.Thread.PosixThreadImpl.spawn__anon_952187.Instance.entryFn" ".text.lightpanda.dumpContent" - ".text.Sighandler.on__anon_141678.TypeErased.start" + ".text.Sighandler.on__anon_142630.TypeErased.start" ".text.main.FetchTerminator.releaseBrowser" - ".text.log.fatal__anon_141612" - ".text.log.debug__anon_141589" + ".text.log.fatal__anon_142564" + ".text.log.debug__anon_142541" ".text.server.Server.run" ".text.server.Server.deinit" ".text.server.Server.runOnce" ".text.server.Server.quitSession" ".text.server.Server.push" - ".text.hash_map.HashMapUnmanaged(\[36\]u8,\*server.Server.Worker,hash_map.AutoContext(\[36\]u8),80).getIndex__anon_953066" + ".text.hash_map.HashMapUnmanaged(\[36\]u8,\*server.Server.Worker,hash_map.AutoContext(\[36\]u8),80).getIndex__anon_953838" ".text.server.http.Connection.Pool.release" ".text.server.http.Connection.Buffer.reset" - ".text.mem.Allocator.realloc__anon_953534" + ".text.mem.Allocator.realloc__anon_954306" ".text.server.Link.handleMessage" - ".text.unlikely.lightpanda.assertionFailure__anon_953699" - ".text.crash_handler.report__anon_953801" - ".text.unlikely.crash_handler.crash__anon_953770" - ".text.unlikely.lightpanda.assertionFailure__anon_953582" + ".text.unlikely.lightpanda.assertionFailure__anon_954471" + ".text.crash_handler.report__anon_954573" + ".text.unlikely.crash_handler.crash__anon_954542" + ".text.unlikely.lightpanda.assertionFailure__anon_954354" ".text.server.Server.releaseWorkerSlot" - ".text.unlikely.lightpanda.assertionFailure__anon_954391" + ".text.unlikely.lightpanda.assertionFailure__anon_955163" ".text.server.http.resumeParked" - ".text.unlikely.lightpanda.assertionFailure__anon_954634" + ".text.unlikely.lightpanda.assertionFailure__anon_955406" ".text.server.Server.monitorLink" - ".text.unlikely.lightpanda.assertionFailure__anon_954700" + ".text.unlikely.lightpanda.assertionFailure__anon_955472" ".text.server.http.serveHTTPResponse" ".text.server.http.serveHTTP" ".text.server.Server.spawnWorker" @@ -1469,35 +1482,34 @@ SECTIONS { ".text.server.http.upgrade" ".text.server.Link.init" ".text.server.Server.attachConnection" - ".text.unlikely.lightpanda.assertionFailure__anon_956749" - ".text.unlikely.lightpanda.assertionFailure__anon_956711" + ".text.unlikely.lightpanda.assertionFailure__anon_957521" + ".text.unlikely.lightpanda.assertionFailure__anon_957483" ".text.server.Server.upgradeConnection" - ".text.log.warn__anon_956448" - ".text.log.warn__anon_956439" - ".text.Thread.PosixThreadImpl.spawn__anon_957100.Instance.entryFn" - ".text.server.bidi.browsing_context.onFrameNavigateFailed" + ".text.log.warn__anon_957220" + ".text.log.warn__anon_957211" + ".text.Thread.PosixThreadImpl.spawn__anon_957872.Instance.entryFn" ".text.server.bidi.browsing_context.onFrameNavigate" ".text.server.bidi.browsing_context.onFrameDestroyed" ".text.server.bidi.browsing_context.onFrameCreated" ".text.server.bidi.browsing_context.onFrameRemove" ".text.server.bidi.browsing_context.onFrameLoaded" ".text.server.Server.Worker.run" - ".text.log.err__anon_957767" - ".text.unlikely.lightpanda.assertionFailure__anon_956120" + ".text.log.err__anon_958539" + ".text.unlikely.lightpanda.assertionFailure__anon_956892" ".text.hash_map.HashMapUnmanaged(\[36\]u8,\*server.Server.Worker,hash_map.AutoContext(\[36\]u8),80).putAssumeCapacityNoClobberContext" - ".text.json.static.innerParse__anon_958142" + ".text.json.static.innerParse__anon_958914" ".text.server.http.disconnect" - ".text.unlikely.lightpanda.assertionFailure__anon_952820" + ".text.unlikely.lightpanda.assertionFailure__anon_953592" ".text.array_list.Aligned(Sighandler.Listener,null).append" - ".text.Sighandler.on__anon_141520.TypeErased.start" - ".text.log.fatal__anon_141480" - ".text.log.fatal__anon_141473" + ".text.Sighandler.on__anon_142472.TypeErased.start" + ".text.log.fatal__anon_142432" + ".text.log.fatal__anon_142425" ".text.hash_map.HashMapUnmanaged(\[36\]u8,\*server.Server.Worker,hash_map.AutoContext(\[36\]u8),80).deinit" ".text.unlikely.hash_map.HashMapUnmanaged(\[36\]u8,\*server.Server.Worker,hash_map.AutoContext(\[36\]u8),80).grow" ".text.server.http.Connection.Pool.deinit" - ".text.unlikely.lightpanda.assertionFailure__anon_963443" - ".text.crash_handler.report__anon_963473" - ".text.unlikely.crash_handler.crash__anon_963449" + ".text.unlikely.lightpanda.assertionFailure__anon_964215" + ".text.crash_handler.report__anon_964245" + ".text.unlikely.crash_handler.crash__anon_964221" ".text.sys.net.errnoError" ".text.server.Server.EPoll.deinit" ".text.App.deinit" @@ -1505,18 +1517,17 @@ SECTIONS { ".text.Metrics.write" ".text.Io.net.Ip6Address.Unresolved.parse" ".text.telemetry.telemetry.TelemetryT(telemetry.lightpanda).record" - ".text.Thread.PosixThreadImpl.spawn__anon_978207.Instance.entryFn" + ".text.Thread.PosixThreadImpl.spawn__anon_978979.Instance.entryFn" ".text.telemetry.lightpanda.writeEvent" ".text.telemetry.lightpanda.flush" - ".text.log.warn__anon_978376" + ".text.log.warn__anon_979148" ".text.network.Network.deinit" - ".text.log.warn__anon_978941" + ".text.log.warn__anon_979713" ".text.App.getAppDataDir" ".text.Watchdog.deinit" - ".text.log.warn__anon_979171" - ".text.storage.sqlite.Sqlite.Conn.exec__anon_979409" + ".text.log.warn__anon_979943" + ".text.storage.sqlite.Sqlite.Conn.exec__anon_980181" ".text.network.cache.SqliteCache.maintenance" - ".text.array_list.Aligned(network.adblock.HostnameTrie.Cell,null).append" ".text.network.adblock.HostnameTrie.addLeafCell" ".text.unlikely.hash_map.HashMapUnmanaged(u64,void,hash_map.AutoContext(u64),80).grow" ".text.heap.ArenaAllocator.reset" @@ -1531,34 +1542,25 @@ SECTIONS { ".text.array_list.Aligned(network.IpFilter.CidrV6,null).toOwnedSlice" ".text.array_list.Aligned(network.IpFilter.CidrV4,null).toOwnedSlice" ".text.array_list.Aligned(network.IpFilter.CidrV4,null).append" - ".text.unlikely.lightpanda.assertionFailure__anon_137310" - ".text.Thread.PosixThreadImpl.spawn__anon_982825.Instance.entryFn" + ".text.unlikely.lightpanda.assertionFailure__anon_138263" + ".text.Thread.PosixThreadImpl.spawn__anon_983597.Instance.entryFn" ".text.Regex.Context.deinit" ".text.browser.js.Platform.deinit" - ".text.browser.js.bridge.Accessor.init__struct_136927.wrap" + ".text.browser.js.bridge.Accessor.init__struct_137882.wrap" ".text.browser.js.bridge.unknownWindowPropertyCallback" ".text.browser.js.Snapshot.illegalConstructorCallback" - ".text.browser.js.bridge.Accessor.init__struct_136908.wrap" - ".text.browser.js.bridge.Accessor.init__struct_136889.wrap" - ".text.browser.js.bridge.Accessor.init__struct_136866.wrap" - ".text.browser.js.bridge.Function.init__struct_136277.wrap" - ".text.browser.js.bridge.Function.init__struct_136228.wrap" - ".text.browser.js.Local.jsValueToZig__anon_985135" - ".text.browser.js.Local.jsValueToZig__anon_985030" - ".text.browser.js.Local.jsValueToZig__anon_985404" - ".text.browser.js.Local.jsValueToZig__anon_985446" - ".text.browser.js.Local.jsValueToZig__anon_985516" - ".text.browser.js.Local.jsValueToZig__anon_985635" - ".text.browser.js.Local.jsValueToZig__anon_985676" - ".text.browser.js.Local.jsValueToZig__anon_985340" - ".text.browser.js.Local.jsValueToZig__anon_985886" - ".text.browser.js.Local.jsValueToTypedArray__anon_986002" - ".text.browser.js.Local.jsValueToZig__anon_985959" + ".text.browser.js.bridge.Accessor.init__struct_137863.wrap" + ".text.browser.js.bridge.Accessor.init__struct_137844.wrap" + ".text.browser.js.bridge.Accessor.init__struct_137821.wrap" + ".text.browser.js.bridge.Function.init__struct_137232.wrap" + ".text.browser.js.bridge.Function.init__struct_137183.wrap" + ".text.browser.js.Local.jsValueToZig__anon_985907" + ".text.browser.js.Local.jsValueToZig__anon_985802" ".text.browser.webapi.net.Headers.validateAndNormalize" ".text.browser.webapi.net.Headers.checkGuard" ".text.browser.webapi.net.Headers.initGuarded" - ".text.browser.webapi.KeyValueList.urlEncodeValue__anon_986556" - ".text.browser.webapi.KeyValueList.urlEncodeEntry__anon_986552" + ".text.browser.webapi.KeyValueList.urlEncodeValue__anon_987328" + ".text.browser.webapi.KeyValueList.urlEncodeEntry__anon_987324" ".text.browser.webapi.net.URLSearchParams.toString" ".text.browser.js.Value.toStringSmart" ".text.browser.webapi.streams.ReadableStream.collectBodyBytes" @@ -1570,120 +1572,124 @@ SECTIONS { ".text.browser.webapi.net.Response.initWithArena" ".text.browser.webapi.net.Fetch.submit" ".text.browser.webapi.net.Fetch.init" - ".text.browser.webapi.net.Fetch.httpShutdownCallback" ".text.browser.webapi.net.Fetch.httpErrorCallback" - ".text.browser.js.Local.mapZigInstanceToJs__anon_987107" + ".text.browser.js.Local.mapZigInstanceToJs__anon_987879" ".text.browser.webapi.net.Fetch.httpDoneCallback" - ".text.browser.js.Local.resolveT__anon_987191.Wrap.releaseRefFromZig" - ".text.browser.js.Local.resolveT__anon_987191.Wrap.releaseRef" - ".text.unlikely.lightpanda.assertionFailure__anon_987251" - ".text.crash_handler.report__anon_987274" - ".text.unlikely.crash_handler.crash__anon_987253" + ".text.browser.js.Local.resolveT__anon_987963.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_987963.Wrap.releaseRef" + ".text.unlikely.lightpanda.assertionFailure__anon_988023" + ".text.crash_handler.report__anon_988046" + ".text.unlikely.crash_handler.crash__anon_988025" ".text.browser.webapi.net.Fetch.httpDataCallback" ".text.browser.webapi.net.Fetch.httpHeaderDoneCallback" ".text.browser.webapi.net.Response.deinit" - ".text.browser.js.PromiseResolver.rejectError__anon_986748" + ".text.browser.js.PromiseResolver.rejectError__anon_987520" ".text.browser.webapi.net.Request.releaseRef" - ".text.unlikely.lightpanda.assertionFailure__anon_987924" - ".text.crash_handler.report__anon_987969" - ".text.unlikely.crash_handler.crash__anon_987928" - ".text.mem.sliceTo__anon_988185" + ".text.unlikely.lightpanda.assertionFailure__anon_988696" + ".text.crash_handler.report__anon_988741" + ".text.unlikely.crash_handler.crash__anon_988700" + ".text.mem.sliceTo__anon_988957" ".text.browser.webapi.net.Headers.hasCorsUnsafeByte" ".text.array_list.Aligned(browser.webapi.KeyValueList.Entry,null).ensureTotalCapacityPrecise" - ".text.browser.js.bridge.Function.init__struct_136159.wrap" - ".text.browser.js.bridge.Function.init__struct_136124.wrap" + ".text.browser.js.bridge.Function.init__struct_137114.wrap" + ".text.browser.js.bridge.Function.init__struct_137079.wrap" ".text.browser.js.Value.serialize" ".text.browser.js.Value.deserialize" - ".text.browser.js.Local.jsValueToZig__anon_989728" - ".text.browser.js.bridge.Accessor.init__struct_135818.wrap" - ".text.browser.js.bridge.Accessor.init__struct_135798.wrap" - ".text.browser.js.bridge.Accessor.init__struct_135788.wrap" - ".text.browser.js.bridge.Function.init__struct_135733.wrap" - ".text.browser.js.Local.zigValueToJs__anon_991523" - ".text.browser.js.Local.newCallback__anon_991618__struct_991633.wrap" - ".text.browser.js.bridge.Constructor.init__struct_135690.wrap" - ".text.browser.js.bridge.Accessor.init__struct_135559.wrap" - ".text.browser.js.Local.jsValueToZig__anon_991754" - ".text.browser.js.bridge.Accessor.init__struct_133122.wrap" - ".text.browser.js.bridge.Accessor.init__struct_133104.wrap" - ".text.browser.js.bridge.Constructor.init__struct_133033.wrap" - ".text.browser.js.Value.toSSO__anon_1008359" - ".text.browser.js.Local.jsValueToZig__anon_1008259" + ".text.browser.js.Local.jsValueToZig__anon_990500" + ".text.browser.js.bridge.Accessor.init__struct_136773.wrap" + ".text.browser.js.bridge.Accessor.init__struct_136753.wrap" + ".text.browser.js.bridge.Accessor.init__struct_136743.wrap" + ".text.browser.js.bridge.Function.init__struct_136688.wrap" + ".text.browser.js.Local.zigValueToJs__anon_992295" + ".text.browser.js.Local.newCallback__anon_992390__struct_992405.wrap" + ".text.browser.js.bridge.Constructor.init__struct_136645.wrap" + ".text.browser.js.bridge.Accessor.init__struct_136514.wrap" + ".text.browser.js.Local.jsValueToZig__anon_992526" + ".text.browser.js.bridge.Accessor.init__struct_134286.wrap" + ".text.browser.js.bridge.Accessor.init__struct_134064.wrap" + ".text.browser.js.bridge.Accessor.init__struct_134050.wrap" + ".text.browser.js.bridge.Accessor.init__struct_134032.wrap" + ".text.browser.js.bridge.Constructor.init__struct_133961.wrap" + ".text.browser.js.Value.toSSO__anon_1009193" + ".text.browser.js.Local.jsValueToZig__anon_1009093" ".text.browser.webapi.ImageData.init" - ".text.browser.js.bridge.Function.init__struct_132964.wrap" - ".text.browser.js.bridge.Accessor.init__struct_129727.wrap" - ".text.browser.js.bridge.Accessor.init__struct_129722.wrap" - ".text.browser.js.Caller.getArgs__anon_1021920" - ".text.browser.js.bridge.Accessor.init__struct_129705.wrap" - ".text.browser.js.bridge.Accessor.init__struct_129693.wrap" - ".text.browser.js.bridge.Constructor.init__struct_129665.wrap" - ".text.browser.js.bridge.Function.init__struct_129467.wrap" - ".text.browser.js.bridge.Function.init__struct_125198.wrap" - ".text.browser.js.Local.mapZigInstanceToJs__anon_1029231" + ".text.browser.js.bridge.Function.init__struct_130701.wrap" + ".text.browser.js.Local.resolvePromise__anon_1022564" + ".text.browser.js.bridge.Accessor.init__struct_130655.wrap" + ".text.browser.js.bridge.Accessor.init__struct_130650.wrap" + ".text.browser.js.Caller.getArgs__anon_1022753" + ".text.browser.js.bridge.Accessor.init__struct_130633.wrap" + ".text.browser.js.bridge.Accessor.init__struct_130621.wrap" + ".text.browser.js.bridge.Constructor.init__struct_130593.wrap" + ".text.browser.js.bridge.Function.init__struct_126099.wrap" + ".text.browser.js.bridge.Function.init__struct_126064.wrap" ".text.browser.webapi.event.ProgressEvent.initWithTrusted" - ".text.browser.webapi.FileReader.dispatch__anon_1029427" - ".text.browser.js.Local.resolveT__anon_1029464.Wrap.releaseRefFromZig" - ".text.browser.js.Local.resolveT__anon_1029464.Wrap.releaseRef" - ".text.browser.EventManagerBase.dispatchDirect__anon_1029459" - ".text.browser.js.bridge.Function.init__struct_122082.wrap" - ".text.browser.js.bridge.Constructor.init__struct_121991.wrap" - ".text.browser.js.bridge.Function.init__struct_121917.wrap" - ".text.browser.js.Local.zigValueToJs__anon_1035955" - ".text.browser.js.bridge.Iterator.init__struct_121856.wrap" - ".text.browser.js.bridge.Function.init__struct_118204.wrap" - ".text.browser.js.bridge.Function.init__struct_118137.wrap" - ".text.browser.js.bridge.Function.init__struct_118104.wrap" - ".text.browser.js.bridge.Function.init__struct_118070.wrap" - ".text.browser.js.bridge.Function.init__struct_117996.wrap" - ".text.browser.js.bridge.Function.init__struct_117961.wrap" - ".text.browser.js.bridge.Accessor.init__struct_117914.wrap" - ".text.browser.js.bridge.Accessor.init__struct_117909.wrap" - ".text.browser.js.bridge.Accessor.init__struct_117885.wrap" - ".text.browser.js.Local.jsValueToZig__anon_1041559" - ".text.browser.js.bridge.Accessor.init__struct_117880.wrap" - ".text.browser.js.bridge.Accessor.init__struct_117028.wrap" - ".text.browser.js.bridge.Accessor.init__struct_117023.wrap" - ".text.browser.js.bridge.Accessor.init__struct_116998.wrap" - ".text.browser.js.bridge.Accessor.init__struct_116974.wrap" - ".text.browser.js.bridge.Accessor.init__struct_116964.wrap" - ".text.browser.js.bridge.Accessor.init__struct_116934.wrap" - ".text.browser.js.bridge.Function.init__struct_116659.wrap" - ".text.browser.js.bridge.Accessor.init__struct_110254.wrap" - ".text.browser.js.bridge.Accessor.init__struct_110231.wrap" - ".text.browser.js.Local.zigValueToJs__anon_1064535" - ".text.browser.js.bridge.Function.init__struct_110190.wrap" - ".text.browser.js.Local.resolveT__anon_1064588.Wrap.releaseRefFromZig" - ".text.browser.js.Local.resolveT__anon_1064588.Wrap.releaseRef" + ".text.browser.webapi.FileReader.dispatch__anon_1030324" + ".text.browser.webapi.FileReader.readInternal" + ".text.browser.webapi.FileReader.ReadTask.cancelled" + ".text.browser.webapi.FileReader.ReadTask.deinit" + ".text.browser.webapi.FileReader.ReadTask.run" + ".text.browser.js.bridge.Function.init__struct_122966.wrap" + ".text.browser.js.bridge.Constructor.init__struct_122875.wrap" + ".text.browser.js.bridge.Function.init__struct_122801.wrap" + ".text.browser.js.Local.zigValueToJs__anon_1036850" + ".text.browser.js.bridge.Iterator.init__struct_122740.wrap" + ".text.browser.js.bridge.Function.init__struct_122714.wrap" + ".text.browser.js.bridge.Function.init__struct_119026.wrap" + ".text.browser.js.bridge.Function.init__struct_118959.wrap" + ".text.browser.js.bridge.Function.init__struct_118926.wrap" + ".text.browser.js.bridge.Function.init__struct_118892.wrap" + ".text.browser.js.bridge.Function.init__struct_118818.wrap" + ".text.browser.js.bridge.Function.init__struct_118783.wrap" + ".text.browser.js.bridge.Accessor.init__struct_118736.wrap" + ".text.browser.js.bridge.Accessor.init__struct_118731.wrap" + ".text.browser.js.bridge.Accessor.init__struct_118707.wrap" + ".text.browser.js.Local.jsValueToZig__anon_1042474" + ".text.browser.js.bridge.Accessor.init__struct_118702.wrap" + ".text.browser.js.bridge.Accessor.init__struct_117850.wrap" + ".text.browser.js.bridge.Accessor.init__struct_117845.wrap" + ".text.browser.js.bridge.Accessor.init__struct_117820.wrap" + ".text.browser.js.bridge.Accessor.init__struct_117796.wrap" + ".text.browser.js.bridge.Accessor.init__struct_117786.wrap" + ".text.browser.js.bridge.Accessor.init__struct_117756.wrap" + ".text.browser.js.bridge.Function.init__struct_117481.wrap" + ".text.browser.js.bridge.Accessor.init__struct_111077.wrap" + ".text.browser.js.bridge.Accessor.init__struct_111054.wrap" + ".text.browser.js.Local.zigValueToJs__anon_1065438" + ".text.browser.js.bridge.Function.init__struct_111015.wrap" + ".text.browser.js.Local.resolveT__anon_1065491.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_1065491.Wrap.releaseRef" ".text.browser.webapi.collections.NodeList.releaseRef" - ".text.unlikely.lightpanda.assertionFailure__anon_1064637" - ".text.crash_handler.report__anon_1064674" - ".text.unlikely.crash_handler.crash__anon_1064651" - ".text.browser.js.bridge.Accessor.init__struct_110067.wrap" - ".text.browser.js.bridge.Accessor.init__struct_110048.wrap" - ".text.browser.js.bridge.Accessor.init__struct_110037.wrap" - ".text.browser.js.bridge.Accessor.init__struct_110002.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106971.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106945.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106934.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106908.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106900.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106879.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106871.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106850.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106842.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106821.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106813.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106792.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106779.wrap" - ".text.browser.js.bridge.Function.init__struct_106718.wrap" + ".text.unlikely.lightpanda.assertionFailure__anon_1065540" + ".text.crash_handler.report__anon_1065577" + ".text.unlikely.crash_handler.crash__anon_1065554" + ".text.browser.js.bridge.Accessor.init__struct_110971.wrap" + ".text.browser.js.bridge.Accessor.init__struct_110948.wrap" + ".text.browser.js.bridge.Accessor.init__struct_110934.wrap" + ".text.browser.js.bridge.Accessor.init__struct_110920.wrap" + ".text.browser.js.bridge.Accessor.init__struct_110908.wrap" + ".text.browser.js.bridge.Accessor.init__struct_110894.wrap" + ".text.browser.js.bridge.Accessor.init__struct_110877.wrap" + ".text.browser.js.bridge.Accessor.init__struct_110866.wrap" + ".text.browser.js.bridge.Accessor.init__struct_110831.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107776.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107765.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107739.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107731.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107710.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107702.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107681.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107673.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107610.wrap" + ".text.browser.js.bridge.Function.init__struct_107549.wrap" ".text.browser.webapi.net.XMLHttpRequest.releaseSelfRef" ".text.browser.webapi.net.XMLHttpRequest.stateChanged" - ".text.browser.webapi.net.XMLHttpRequestEventTarget.dispatch__anon_1072187" + ".text.browser.webapi.net.XMLHttpRequestEventTarget.dispatch__anon_1073096" ".text.browser.webapi.net.XMLHttpRequest.handleError" - ".text.browser.EventManagerBase.dispatchDirect__anon_1072216" - ".text.log.warn__anon_1072315" - ".text.browser.EventManagerBase.dispatchDirect__anon_1072184" - ".text.browser.js.bridge.Accessor.init__struct_106512.wrap" + ".text.browser.EventManagerBase.dispatchDirect__anon_1073125" + ".text.log.warn__anon_1073224" + ".text.browser.EventManagerBase.dispatchDirect__anon_1073093" + ".text.browser.js.bridge.Accessor.init__struct_107343.wrap" ".text.browser.frame.parse.xmlDocument" ".text.browser.frame.parse.fragment" ".text.browser.webapi.net.XMLHttpRequest.getResponse" @@ -1691,126 +1697,123 @@ SECTIONS { ".text.browser.parser.Parser.createContextElementCallback" ".text.browser.parser.Parser.xmlParseErrorCallback" ".text.browser.parser.Parser.createXMLElementCallback" - ".text.browser.js.bridge.Accessor.init__struct_106486.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106467.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106431.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106417.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106399.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106380.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106369.wrap" - ".text.browser.js.bridge.Function.init__struct_106338.wrap" - ".text.browser.webapi.net.XMLHttpRequestEventTarget.dispatch__anon_1073261" - ".text.log.info__anon_1073295" - ".text.browser.EventManagerBase.dispatchDirect__anon_1073290" - ".text.log.warn__anon_1073325" + ".text.browser.js.bridge.Accessor.init__struct_107317.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107298.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107262.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107248.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107230.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107211.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107200.wrap" + ".text.browser.js.bridge.Function.init__struct_107169.wrap" + ".text.browser.webapi.net.XMLHttpRequestEventTarget.dispatch__anon_1074170" + ".text.log.info__anon_1074204" + ".text.browser.EventManagerBase.dispatchDirect__anon_1074199" + ".text.log.warn__anon_1074234" ".text.browser.webapi.net.XMLHttpRequest.httpShutdownCallback" ".text.browser.webapi.net.XMLHttpRequest.httpErrorCallback" ".text.browser.webapi.net.XMLHttpRequest.httpDoneCallback" ".text.browser.webapi.net.XMLHttpRequest.httpDataCallback" - ".text.browser.EventManagerBase.dispatchDirect__anon_1073410" - ".text.log.warn__anon_1073420" + ".text.browser.EventManagerBase.dispatchDirect__anon_1074319" + ".text.log.warn__anon_1074329" ".text.browser.webapi.net.XMLHttpRequest.httpHeaderDoneCallback" - ".text.browser.EventManagerBase.dispatchDirect__anon_1073476" - ".text.log.warn__anon_1073483" - ".text.browser.js.bridge.Function.init__struct_106295.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106254.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106178.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106146.wrap" - ".text.browser.js.bridge.Accessor.init__struct_106133.wrap" - ".text.browser.js.Local.mapZigInstanceToJs__anon_1073972" - ".text.browser.js.bridge.Constructor.init__struct_106054.wrap" - ".text.browser.js.bridge.Function.init__struct_105930.wrap" - ".text.browser.js.Object.set__anon_1074165" - ".text.browser.js.Local.zigValueToJs__anon_1074146" - ".text.browser.js.bridge.Function.init__struct_105881.wrap" - ".text.browser.js.bridge.Function.init__struct_105832.wrap" - ".text.browser.js.bridge.Accessor.init__struct_105070.wrap" - ".text.browser.js.Local.mapZigInstanceToJs__anon_1075700" - ".text.browser.js.bridge.Function.init__struct_105053.wrap" - ".text.browser.js.bridge.Function.init__struct_105025.wrap" - ".text.browser.js.bridge.Accessor.init__struct_104987.wrap" - ".text.browser.js.bridge.Accessor.init__struct_104973.wrap" - ".text.browser.js.bridge.Accessor.init__struct_104950.wrap" - ".text.browser.js.bridge.Accessor.init__struct_104932.wrap" - ".text.browser.js.bridge.Function.init__struct_104902.wrap" - ".text.browser.js.bridge.Accessor.init__struct_78444.wrap" - ".text.browser.js.bridge.Accessor.init__struct_78422.wrap" + ".text.browser.EventManagerBase.dispatchDirect__anon_1074385" + ".text.log.warn__anon_1074392" + ".text.browser.js.bridge.Function.init__struct_107126.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107085.wrap" + ".text.browser.js.bridge.Accessor.init__struct_107009.wrap" + ".text.browser.js.bridge.Accessor.init__struct_106977.wrap" + ".text.browser.js.bridge.Accessor.init__struct_106964.wrap" + ".text.browser.js.Local.mapZigInstanceToJs__anon_1074881" + ".text.browser.js.bridge.Constructor.init__struct_106885.wrap" + ".text.browser.js.bridge.Function.init__struct_106761.wrap" + ".text.browser.js.Object.set__anon_1075074" + ".text.browser.js.Local.zigValueToJs__anon_1075055" + ".text.browser.js.bridge.Function.init__struct_106712.wrap" + ".text.browser.js.bridge.Function.init__struct_106663.wrap" + ".text.browser.js.Local.mapZigInstanceToJs__anon_1076609" + ".text.browser.js.bridge.Function.init__struct_105884.wrap" + ".text.browser.js.bridge.Function.init__struct_105856.wrap" + ".text.browser.js.bridge.Accessor.init__struct_105818.wrap" + ".text.browser.js.bridge.Accessor.init__struct_105804.wrap" + ".text.browser.js.bridge.Accessor.init__struct_105781.wrap" + ".text.browser.js.bridge.Accessor.init__struct_105763.wrap" + ".text.browser.js.bridge.Function.init__struct_105733.wrap" + ".text.browser.js.bridge.Function.init__struct_105686.wrap" + ".text.browser.js.bridge.Accessor.init__struct_79253.wrap" ".text.browser.webapi.Node.setHTML" - ".text.browser.js.bridge.Accessor.init__struct_78411.wrap" - ".text.browser.js.bridge.Accessor.init__struct_56113.wrap" - ".text.browser.js.bridge.Accessor.init__struct_56080.wrap" - ".text.browser.js.bridge.Accessor.init__struct_56072.wrap" - ".text.browser.js.bridge.Accessor.init__struct_56039.wrap" - ".text.browser.js.bridge.Accessor.init__struct_56031.wrap" - ".text.browser.js.bridge.Accessor.init__struct_56003.wrap" - ".text.browser.js.bridge.Accessor.init__struct_55995.wrap" - ".text.browser.js.bridge.Function.init__struct_52440.wrap" - ".text.browser.js.bridge.Function.init__struct_52411.wrap" - ".text.browser.js.bridge.Function.init__struct_52375.wrap" - ".text.browser.js.bridge.Accessor.init__struct_52346.wrap" + ".text.browser.js.bridge.Accessor.init__struct_79242.wrap" + ".text.browser.js.bridge.Accessor.init__struct_79211.wrap" + ".text.browser.js.bridge.Accessor.init__struct_56883.wrap" + ".text.browser.js.bridge.Accessor.init__struct_56850.wrap" + ".text.browser.js.bridge.Accessor.init__struct_56842.wrap" + ".text.browser.js.bridge.Accessor.init__struct_56814.wrap" + ".text.browser.js.bridge.Function.init__struct_53255.wrap" + ".text.browser.js.bridge.Function.init__struct_53222.wrap" + ".text.browser.js.bridge.Function.init__struct_53193.wrap" + ".text.browser.js.bridge.Function.init__struct_53157.wrap" + ".text.browser.js.bridge.Accessor.init__struct_53123.wrap" + ".text.browser.js.bridge.Accessor.init__struct_53105.wrap" + ".text.browser.js.bridge.Accessor.init__struct_53091.wrap" + ".text.browser.js.bridge.Function.init__struct_52316.wrap" + ".text.browser.js.bridge.Function.init__struct_52278.wrap" + ".text.browser.js.bridge.Function.init__struct_52245.wrap" ".text.browser.webapi.Element.getAttributeNS" - ".text.browser.js.bridge.Function.init__struct_51499.wrap" - ".text.browser.js.bridge.Function.init__struct_51465.wrap" - ".text.browser.js.bridge.Function.init__struct_51434.wrap" - ".text.browser.js.bridge.Accessor.init__struct_51288.wrap" + ".text.browser.js.bridge.Accessor.init__struct_52070.wrap" + ".text.browser.js.bridge.Accessor.init__struct_52062.wrap" ".text.unlikely.hash_map.HashMapUnmanaged(usize,\*browser.webapi.element.Attribute.NamedNodeMap,hash_map.AutoContext(usize),80).grow" - ".text.browser.js.bridge.Accessor.init__struct_51260.wrap" - ".text.browser.js.bridge.Accessor.init__struct_51233.wrap" - ".text.browser.js.bridge.Accessor.init__struct_51222.wrap" - ".text.browser.js.bridge.Accessor.init__struct_51188.wrap" - ".text.browser.js.bridge.Accessor.init__struct_51180.wrap" - ".text.browser.js.bridge.Accessor.init__struct_51152.wrap" - ".text.browser.js.bridge.Accessor.init__struct_51144.wrap" - ".text.browser.js.bridge.Function.init__struct_49213.wrap" - ".text.browser.js.bridge.Function.init__struct_49173.wrap" - ".text.browser.js.bridge.Accessor.init__struct_49128.wrap" - ".text.browser.js.bridge.Function.init__struct_49100.wrap" - ".text.browser.js.bridge.Accessor.init__struct_49051.wrap" - ".text.browser.js.Local.jsValueToZig__anon_1153343" + ".text.browser.js.bridge.Accessor.init__struct_52034.wrap" + ".text.browser.js.bridge.Accessor.init__struct_51979.wrap" + ".text.browser.js.bridge.Accessor.init__struct_51968.wrap" + ".text.browser.js.bridge.Accessor.init__struct_51934.wrap" + ".text.browser.js.bridge.Accessor.init__struct_51926.wrap" + ".text.browser.js.bridge.Accessor.init__struct_51898.wrap" + ".text.browser.js.bridge.Accessor.init__struct_49984.wrap" + ".text.browser.js.bridge.Function.init__struct_49959.wrap" + ".text.browser.js.bridge.Function.init__struct_49919.wrap" + ".text.browser.js.bridge.Accessor.init__struct_49875.wrap" + ".text.browser.js.bridge.Function.init__struct_49847.wrap" + ".text.browser.js.Local.jsValueToZig__anon_1154804" + ".text.browser.js.bridge.Accessor.init__struct_49798.wrap" ".text.browser.dump.getHTML" - ".text.browser.js.bridge.Function.init__struct_38121.wrap" - ".text.browser.js.bridge.Function.init__struct_38085.wrap" - ".text.browser.js.bridge.Function.init__struct_37985.wrap" - ".text.browser.js.bridge.Function.init__struct_37947.wrap" - ".text.browser.js.bridge.Function.init__struct_37842.wrap" - ".text.browser.js.bridge.Function.init__struct_37802.wrap" - ".text.browser.js.bridge.Function.init__struct_37285.wrap" - ".text.browser.js.bridge.Function.init__struct_37249.wrap" - ".text.browser.js.bridge.Function.init__struct_37209.wrap" - ".text.browser.js.bridge.Function.init__struct_37169.wrap" - ".text.browser.js.bridge.Accessor.init__struct_37115.wrap" - ".text.browser.js.bridge.Accessor.init__struct_37104.wrap" - ".text.browser.js.bridge.Accessor.init__struct_36130.wrap" - ".text.browser.js.bridge.Accessor.init__struct_36094.wrap" - ".text.browser.js.bridge.Accessor.init__struct_36063.wrap" - ".text.browser.js.bridge.Accessor.init__struct_36055.wrap" - ".text.browser.js.bridge.Accessor.init__struct_36025.wrap" - ".text.browser.js.bridge.Indexed.init__struct_30278.wrap" - ".text.browser.js.bridge.Accessor.init__struct_30261.wrap" - ".text.browser.js.bridge.Function.init__struct_30205.wrap" - ".text.browser.js.bridge.Function.init__struct_30150.wrap" - ".text.browser.js.bridge.Function.init__struct_30094.wrap" - ".text.browser.js.Caller.Function.call__anon_1176446" - ".text.browser.js.Local.resolveT__anon_1176581.Wrap.releaseRefFromZig" - ".text.browser.js.Local.resolveT__anon_1176581.Wrap.releaseRef" - ".text.unlikely.lightpanda.assertionFailure__anon_1176627" - ".text.crash_handler.report__anon_1176660" - ".text.unlikely.crash_handler.crash__anon_1176637" - ".text.browser.js.Local.resolveT__anon_1176809.Wrap.releaseRef" - ".text.unlikely.lightpanda.assertionFailure__anon_1176855" - ".text.crash_handler.report__anon_1176899" - ".text.unlikely.crash_handler.crash__anon_1176861" - ".text.browser.js.bridge.Function.init__struct_29884.wrap" - ".text.browser.js.bridge.Function.init__struct_29850.wrap" + ".text.browser.js.bridge.Accessor.init__struct_49790.wrap" + ".text.browser.js.bridge.Function.init__struct_38843.wrap" + ".text.browser.js.bridge.Function.init__struct_38810.wrap" + ".text.browser.js.bridge.Function.init__struct_38768.wrap" + ".text.browser.js.bridge.Function.init__struct_38732.wrap" + ".text.browser.js.bridge.Function.init__struct_38626.wrap" + ".text.browser.js.bridge.Function.init__struct_38586.wrap" + ".text.browser.js.bridge.Function.init__struct_38072.wrap" + ".text.browser.js.bridge.Function.init__struct_38035.wrap" + ".text.browser.js.bridge.Function.init__struct_37995.wrap" + ".text.browser.js.bridge.Function.init__struct_37955.wrap" + ".text.browser.webapi.Document.createElementNS" + ".text.browser.js.bridge.Accessor.init__struct_37905.wrap" + ".text.browser.js.bridge.Accessor.init__struct_37604.wrap" + ".text.browser.js.bridge.Accessor.init__struct_37568.wrap" + ".text.browser.js.bridge.Accessor.init__struct_37537.wrap" + ".text.browser.js.bridge.Accessor.init__struct_37529.wrap" + ".text.browser.js.bridge.Accessor.init__struct_37500.wrap" + ".text.browser.js.bridge.Accessor.init__struct_31437.wrap" + ".text.browser.js.bridge.Function.init__struct_31382.wrap" + ".text.browser.js.bridge.Function.init__struct_31327.wrap" + ".text.browser.js.bridge.Function.init__struct_31271.wrap" + ".text.browser.js.Caller.Function.call__anon_1178388" + ".text.browser.js.Local.resolveT__anon_1178523.Wrap.releaseRefFromZig" + ".text.browser.js.Local.resolveT__anon_1178523.Wrap.releaseRef" + ".text.unlikely.lightpanda.assertionFailure__anon_1178569" + ".text.crash_handler.report__anon_1178602" + ".text.crash_handler.report__anon_1178841" + ".text.unlikely.crash_handler.crash__anon_1178803" + ".text.browser.js.bridge.Function.init__struct_31061.wrap" + ".text.browser.js.bridge.Function.init__struct_31027.wrap" ".text.browser.js.bridge.Indexed.init__struct_29766.wrap" ".text.browser.js.bridge.Accessor.init__struct_29733.wrap" ".text.browser.js.bridge.Iterator.init__struct_29664.wrap" ".text.browser.js.bridge.Function.init__struct_29651.wrap" - ".text.browser.js.bridge.Accessor.init__struct_26870.wrap" ".text.browser.js.bridge.Function.init__struct_26780.wrap" ".text.browser.js.bridge.Accessor.init__struct_26684.wrap" ".text.browser.js.bridge.Constructor.init__struct_26618.wrap" - ".text.Thread.PosixThreadImpl.spawn__anon_1181081.Instance.entryFn" + ".text.Thread.PosixThreadImpl.spawn__anon_1183049.Instance.entryFn" ".text.Sighandler.sighandle" ".text.array_hash_map.Custom(\[\]const u8,agent.auth.models_dev.parseProviderModels.Provider,array_hash_map.StringContext,true).getOrPut" ".text.array_hash_map.Custom(\[\]const u8,agent.auth.models_dev.parseProviderModels.Provider,array_hash_map.StringContext,true).deinit" @@ -1823,7 +1826,8 @@ SECTIONS { ".text.debug.print__anon_21277" ".text.agent.settings.detectLocalProvider" ".text.agent.settings.availableProviders" - ".text.json.static.innerParse__anon_1184503" + ".text.provider.useVertex" + ".text.json.static.innerParse__anon_1186471" ".text.array_hash_map.Custom(\[\]const u8,agent.auth.auth.StoredToken,array_hash_map.StringContext,true).deinit" ".text.process.Environ.Map.deinit" ".text.Io.File.MultiReader.toOwnedSlice" @@ -1842,17 +1846,19 @@ SECTIONS { ".text.network.http.opensocketCallback" ".text.network.http.Connection.discardBody" ".text.network.http.Connection.reset__struct_20257.wrap" - ".text.crash_handler.report__anon_1185674" - ".text.unlikely.crash_handler.crash__anon_1185662" + ".text.crash_handler.report__anon_1187642" + ".text.unlikely.crash_handler.crash__anon_1187630" + ".text.unlikely.lightpanda.assertionFailure__anon_1187730" ".text.Config.printUsageAndExit" ".text.Config.printPlain" ".text.array_list.Aligned(\[\]const u8,null).toOwnedSlice" ".text.Config.agentVerbosity" ".text.cli.Builder(.{ .{ ... }, .{ ... }, .{ ... }, .{ ... }, .{ ... }, .{ ... } }).unknownCommand" - ".text.log.Value.initRuntime__anon_1267068.Thunk.logFmt" - ".text.log.writeThunk__anon_1267108__struct_1267133.write" + ".text.log.Value.initRuntime__anon_1269016.Thunk.logFmt" + ".text.log.writeThunk__anon_1269056__struct_1269081.write" ".text.log.fatal__anon_19125" ".text.log.fatal__anon_19084" + ".text.log.fatal__anon_19081" ".text.Io.Threaded.lookupDns" ".text.Io.Threaded.setSocketOptionPosix" ".text.Io.Threaded.openSocketPosix" @@ -1885,7 +1891,7 @@ SECTIONS { ".text.Io.Threaded.fileMemoryMapDestroy" ".text.Io.Threaded.fileMemoryMapCreate" ".text.Io.Threaded.fileHardLink" - ".text.fmt.bufPrintSentinel__anon_1270759" + ".text.fmt.bufPrintSentinel__anon_1272707" ".text.Io.Threaded.posixFchown" ".text.Io.Threaded.fileSupportsAnsiEscapeCodes" ".text.Io.Threaded.fileEnableAnsiEscapeCodes" @@ -1902,7 +1908,6 @@ SECTIONS { ".text.Io.Threaded.fileWriteStreaming" ".text.Io.Threaded.fileClose" ".text.Io.Threaded.fileLength" - ".text.Io.Threaded.dirStatFileLinux" ".text.Io.Threaded.dirStat" ".text.Io.Threaded.dirCreateDirPathOpenPosix" ".text.Io.Threaded.filePathKind" @@ -1911,7 +1916,7 @@ SECTIONS { ".text.Io.Threaded.batchCancel" ".text.Io.Threaded.batchAwaitConcurrent" ".text.Io.Threaded.netReceivePosix" - ".text.Io.Threaded.batchAwaitConcurrent__struct_1271922.add" + ".text.Io.Threaded.batchAwaitConcurrent__struct_1273870.add" ".text.Io.Threaded.batchAwaitAsync" ".text.Io.Threaded.operate" ".text.Io.Threaded.futexWake" @@ -1925,8 +1930,8 @@ SECTIONS { ".text.Io.Threaded.Group.waitForCancelWithSignaling" ".text.Io.Threaded.groupConcurrent" ".text.Io.Threaded.groupAsync" - ".text.Thread.spawn__anon_1272218" - ".text.Thread.PosixThreadImpl.spawn__anon_1272235.Instance.entryFn" + ".text.Thread.spawn__anon_1274166" + ".text.Thread.PosixThreadImpl.spawn__anon_1274183.Instance.entryFn" ".text.Io.Threaded.netListenIpPosix" ".text.mem.trim__anon_14887" ".text.log.resolveFilters" @@ -1948,7 +1953,7 @@ SECTIONS { ".text.heap.ArenaAllocator.resize" ".text.heap.ArenaAllocator.alloc" ".text.unlikely.process.fatal__anon_2509" - ".text.unlikely.log.scoped(.default).err__anon_1276339" + ".text.unlikely.log.scoped(.default).err__anon_1278287" ".text.process.Environ.createMap" ".text.Io.Threaded.init" ".text.Io.Threaded.doNothingSignalHandler" @@ -1956,17 +1961,20 @@ SECTIONS { ".text.compress.zstd.Decompress.discardIndirect" ".text.compress.zstd.Decompress.Frame.Zstandard.Decode.decodeLiterals" ".text.compress.zstd.Decompress.Frame.Zstandard.Decode.decodeSequence" - ".text.compress.zstd.Decompress.discardDirect" + ".text.compress.flate.Decompress.streamInner" + ".text.compress.flate.Decompress.rebaseFallible" + ".text.Io.Writer.writeBytePreserve" + ".text.compress.flate.Decompress.streamDirect" + ".text.compress.flate.Decompress.discardDirect" ".text.Io.Writer.Allocating.drain" ".text.Io.Writer.Allocating.growingRebase" ".text.Io.Writer.Allocating.sendFile" - ".text.compress.flate.Decompress.readVec" - ".text.compress.flate.Decompress.discardIndirect" - ".text.compress.flate.Decompress.takeBits" - ".text.compress.flate.Decompress.streamInner" + ".text.agent.auth.codex.post" + ".text.browser.URL.percentEncodeSegment__anon_1281768" + ".text.agent.auth.codex.parseTokenResponse" ".text.agent.auth.codex.accountIdFromJwt" ".text.agent.auth.codex.stringField" - ".text.browser.URL.shouldPercentEncode__anon_1279825" + ".text.browser.URL.shouldPercentEncode__anon_1281772" ".text.browser.js.Inspector.v8_inspector__Channel__IMPL__flushProtocolNotifications" ".text.browser.js.Inspector.v8_inspector__Channel__IMPL__sendNotification" ".text.browser.js.Inspector.v8_inspector__Channel__IMPL__sendResponse" @@ -2064,6 +2072,9 @@ SECTIONS { ".text.ossl_recv" ".text.ossl_send" ".text.ossl_get_channel_binding" + ".text.sk_X509_INFO_call_free_func" + ".text.oss_x509_share_free" + ".text.ssl_msg_type" ) *ssl_x509.o( ".text.sk_X509_call_free_func" @@ -2094,6 +2105,7 @@ SECTIONS { ".text.OPENSSL_strlcat" ) *err.o( + ".text.ERR_get_error" ".text.ERR_restore_state" ".text._ZL14err_state_freePv" ) @@ -2187,6 +2199,7 @@ SECTIONS { ".text.CBB_add_u16_length_prefixed" ".text.CBB_add_u24_length_prefixed" ".text.CBB_add_asn1" + ".text.CBB_add_u8" ) *fallback_malloc.o( ".text._ZN12_GLOBAL__N_115fallback_mallocEm" @@ -2251,6 +2264,7 @@ SECTIONS { ".text._ZN10__cxxabiv120__si_class_type_infoD0Ev" ".text._ZN10__cxxabiv121__vmi_class_type_infoD0Ev" ".text._ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv" + ".text.__dynamic_cast" ) *pem_info.o( ".text.PEM_X509_INFO_read_bio" @@ -2609,7 +2623,6 @@ SECTIONS { ".text.mime_file_read" ".text.mime_file_free" ".text.Curl_mime_set_subparts" - ".text.Curl_creader_set_mime" ".text.mime_size" ".text.read_part_content" ".text.escape_string" @@ -2652,8 +2665,7 @@ SECTIONS { ".text.Curl_ssl_peer_init" ".text.ssl_cf_destroy" ".text.ssl_cf_connect" - ".text.multissl_version" - ".text.multissl_random" + ".text.ssl_cf_shutdown" ".text.multissl_connect" ".text.multissl_adjust_pollset" ".text.multissl_get_internals" @@ -3121,7 +3133,6 @@ SECTIONS { ".text.Curl_output_httpsig" ) *hmac.o( - ".text.Curl_HMAC_init" ".text.Curl_hmacit" ) *strerror.o( @@ -3157,7 +3168,6 @@ SECTIONS { ".text.parsedate" ) *http2.o( - ".text.cf_h2_recv" ".text.cf_h2_cntrl" ".text.cf_h2_is_alive" ".text.cf_h2_keep_alive" @@ -3175,12 +3185,7 @@ SECTIONS { ".text.cf_h2_ctx_free" ".text.h2_progress_ingress" ) - *dynhds.o( - ".text.Curl_dynhds_to_nva" - ) *http1.o( - ".text.Curl_h1_req_parse_init" - ".text.Curl_h1_req_parse_free" ".text.Curl_h1_req_parse_read" ".text.Curl_h1_req_write_head" ) @@ -3256,6 +3261,8 @@ SECTIONS { ".text.gzip_do_init" ".text.gzip_do_write" ".text.gzip_do_close" + ".text.brotli_do_init" + ".text.brotli_do_write" ) *transform.o( ".text.Shift" @@ -3415,6 +3422,7 @@ SECTIONS { ) *socks.o( ".text.socks_proxy_cf_destroy" + ".text.socks_proxy_cf_connect" ) *vtls_scache.o( ".text.Curl_ssl_peer_key_make" @@ -3446,6 +3454,9 @@ SECTIONS { ".text.Curl_tls_keylog_file_name" ".text.Curl_tls_keylog_write_line" ) + *by_file.o( + ".text.sk_X509_INFO_call_free_func" + ) *ssl_versions.o( ".text._ZN4bssl21ssl_get_version_rangeEPKNS_13SSL_HANDSHAKEEPtS3_" ".text._ZN4bssl21ssl_has_final_versionEPK6ssl_st" @@ -3471,6 +3482,27 @@ SECTIONS { ".text.SSL_is_quic" ".text.OPENSSL_init_ssl" ".text._ZN10ssl_ctx_stC2EPK13ssl_method_st" + ".text._ZN4bssl5ArrayItED2Ev" + ".text._ZNSt3__110unique_ptrI15ssl_ech_keys_stN4bssl8internal7DeleterEED2B8ne210100Ev" + ) + *extensions.o( + ".text._ZN4bssl5ArrayItED2Ev" + ) + *handoff.o( + ".text._ZN4bssl5ArrayItED2Ev" + ) + *handshake.o( + ".text._ZN4bssl5ArrayItED2Ev" + ".text._ZNSt3__110unique_ptrI15ssl_ech_keys_stN4bssl8internal7DeleterEED2B8ne210100Ev" + ) + *ssl_credential.o( + ".text._ZN4bssl5ArrayItED2Ev" + ) + *ssl_privkey.o( + ".text._ZN4bssl5ArrayItED2Ev" + ) + *handshake_server.o( + ".text._ZNSt3__110unique_ptrI15ssl_ech_keys_stN4bssl8internal7DeleterEED2B8ne210100Ev" ) *netrc.o( ".text.netrc_scan_file" @@ -3594,6 +3626,7 @@ SECTIONS { ) *pcre2_compile.o( ".text.pcre2_code_free_8" + ".text._pcre2_check_escape_8" ".text.parse_capture_list" ".text.set_lookbehind_lengths" ".text.get_branchlength" @@ -3687,7 +3720,6 @@ SECTIONS { ".text.unlikely._RINvMNtNtCsgxBkk5gSRhY_4core4cell4onceINtB3_8OnceCellINtNtB7_6result6ResultINtNtB7_6option6OptionINtNtCs6i54tJFfzR_5alloc5boxed3BoxINtNtCslgomAybRUiZ_9addr2line4unit7DwoUnitINtNtNtCsepY7R6AGWjB_5gimli4read12endian_slice11EndianSliceNtNtB2S_9endianity12LittleEndianEEEENtB2Q_5ErrorEE8try_initNCINvB2_11get_or_initNCNvMB28_INtB28_7ResUnitB2L_E14dwarf_and_units0_0E0zECs9k3SxhrAWiO_3std" ".text.unlikely._RINvMNtNtCsgxBkk5gSRhY_4core4cell4onceINtB3_8OnceCellINtNtB7_6result6ResultINtNtB7_6option6OptionINtNtCs6i54tJFfzR_5alloc5boxed3BoxINtNtCslgomAybRUiZ_9addr2line4unit7DwoUnitINtNtNtCsepY7R6AGWjB_5gimli4read12endian_slice11EndianSliceNtNtB2S_9endianity12LittleEndianEEEENtB2Q_5ErrorEE8try_initNCINvB2_11get_or_initNCNvMB28_INtB28_7ResUnitB2L_E14dwarf_and_units2_0E0zECs9k3SxhrAWiO_3std" ".text.unlikely._RINvMNtNtCsgxBkk5gSRhY_4core4cell4onceINtB3_8OnceCellINtNtB7_6result6ResultINtNtCslgomAybRUiZ_9addr2line8function8FunctionINtNtNtCsepY7R6AGWjB_5gimli4read12endian_slice11EndianSliceNtNtB23_9endianity12LittleEndianEENtB21_5ErrorEE8try_initNCINvB2_11get_or_initNCNvMs_B1e_INtB1e_12LazyFunctionB1W_E6borrow0E0zECs9k3SxhrAWiO_3std" - ".text._RNvNtNtNtNtCs9k3SxhrAWiO_3std3sys12thread_local11destructors10linux_like8register" ".text._RNvNtNtNtNtCs9k3SxhrAWiO_3std3sys2io5error4unix12error_string" ".text._RNvNtNtNtNtCs9k3SxhrAWiO_3std3sys2io5error4unix14is_interrupted.llvm.16074470296022112615" ".text._RNvNtNtNtNtCs9k3SxhrAWiO_3std3sys2io5error4unix17decode_error_kind.llvm.16074470296022112615" @@ -3731,6 +3763,7 @@ SECTIONS { ".text._RNvMs_NtNtNtNtCsgxBkk5gSRhY_4core3num3imp7dec2flt11decimal_seqNtB4_10DecimalSeq5round" ".text._RNvMsa_NtCsgxBkk5gSRhY_4core3fmtNtB5_9Formatter12pad_integral" ".text._RNvMsa_NtCsgxBkk5gSRhY_4core3fmtNtB5_9Formatter19pad_formatted_parts" + ".text._RNvMsa_NtCsgxBkk5gSRhY_4core3fmtNtB5_9Formatter21write_formatted_parts" ".text._RNvMsu_NtNtCsgxBkk5gSRhY_4core3str7patternNtB5_11StrSearcher3new" ".text._RNvNtCsgxBkk5gSRhY_4core3fmt5write" ".text.unlikely._RNvNtCsgxBkk5gSRhY_4core3str16slice_error_fail" @@ -4404,6 +4437,8 @@ SECTIONS { ".rodata.cst4" ".rodata.cst8" ".rodata.cst32" + ".rodata.ascii.whitespace" + ".rodata.__anon_16606" ".rodata.__anon_19088" ".rodata.__anon_19127" ".rodata.__anon_19132" @@ -4423,179 +4458,178 @@ SECTIONS { ".rodata.__anon_21871" ".rodata.__anon_21954" ".rodata.__anon_20601" - ".rodata.__anon_136957" - ".rodata.__anon_137346" - ".rodata.__anon_137361" - ".rodata.__anon_138699" - ".rodata.__anon_140009" - ".rodata.__anon_137326" - ".rodata.__anon_138402" - ".rodata.__anon_140405" - ".rodata.__anon_140536" - ".rodata.__anon_140445" - ".rodata.__anon_141818" + ".rodata.__anon_137912" + ".rodata.__anon_138299" + ".rodata.__anon_138314" + ".rodata.__anon_139652" + ".rodata.__anon_140962" + ".rodata.__anon_138279" + ".rodata.__anon_139355" + ".rodata.__anon_141358" + ".rodata.__anon_141489" + ".rodata.__anon_141398" + ".rodata.__anon_142770" ".rodata.__anon_22180" - ".rodata.__anon_140569" - ".rodata.__anon_143118" - ".rodata.__anon_143125" - ".rodata.__anon_143262" - ".rodata.__anon_143275" - ".rodata.__anon_143317" - ".rodata.__anon_143362" - ".rodata.__anon_143402" - ".rodata.__anon_143431" - ".rodata.__anon_143451" - ".rodata.__anon_143574" - ".rodata.__anon_143601" - ".rodata.__anon_143777" - ".rodata.__anon_145459" - ".rodata.__anon_147177" - ".rodata.__anon_147321" - ".rodata.__anon_147331" - ".rodata.__anon_148628" - ".rodata.__anon_149150" - ".rodata.__anon_149245" - ".rodata.__anon_149476" - ".rodata.__anon_149651" - ".rodata.__anon_151669" - ".rodata.__anon_152195" - ".rodata.__anon_152210" - ".rodata.__anon_152118" + ".rodata.__anon_141522" + ".rodata.__anon_144069" + ".rodata.__anon_144076" + ".rodata.__anon_144213" + ".rodata.__anon_144226" + ".rodata.__anon_144268" + ".rodata.__anon_144313" + ".rodata.__anon_144353" + ".rodata.__anon_144382" + ".rodata.__anon_144402" + ".rodata.__anon_144525" + ".rodata.__anon_144552" + ".rodata.__anon_144728" + ".rodata.__anon_146410" + ".rodata.__anon_148128" + ".rodata.__anon_148272" + ".rodata.__anon_148282" + ".rodata.__anon_149579" + ".rodata.__anon_150101" + ".rodata.__anon_150196" + ".rodata.__anon_150427" + ".rodata.__anon_150602" + ".rodata.__anon_152620" + ".rodata.__anon_153146" + ".rodata.__anon_153161" + ".rodata.__anon_153069" ".rodata.__anon_20847" - ".rodata.__anon_148648" - ".rodata.__anon_148650" - ".rodata.__anon_151732" - ".rodata.__anon_153247" - ".rodata.__anon_153483" - ".rodata.__anon_153512" - ".rodata.__anon_153535" - ".rodata.__anon_153639" - ".rodata.__anon_153656" - ".rodata.__anon_153713" - ".rodata.__anon_153733" - ".rodata.__anon_153931" - ".rodata.__anon_153953" - ".rodata.__anon_154046" - ".rodata.__anon_154153" - ".rodata.__anon_154207" - ".rodata.__anon_154538" - ".rodata.__anon_156030" - ".rodata.__anon_156038" - ".rodata.__anon_156595" - ".rodata.__anon_156614" - ".rodata.__anon_156847" - ".rodata.__anon_156862" - ".rodata.__anon_160570" - ".rodata.__anon_160690" - ".rodata.__anon_160700" - ".rodata.__anon_156102" - ".rodata.__anon_156129" - ".rodata.__anon_156138" - ".rodata.__anon_156148" - ".rodata.__anon_156160" - ".rodata.__anon_156186" - ".rodata.__anon_156203" - ".rodata.__anon_156227" - ".rodata.__anon_156237" - ".rodata.__anon_156248" - ".rodata.__anon_156681" - ".rodata.__anon_156706" - ".rodata.__anon_156724" - ".rodata.__anon_161134" - ".rodata.__anon_162315" - ".rodata.__anon_162325" - ".rodata.__anon_152192" - ".rodata.__anon_163103" + ".rodata.__anon_149599" + ".rodata.__anon_149601" + ".rodata.__anon_152683" + ".rodata.__anon_154198" + ".rodata.__anon_154434" + ".rodata.__anon_154463" + ".rodata.__anon_154486" + ".rodata.__anon_154590" + ".rodata.__anon_154607" + ".rodata.__anon_154664" + ".rodata.__anon_154684" + ".rodata.__anon_154882" + ".rodata.__anon_154904" + ".rodata.__anon_154997" + ".rodata.__anon_155104" + ".rodata.__anon_155158" + ".rodata.__anon_155489" + ".rodata.__anon_156970" + ".rodata.__anon_156978" + ".rodata.__anon_157534" + ".rodata.__anon_157553" + ".rodata.__anon_157786" + ".rodata.__anon_157801" + ".rodata.__anon_161508" + ".rodata.__anon_161628" + ".rodata.__anon_161638" + ".rodata.__anon_157041" + ".rodata.__anon_157068" + ".rodata.__anon_157077" + ".rodata.__anon_157087" + ".rodata.__anon_157099" + ".rodata.__anon_157125" + ".rodata.__anon_157142" + ".rodata.__anon_157166" + ".rodata.__anon_157176" + ".rodata.__anon_157187" + ".rodata.__anon_157620" + ".rodata.__anon_157645" + ".rodata.__anon_157663" + ".rodata.__anon_162072" + ".rodata.__anon_163244" + ".rodata.__anon_163254" + ".rodata.__anon_153143" + ".rodata.__anon_164032" ".rodata.__anon_4010" - ".rodata.__anon_162991" - ".rodata.__anon_163213" - ".rodata.__anon_162990" - ".rodata.__anon_163264" - ".rodata.__anon_163292" - ".rodata.__anon_163449" - ".rodata.__anon_162568" - ".rodata.__anon_164023" - ".rodata.__anon_163894" + ".rodata.__anon_163920" + ".rodata.__anon_164146" ".rodata.__anon_163919" - ".rodata.__anon_122042" - ".rodata.__anon_163955" - ".rodata.__anon_163959" - ".rodata.__anon_163969" - ".rodata.__anon_164548" - ".rodata.__anon_165044" - ".rodata.__anon_165914" - ".rodata.__anon_165901" - ".rodata.__anon_165596" - ".rodata.__anon_166285" - ".rodata.__anon_166515" - ".rodata.__anon_167016" - ".rodata.__anon_167059" - ".rodata.__anon_167832" - ".rodata.__anon_167872" - ".rodata.__anon_167818" - ".rodata.__anon_167908" - ".rodata.__anon_167431" - ".rodata.__anon_169246" - ".rodata.__anon_169257" - ".rodata.__anon_169260" - ".rodata.__anon_170206" - ".rodata.__anon_170413" - ".rodata.__anon_170513" - ".rodata.__anon_170899" - ".rodata.__anon_171184" - ".rodata.__anon_172742" - ".rodata.__anon_173503" - ".rodata.__anon_51856" - ".rodata.__anon_174675" - ".rodata.__anon_172668" - ".rodata.__anon_175093" - ".rodata.__anon_175214" - ".rodata.__anon_175576" - ".rodata.__anon_175725" - ".rodata.__anon_175679" - ".rodata.__anon_175829" - ".rodata.__anon_176169" - ".rodata.__anon_179160" - ".rodata.__anon_179282" - ".rodata.__anon_179303" - ".rodata.__anon_179334" - ".rodata.__anon_179335" - ".rodata.__anon_179336" - ".rodata.__anon_179337" - ".rodata.__anon_179338" - ".rodata.__anon_179339" - ".rodata.__anon_179340" - ".rodata.__anon_179341" - ".rodata.__anon_179342" - ".rodata.__anon_180866" - ".rodata.__anon_181721" - ".rodata.__anon_181996" - ".rodata.__anon_182018" - ".rodata.__anon_187834" - ".rodata.__anon_203115" - ".rodata.__anon_203130" - ".rodata.__anon_203182" - ".rodata.__anon_203183" - ".rodata.__anon_203418" - ".rodata.__anon_203317" - ".rodata.__anon_203318" + ".rodata.__anon_164197" + ".rodata.__anon_164225" + ".rodata.__anon_164382" + ".rodata.__anon_163497" + ".rodata.__anon_164963" + ".rodata.__anon_164834" + ".rodata.__anon_164859" + ".rodata.__anon_122926" + ".rodata.__anon_164895" + ".rodata.__anon_164899" + ".rodata.__anon_164909" + ".rodata.__anon_165486" + ".rodata.__anon_165982" + ".rodata.__anon_166852" + ".rodata.__anon_166839" + ".rodata.__anon_166534" + ".rodata.__anon_167223" + ".rodata.__anon_167453" + ".rodata.__anon_167954" + ".rodata.__anon_167997" + ".rodata.__anon_168757" + ".rodata.__anon_168796" + ".rodata.__anon_168744" + ".rodata.__anon_168832" + ".rodata.__anon_168368" + ".rodata.__anon_170170" + ".rodata.__anon_170181" + ".rodata.__anon_170184" + ".rodata.__anon_171130" + ".rodata.__anon_171337" + ".rodata.__anon_171437" + ".rodata.__anon_171823" + ".rodata.__anon_172108" + ".rodata.__anon_173666" + ".rodata.__anon_174423" + ".rodata.__anon_52602" + ".rodata.__anon_175407" + ".rodata.__anon_173592" + ".rodata.__anon_175825" + ".rodata.__anon_175946" + ".rodata.__anon_176308" + ".rodata.__anon_176457" + ".rodata.__anon_176411" + ".rodata.__anon_176561" + ".rodata.__anon_176901" + ".rodata.__anon_179891" + ".rodata.__anon_180013" + ".rodata.__anon_180034" + ".rodata.__anon_180065" + ".rodata.__anon_180066" + ".rodata.__anon_180067" + ".rodata.__anon_180068" + ".rodata.__anon_180069" + ".rodata.__anon_180070" + ".rodata.__anon_180071" + ".rodata.__anon_180072" + ".rodata.__anon_180073" + ".rodata.__anon_181597" + ".rodata.__anon_182452" + ".rodata.__anon_182727" + ".rodata.__anon_182749" + ".rodata.__anon_188565" ".rodata.__anon_203861" - ".rodata.__anon_203998" - ".rodata.__anon_204125" - ".rodata.__anon_204260" - ".rodata.__anon_204296" - ".rodata.__anon_204362" - ".rodata.__anon_204577" - ".rodata.__anon_150096" - ".rodata.__anon_205779" - ".rodata.__anon_206042" - ".rodata.__anon_206707" - ".rodata.__anon_206744" - ".rodata.__anon_206803" - ".rodata.__anon_206872" - ".rodata.__anon_206911" - ".rodata.__anon_206932" - ".rodata.__anon_206957" + ".rodata.__anon_203913" + ".rodata.__anon_203914" + ".rodata.__anon_204149" + ".rodata.__anon_204048" + ".rodata.__anon_204049" + ".rodata.__anon_204592" + ".rodata.__anon_204729" + ".rodata.__anon_204856" + ".rodata.__anon_204991" + ".rodata.__anon_205027" + ".rodata.__anon_205093" + ".rodata.__anon_205308" + ".rodata.__anon_151047" + ".rodata.__anon_206510" + ".rodata.__anon_206773" + ".rodata.__anon_207438" + ".rodata.__anon_207475" + ".rodata.__anon_207534" + ".rodata.__anon_207603" + ".rodata.__anon_207642" + ".rodata.__anon_207663" + ".rodata.__anon_207688" ".rodata.browser.webapi.event.TouchEvent.JsApi.Meta.prototype_chain" ".rodata.browser.webapi.event.CompositionEvent.JsApi.Meta.prototype_chain" ".rodata.browser.webapi.event.InputEvent.JsApi.Meta.prototype_chain" @@ -4604,9 +4638,9 @@ SECTIONS { ".rodata.browser.webapi.event.KeyboardEvent.JsApi.Meta.prototype_chain" ".rodata.browser.webapi.event.MouseEvent.JsApi.Meta.prototype_chain" ".rodata.browser.webapi.net.XMLHttpRequestUpload.JsApi.Meta.prototype_chain" - ".rodata.__anon_211050" - ".rodata.__anon_212742" - ".rodata.__anon_213146" + ".rodata.__anon_211781" + ".rodata.__anon_213473" + ".rodata.__anon_213877" ".rodata.browser.webapi.net.XMLHttpRequest.JsApi.Meta.prototype_chain" ".rodata.browser.webapi.DedicatedWorkerGlobalScope.JsApi.Meta.prototype_chain" ".rodata.browser.webapi.ServiceWorkerGlobalScope.JsApi.Meta.prototype_chain" @@ -4718,1227 +4752,1162 @@ SECTIONS { ".rodata.browser.webapi.cdata.CDATASection.JsApi.Meta.prototype_chain" ".rodata.browser.webapi.storage.idb.IDBOpenDBRequest.JsApi.Meta.prototype_chain" ".rodata.browser.webapi.TaskSignal.JsApi.Meta.prototype_chain" - ".rodata.__anon_228906" - ".rodata.__anon_228956" - ".rodata.__anon_228976" - ".rodata.__anon_177819" - ".rodata.__anon_229012" - ".rodata.__anon_229055" - ".rodata.__anon_229319" - ".rodata.__anon_229393" - ".rodata.__anon_229623" - ".rodata.__anon_229843" - ".rodata.__anon_229849" - ".rodata.__anon_233914" - ".rodata.__anon_236616" - ".rodata.__anon_236721" - ".rodata.__anon_237631" - ".rodata.__anon_237643" - ".rodata.__anon_238712" - ".rodata.__anon_238728" - ".rodata.__anon_238762" - ".rodata.__anon_238777" - ".rodata.__anon_239525" - ".rodata.__anon_239824" - ".rodata.__anon_240774" - ".rodata.__anon_240841" - ".rodata.__anon_150081" - ".rodata.__anon_243332" - ".rodata.__anon_243972" - ".rodata.__anon_244012" - ".rodata.__anon_244406" - ".rodata.__anon_244620" - ".rodata.__anon_244621" - ".rodata.__anon_247524" - ".rodata.__anon_247683" - ".rodata.__anon_248272" - ".rodata.__anon_248362" - ".rodata.__anon_249958" - ".rodata.__anon_250080" - ".rodata.__anon_250196" - ".rodata.__anon_250201" - ".rodata.__anon_250213" - ".rodata.__anon_250434" - ".rodata.__anon_250435" - ".rodata.__anon_250439" - ".rodata.__anon_250952" - ".rodata.__anon_250995" - ".rodata.__anon_252793" - ".rodata.__anon_252802" - ".rodata.__anon_252811" - ".rodata.__anon_252819" - ".rodata.__anon_252827" - ".rodata.__anon_252835" - ".rodata.__anon_252843" - ".rodata.__anon_252848" - ".rodata.__anon_252856" - ".rodata.__anon_252860" - ".rodata.__anon_252868" - ".rodata.__anon_252872" - ".rodata.__anon_252880" - ".rodata.__anon_252884" - ".rodata.__anon_252892" - ".rodata.__anon_252900" - ".rodata.__anon_252905" - ".rodata.__anon_252914" - ".rodata.__anon_252923" - ".rodata.__anon_252931" - ".rodata.__anon_252935" - ".rodata.__anon_252943" - ".rodata.__anon_252951" - ".rodata.__anon_252959" - ".rodata.__anon_252968" - ".rodata.__anon_252977" - ".rodata.__anon_252985" - ".rodata.__anon_252993" - ".rodata.__anon_253001" - ".rodata.__anon_253009" - ".rodata.__anon_253017" - ".rodata.__anon_253025" - ".rodata.__anon_253029" - ".rodata.__anon_253038" - ".rodata.__anon_253046" - ".rodata.__anon_253054" - ".rodata.__anon_253062" - ".rodata.__anon_253066" - ".rodata.__anon_253070" - ".rodata.__anon_253078" - ".rodata.__anon_253086" - ".rodata.__anon_253094" - ".rodata.__anon_253102" - ".rodata.__anon_253110" - ".rodata.__anon_253118" - ".rodata.__anon_253126" - ".rodata.__anon_253134" - ".rodata.__anon_253138" - ".rodata.__anon_253146" - ".rodata.__anon_253151" - ".rodata.__anon_253160" - ".rodata.__anon_253168" - ".rodata.__anon_253172" - ".rodata.__anon_253181" - ".rodata.__anon_253185" - ".rodata.__anon_253193" - ".rodata.__anon_253200" - ".rodata.__anon_253209" - ".rodata.__anon_253213" - ".rodata.__anon_253221" - ".rodata.__anon_253229" - ".rodata.__anon_253233" - ".rodata.__anon_253237" - ".rodata.__anon_253244" - ".rodata.__anon_253252" - ".rodata.__anon_253260" - ".rodata.__anon_253264" - ".rodata.__anon_253272" - ".rodata.__anon_253280" - ".rodata.__anon_253288" - ".rodata.__anon_253296" - ".rodata.__anon_253304" - ".rodata.__anon_253312" - ".rodata.__anon_253320" - ".rodata.__anon_253328" - ".rodata.__anon_253336" - ".rodata.__anon_253344" - ".rodata.__anon_253351" - ".rodata.__anon_253359" - ".rodata.__anon_253367" - ".rodata.__anon_253375" - ".rodata.__anon_253383" - ".rodata.__anon_253391" - ".rodata.__anon_253399" - ".rodata.__anon_253406" - ".rodata.__anon_253415" - ".rodata.__anon_253419" - ".rodata.__anon_253427" - ".rodata.__anon_253435" - ".rodata.__anon_253443" - ".rodata.__anon_253447" - ".rodata.__anon_253451" - ".rodata.__anon_253455" - ".rodata.__anon_253459" - ".rodata.__anon_253468" - ".rodata.__anon_253472" - ".rodata.__anon_253481" - ".rodata.__anon_253485" - ".rodata.__anon_253494" - ".rodata.__anon_253502" - ".rodata.__anon_253506" - ".rodata.__anon_253510" - ".rodata.__anon_253518" - ".rodata.__anon_253528" - ".rodata.__anon_253532" - ".rodata.__anon_253540" - ".rodata.__anon_253548" - ".rodata.__anon_253556" - ".rodata.__anon_253566" - ".rodata.__anon_253574" + ".rodata.__anon_229637" + ".rodata.__anon_229687" + ".rodata.__anon_229707" + ".rodata.__anon_178550" + ".rodata.__anon_229743" + ".rodata.__anon_229786" + ".rodata.__anon_230050" + ".rodata.__anon_230124" + ".rodata.__anon_230354" + ".rodata.__anon_230629" + ".rodata.__anon_230635" + ".rodata.__anon_234700" + ".rodata.__anon_237378" + ".rodata.__anon_237483" + ".rodata.__anon_238384" + ".rodata.__anon_238390" + ".rodata.__anon_239449" + ".rodata.__anon_239465" + ".rodata.__anon_239499" + ".rodata.__anon_239514" + ".rodata.__anon_240258" + ".rodata.__anon_240572" + ".rodata.__anon_241522" + ".rodata.__anon_241589" + ".rodata.__anon_151032" + ".rodata.__anon_244080" + ".rodata.__anon_244720" + ".rodata.__anon_244760" + ".rodata.__anon_245123" + ".rodata.__anon_245363" + ".rodata.__anon_245364" + ".rodata.__anon_248267" + ".rodata.__anon_248426" + ".rodata.__anon_249015" + ".rodata.__anon_249105" + ".rodata.__anon_250701" + ".rodata.__anon_250823" + ".rodata.__anon_250939" + ".rodata.__anon_250944" + ".rodata.__anon_250956" + ".rodata.__anon_251177" + ".rodata.__anon_251178" + ".rodata.__anon_251182" + ".rodata.__anon_251695" + ".rodata.__anon_251738" + ".rodata.__anon_253536" + ".rodata.__anon_253545" + ".rodata.__anon_253554" + ".rodata.__anon_253562" + ".rodata.__anon_253570" ".rodata.__anon_253578" ".rodata.__anon_253586" - ".rodata.__anon_253594" - ".rodata.__anon_253602" - ".rodata.__anon_253610" - ".rodata.__anon_253618" - ".rodata.__anon_253804" - ".rodata.__anon_253840" - ".rodata.__anon_253847" - ".rodata.__anon_253849" - ".rodata.__anon_253854" - ".rodata.__anon_254020" - ".rodata.__anon_254092" - ".rodata.__anon_254351" - ".rodata.__anon_254613" - ".rodata.__anon_254673" - ".rodata.__anon_254707" - ".rodata.__anon_254750" - ".rodata.__anon_254751" - ".rodata.__anon_254752" - ".rodata.__anon_254753" - ".rodata.__anon_254754" - ".rodata.__anon_254755" - ".rodata.__anon_254156" - ".rodata.__anon_256817" - ".rodata.__anon_256821" + ".rodata.__anon_253591" + ".rodata.__anon_253599" + ".rodata.__anon_253603" + ".rodata.__anon_253611" + ".rodata.__anon_253615" + ".rodata.__anon_253623" + ".rodata.__anon_253627" + ".rodata.__anon_253635" + ".rodata.__anon_253643" + ".rodata.__anon_253648" + ".rodata.__anon_253657" + ".rodata.__anon_253666" + ".rodata.__anon_253674" + ".rodata.__anon_253678" + ".rodata.__anon_253686" + ".rodata.__anon_253694" + ".rodata.__anon_253702" + ".rodata.__anon_253711" + ".rodata.__anon_253720" + ".rodata.__anon_253728" + ".rodata.__anon_253736" + ".rodata.__anon_253744" + ".rodata.__anon_253752" + ".rodata.__anon_253760" + ".rodata.__anon_253768" + ".rodata.__anon_253772" + ".rodata.__anon_253781" + ".rodata.__anon_253789" + ".rodata.__anon_253797" + ".rodata.__anon_253805" + ".rodata.__anon_253809" + ".rodata.__anon_253813" + ".rodata.__anon_253821" + ".rodata.__anon_253829" + ".rodata.__anon_253837" + ".rodata.__anon_253845" + ".rodata.__anon_253853" + ".rodata.__anon_253861" + ".rodata.__anon_253869" + ".rodata.__anon_253877" + ".rodata.__anon_253881" + ".rodata.__anon_253889" + ".rodata.__anon_253894" + ".rodata.__anon_253903" + ".rodata.__anon_253911" + ".rodata.__anon_253915" + ".rodata.__anon_253924" + ".rodata.__anon_253928" + ".rodata.__anon_253936" + ".rodata.__anon_253943" + ".rodata.__anon_253952" + ".rodata.__anon_253956" + ".rodata.__anon_253964" + ".rodata.__anon_253972" + ".rodata.__anon_253976" + ".rodata.__anon_253980" + ".rodata.__anon_253987" + ".rodata.__anon_253995" + ".rodata.__anon_254003" + ".rodata.__anon_254007" + ".rodata.__anon_254015" + ".rodata.__anon_254023" + ".rodata.__anon_254031" + ".rodata.__anon_254039" + ".rodata.__anon_254047" + ".rodata.__anon_254055" + ".rodata.__anon_254063" + ".rodata.__anon_254071" + ".rodata.__anon_254079" + ".rodata.__anon_254087" + ".rodata.__anon_254094" + ".rodata.__anon_254102" + ".rodata.__anon_254110" + ".rodata.__anon_254118" + ".rodata.__anon_254126" + ".rodata.__anon_254134" + ".rodata.__anon_254142" + ".rodata.__anon_254149" + ".rodata.__anon_254158" + ".rodata.__anon_254162" + ".rodata.__anon_254170" + ".rodata.__anon_254178" + ".rodata.__anon_254186" + ".rodata.__anon_254190" + ".rodata.__anon_254194" + ".rodata.__anon_254198" + ".rodata.__anon_254202" + ".rodata.__anon_254211" + ".rodata.__anon_254215" + ".rodata.__anon_254224" + ".rodata.__anon_254228" + ".rodata.__anon_254237" + ".rodata.__anon_254245" + ".rodata.__anon_254249" + ".rodata.__anon_254253" + ".rodata.__anon_254261" + ".rodata.__anon_254271" + ".rodata.__anon_254275" + ".rodata.__anon_254283" + ".rodata.__anon_254291" + ".rodata.__anon_254299" + ".rodata.__anon_254309" + ".rodata.__anon_254317" + ".rodata.__anon_254321" + ".rodata.__anon_254329" + ".rodata.__anon_254337" + ".rodata.__anon_254345" + ".rodata.__anon_254353" + ".rodata.__anon_254361" + ".rodata.__anon_254547" + ".rodata.__anon_254583" + ".rodata.__anon_254590" + ".rodata.__anon_254592" + ".rodata.__anon_254597" + ".rodata.__anon_254763" + ".rodata.__anon_254835" + ".rodata.__anon_255094" + ".rodata.__anon_255356" + ".rodata.__anon_255416" + ".rodata.__anon_255450" + ".rodata.__anon_255493" + ".rodata.__anon_255494" + ".rodata.__anon_255495" + ".rodata.__anon_255496" + ".rodata.__anon_255497" + ".rodata.__anon_255498" + ".rodata.__anon_254899" + ".rodata.__anon_257558" + ".rodata.__anon_257562" ".rodata.browser.webapi.selector.Parser.scope_anchor" - ".rodata.__anon_256941" ".rodata.__anon_257682" - ".rodata.__anon_257685" - ".rodata.__anon_256895" - ".rodata.__anon_257695" - ".rodata.__anon_258084" - ".rodata.__anon_258112" - ".rodata.__anon_258120" - ".rodata.__anon_258157" - ".rodata.__anon_258211" - ".rodata.__anon_258222" - ".rodata.__anon_258244" - ".rodata.__anon_258456" - ".rodata.__anon_258476" - ".rodata.__anon_258485" - ".rodata.__anon_258489" - ".rodata.__anon_258759" - ".rodata.__anon_258864" - ".rodata.__anon_258866" - ".rodata.__anon_258867" - ".rodata.__anon_259101" - ".rodata.__anon_259219" - ".rodata.__anon_259227" - ".rodata.__anon_259241" - ".rodata.__anon_259506" - ".rodata.__anon_260931" - ".rodata.__anon_260940" - ".rodata.__anon_260959" - ".rodata.__anon_261213" - ".rodata.__anon_261512" - ".rodata.__anon_261542" - ".rodata.__anon_261704" - ".rodata.__anon_261709" - ".rodata.__anon_261710" - ".rodata.__anon_262143" - ".rodata.__anon_262152" - ".rodata.__anon_262163" - ".rodata.__anon_262471" - ".rodata.__anon_262714" - ".rodata.__anon_262826" - ".rodata.__anon_262539" - ".rodata.__anon_262579" - ".rodata.__anon_263685" - ".rodata.__anon_263749" - ".rodata.__anon_263989" - ".rodata.__anon_265224" - ".rodata.__anon_265267" - ".rodata.__anon_265329" - ".rodata.__anon_266136" - ".rodata.__anon_266210" - ".rodata.__anon_266283" - ".rodata.__anon_266287" - ".rodata.__anon_266744" - ".rodata.__anon_266791" - ".rodata.__anon_266802" - ".rodata.__anon_266957" - ".rodata.__anon_266968" - ".rodata.__anon_267018" - ".rodata.__anon_267072" - ".rodata.__anon_267078" - ".rodata.__anon_267086" - ".rodata.__anon_267438" - ".rodata.__anon_267504" - ".rodata.__anon_267515" - ".rodata.__anon_267520" - ".rodata.__anon_268185" - ".rodata.__anon_268220" - ".rodata.__anon_268369" - ".rodata.__anon_268377" - ".rodata.__anon_268388" - ".rodata.__anon_268465" - ".rodata.__anon_268471" - ".rodata.__anon_268472" - ".rodata.__anon_269046" - ".rodata.__anon_269073" - ".rodata.__anon_269167" - ".rodata.__anon_269175" - ".rodata.__anon_269182" - ".rodata.__anon_269919" - ".rodata.__anon_270308" - ".rodata.__anon_270319" - ".rodata.__anon_270330" - ".rodata.__anon_270254" - ".rodata.__anon_270412" - ".rodata.__anon_270426" - ".rodata.__anon_270479" - ".rodata.__anon_270493" - ".rodata.__anon_274548" - ".rodata.__anon_270622" - ".rodata.__anon_270641" - ".rodata.__anon_270657" - ".rodata.__anon_270676" - ".rodata.__anon_270778" - ".rodata.__anon_270797" - ".rodata.__anon_270818" - ".rodata.__anon_270839" - ".rodata.__anon_270861" - ".rodata.__anon_270882" - ".rodata.__anon_270909" - ".rodata.__anon_270931" - ".rodata.__anon_270958" - ".rodata.__anon_270979" - ".rodata.__anon_271005" - ".rodata.__anon_271079" - ".rodata.__anon_271100" - ".rodata.__anon_271126" - ".rodata.__anon_271148" - ".rodata.__anon_271189" - ".rodata.__anon_271211" - ".rodata.__anon_271233" - ".rodata.__anon_271290" - ".rodata.__anon_271333" - ".rodata.__anon_271504" + ".rodata.__anon_258423" + ".rodata.__anon_258426" + ".rodata.__anon_257636" + ".rodata.__anon_258436" + ".rodata.__anon_258825" + ".rodata.__anon_258853" + ".rodata.__anon_258861" + ".rodata.__anon_258898" + ".rodata.__anon_258952" + ".rodata.__anon_258963" + ".rodata.__anon_258985" + ".rodata.__anon_259197" + ".rodata.__anon_259217" + ".rodata.__anon_259226" + ".rodata.__anon_259230" + ".rodata.__anon_271152" + ".rodata.__anon_271166" + ".rodata.__anon_275221" + ".rodata.__anon_271295" + ".rodata.__anon_271314" + ".rodata.__anon_271330" + ".rodata.__anon_271349" + ".rodata.__anon_271451" + ".rodata.__anon_271470" + ".rodata.__anon_271491" + ".rodata.__anon_271512" ".rodata.__anon_271534" - ".rodata.__anon_271584" - ".rodata.__anon_271639" - ".rodata.__anon_271683" - ".rodata.__anon_271711" - ".rodata.__anon_271733" - ".rodata.__anon_271759" - ".rodata.__anon_271876" - ".rodata.__anon_271898" - ".rodata.__anon_271920" - ".rodata.__anon_271960" - ".rodata.__anon_271984" - ".rodata.__anon_272035" - ".rodata.__anon_272059" - ".rodata.__anon_272088" - ".rodata.__anon_272122" - ".rodata.__anon_272155" - ".rodata.__anon_272189" - ".rodata.__anon_272238" - ".rodata.__anon_272266" - ".rodata.__anon_270549" - ".rodata.__anon_270405" - ".rodata.__anon_280731" - ".rodata.__anon_281651" - ".rodata.__anon_281745" - ".rodata.__anon_282207" - ".rodata.__anon_282327" - ".rodata.__anon_282692" - ".rodata.__anon_282591" - ".rodata.__anon_137680" - ".rodata.__anon_284189" - ".rodata.__anon_284320" - ".rodata.__anon_284992" - ".rodata.__anon_285317" - ".rodata.__anon_285340" - ".rodata.__anon_285487" - ".rodata.__anon_285503" - ".rodata.__anon_285598" - ".rodata.__anon_286232" - ".rodata.__anon_287338" - ".rodata.__anon_137699" - ".rodata.compress.flate.token.fixed_lit_codes" - ".rodata.compress.flate.token.fixed_lit_bits" - ".rodata.compress.flate.token.fixed_dist_codes" - ".rodata.compress.flate.token.fixed_dist_bits" - ".rodata.__anon_291932" - ".rodata.__anon_292132" - ".rodata.__anon_293416" + ".rodata.__anon_271555" + ".rodata.__anon_271582" + ".rodata.__anon_271604" + ".rodata.__anon_271631" + ".rodata.__anon_271652" + ".rodata.__anon_271678" + ".rodata.__anon_271752" + ".rodata.__anon_271773" + ".rodata.__anon_271799" + ".rodata.__anon_271821" + ".rodata.__anon_271862" + ".rodata.__anon_271884" + ".rodata.__anon_271906" + ".rodata.__anon_271963" + ".rodata.__anon_272006" + ".rodata.__anon_272177" + ".rodata.__anon_272207" + ".rodata.__anon_272257" + ".rodata.__anon_272312" + ".rodata.__anon_272356" + ".rodata.__anon_272384" + ".rodata.__anon_272406" + ".rodata.__anon_272432" + ".rodata.__anon_272549" + ".rodata.__anon_272571" + ".rodata.__anon_272593" + ".rodata.__anon_272633" + ".rodata.__anon_272657" + ".rodata.__anon_272708" + ".rodata.__anon_272732" + ".rodata.__anon_272761" + ".rodata.__anon_272795" + ".rodata.__anon_272828" + ".rodata.__anon_272862" + ".rodata.__anon_272911" + ".rodata.__anon_272939" + ".rodata.__anon_271222" + ".rodata.__anon_271078" + ".rodata.__anon_281404" + ".rodata.__anon_282325" + ".rodata.__anon_282419" + ".rodata.__anon_282881" + ".rodata.__anon_283001" + ".rodata.__anon_283366" + ".rodata.__anon_283265" + ".rodata.__anon_138633" + ".rodata.__anon_284863" + ".rodata.__anon_284994" + ".rodata.__anon_285666" + ".rodata.__anon_285991" + ".rodata.__anon_286014" + ".rodata.__anon_286161" + ".rodata.__anon_286177" + ".rodata.__anon_286272" + ".rodata.__anon_286906" + ".rodata.__anon_288012" + ".rodata.__anon_138652" + ".rodata.__anon_294090" ".rodata.compress.flate.token.codegen_order" - ".rodata.__anon_293607" - ".rodata.__anon_293611" - ".rodata.__anon_293632" - ".rodata.__anon_293658" - ".rodata.__anon_293669" - ".rodata.__anon_293738" - ".rodata.__anon_293816" - ".rodata.__anon_293899" - ".rodata.__anon_293971" - ".rodata.__anon_293985" - ".rodata.__anon_294024" - ".rodata.__anon_294080" - ".rodata.__anon_294155" - ".rodata.__anon_294170" - ".rodata.__anon_294261" - ".rodata.__anon_295250" - ".rodata.__anon_296906" - ".rodata.__anon_296987" - ".rodata.__anon_297252" - ".rodata.__anon_297727" - ".rodata.__anon_299645" - ".rodata.__anon_299711" - ".rodata.__anon_300024" - ".rodata.__anon_301394" - ".rodata.__anon_301426" - ".rodata.__anon_301461" - ".rodata.__anon_301478" - ".rodata.__anon_301490" - ".rodata.__anon_301653" - ".rodata.__anon_301861" - ".rodata.__anon_301884" - ".rodata.__anon_301901" - ".rodata.__anon_301913" - ".rodata.__anon_301926" - ".rodata.__anon_301953" - ".rodata.__anon_301969" - ".rodata.__anon_302413" - ".rodata.__anon_302640" - ".rodata.__anon_303232" - ".rodata.__anon_303347" - ".rodata.__anon_303428" - ".rodata.__anon_304431" - ".rodata.__anon_304573" - ".rodata.__anon_307084" - ".rodata.__anon_308095" - ".rodata.__anon_308232" - ".rodata.__anon_309650" - ".rodata.__anon_310321" - ".rodata.__anon_310323" - ".rodata.__anon_310332" - ".rodata.__anon_310335" - ".rodata.__anon_310341" - ".rodata.__anon_310362" - ".rodata.__anon_310453" - ".rodata.__anon_310808" - ".rodata.__anon_311089" - ".rodata.__anon_311476" - ".rodata.__anon_312728" - ".rodata.__anon_314507" - ".rodata.__anon_314580" - ".rodata.__anon_314816" - ".rodata.__anon_315192" - ".rodata.__anon_315353" - ".rodata.__anon_315804" - ".rodata.__anon_315812" - ".rodata.__anon_315895" - ".rodata.__anon_316264" - ".rodata.__anon_316411" - ".rodata.__anon_316826" - ".rodata.__anon_316930" - ".rodata.__anon_317112" - ".rodata.__anon_317124" - ".rodata.__anon_318537" - ".rodata.__anon_318541" - ".rodata.__anon_319044" - ".rodata.__anon_319056" - ".rodata.__anon_319536" - ".rodata.__anon_319551" - ".rodata.__anon_319549" - ".rodata.__anon_319812" - ".rodata.__anon_320669" - ".rodata.__anon_321094" - ".rodata.__anon_321312" - ".rodata.__anon_322798" - ".rodata.__anon_322843" - ".rodata.__anon_323054" - ".rodata.__anon_323180" - ".rodata.__anon_323823" - ".rodata.__anon_323887" - ".rodata.__anon_325024" - ".rodata.__anon_325028" - ".rodata.__anon_325029" - ".rodata.__anon_325533" - ".rodata.__anon_327567" - ".rodata.__anon_328227" - ".rodata.__anon_328249" - ".rodata.__anon_328255" - ".rodata.__anon_328258" - ".rodata.__anon_328895" - ".rodata.__anon_330521" - ".rodata.__anon_333688" - ".rodata.__anon_333743" - ".rodata.__anon_333884" - ".rodata.__anon_333905" - ".rodata.__anon_334113" - ".rodata.__anon_138347" - ".rodata.__anon_334430" - ".rodata.__anon_334821" - ".rodata.__anon_336151" - ".rodata.__anon_336355" - ".rodata.__anon_336661" - ".rodata.__anon_336704" - ".rodata.__anon_336942" - ".rodata.__anon_336950" - ".rodata.__anon_336958" - ".rodata.__anon_337246" - ".rodata.__anon_337522" - ".rodata.__anon_337789" - ".rodata.__anon_337830" - ".rodata.__anon_338084" - ".rodata.__anon_338115" - ".rodata.__anon_338670" - ".rodata.__anon_338806" - ".rodata.__anon_339028" - ".rodata.__anon_339448" - ".rodata.__anon_339450" - ".rodata.__anon_339444" - ".rodata.__anon_339729" - ".rodata.__anon_339833" - ".rodata.__anon_340558" - ".rodata.__anon_340589" - ".rodata.__anon_341265" - ".rodata.__anon_342080" - ".rodata.__anon_342083" - ".rodata.__anon_343004" - ".rodata.__anon_343137" - ".rodata.__anon_343594" - ".rodata.__anon_345251" - ".rodata.__anon_345250" - ".rodata.__anon_150161" - ".rodata.__anon_347235" - ".rodata.__anon_479747" - ".rodata.__anon_480177" - ".rodata.__anon_480208" - ".rodata.__anon_150111" - ".rodata.__anon_150106" - ".rodata.__anon_150101" - ".rodata.__anon_481250" - ".rodata.__anon_481268" - ".rodata.__anon_481333" - ".rodata.__anon_481366" - ".rodata.__anon_481402" - ".rodata.__anon_481472" - ".rodata.__anon_481493" - ".rodata.__anon_481558" - ".rodata.__anon_481595" - ".rodata.__anon_481842" - ".rodata.__anon_481928" - ".rodata.__anon_482067" - ".rodata.__anon_482323" - ".rodata.__anon_482429" - ".rodata.__anon_482850" - ".rodata.__anon_482861" - ".rodata.__anon_482872" - ".rodata.__anon_482815" - ".rodata.__anon_482979" - ".rodata.__anon_483632" - ".rodata.__anon_483901" - ".rodata.__anon_484121" - ".rodata.__anon_484353" - ".rodata.__anon_485950" - ".rodata.__anon_89760" - ".rodata.__anon_150121" - ".rodata.__anon_150126" - ".rodata.__anon_150131" - ".rodata.__anon_150116" - ".rodata.__anon_150071" - ".rodata.__anon_150076" - ".rodata.__anon_150046" - ".rodata.__anon_227116" - ".rodata.__anon_150034" - ".rodata.__anon_487559" - ".rodata.__anon_320783" - ".rodata.__anon_211497" - ".rodata.__anon_211494" - ".rodata.__anon_211504" - ".rodata.__anon_211514" - ".rodata.__anon_487985" - ".rodata.__anon_150171" - ".rodata.__anon_489252" - ".rodata.__anon_150066" - ".rodata.__anon_490435" - ".rodata.__anon_490445" - ".rodata.__anon_490446" - ".rodata.__anon_490454" - ".rodata.__anon_490632" - ".rodata.__anon_150166" - ".rodata.__anon_490991" - ".rodata.__anon_491151" - ".rodata.__anon_491152" - ".rodata.__anon_150091" - ".rodata.__anon_150086" - ".rodata.__anon_492088" - ".rodata.__anon_150056" - ".rodata.__anon_150051" - ".rodata.__anon_492413" - ".rodata.__anon_492976" - ".rodata.__anon_493457" - ".rodata.__anon_150041" - ".rodata.__anon_493849" - ".rodata.__anon_494447" - ".rodata.__anon_494469" - ".rodata.__anon_494491" - ".rodata.__anon_148805" - ".rodata.__anon_148234" - ".rodata.__anon_494632" - ".rodata.__anon_494796" - ".rodata.__anon_494888" - ".rodata.__anon_494892" - ".rodata.__anon_494894" - ".rodata.__anon_494929" - ".rodata.__anon_495038" - ".rodata.__anon_495095" - ".rodata.__anon_495120" - ".rodata.__anon_495138" - ".rodata.__anon_495168" - ".rodata.__anon_177815" - ".rodata.__anon_495472" - ".rodata.__anon_495484" - ".rodata.__anon_495825" - ".rodata.__anon_495846" - ".rodata.__anon_496106" - ".rodata.__anon_496192" - ".rodata.__anon_496214" - ".rodata.__anon_496277" - ".rodata.__anon_496292" - ".rodata.__anon_496316" - ".rodata.__anon_496377" - ".rodata.__anon_496406" - ".rodata.__anon_496586" - ".rodata.__anon_496607" - ".rodata.__anon_496622" - ".rodata.__anon_494459" - ".rodata.__anon_496729" - ".rodata.__anon_496730" - ".rodata.__anon_496812" - ".rodata.__anon_496977" - ".rodata.__anon_497001" - ".rodata.__anon_497100" - ".rodata.__anon_497267" - ".rodata.__anon_497295" - ".rodata.__anon_497547" - ".rodata.__anon_497561" - ".rodata.__anon_497722" - ".rodata.__anon_498050" - ".rodata.__anon_498177" - ".rodata.__anon_498426" - ".rodata.__anon_498452" - ".rodata.__anon_498490" - ".rodata.__anon_498511" - ".rodata.__anon_498567" - ".rodata.__anon_498682" - ".rodata.__anon_499594" - ".rodata.__anon_499691" - ".rodata.__anon_500044" - ".rodata.__anon_500632" - ".rodata.__anon_500664" - ".rodata.__anon_500743" - ".rodata.__anon_500777" - ".rodata.__anon_501038" - ".rodata.__anon_501147" - ".rodata.__anon_501212" - ".rodata.__anon_501232" - ".rodata.__anon_502218" - ".rodata.__anon_502243" - ".rodata.__anon_502345" - ".rodata.__anon_502363" - ".rodata.__anon_502830" - ".rodata.__anon_503426" - ".rodata.__anon_503430" - ".rodata.__anon_503442" - ".rodata.__anon_503458" - ".rodata.__anon_517885" - ".rodata.__anon_517886" - ".rodata.__anon_517887" + ".rodata.__anon_294281" + ".rodata.__anon_294285" + ".rodata.__anon_294306" + ".rodata.__anon_294332" + ".rodata.__anon_294343" + ".rodata.__anon_294412" + ".rodata.__anon_294490" + ".rodata.__anon_294573" + ".rodata.__anon_294645" + ".rodata.__anon_294659" + ".rodata.__anon_294698" + ".rodata.__anon_294754" + ".rodata.__anon_294829" + ".rodata.__anon_294844" + ".rodata.__anon_294935" + ".rodata.__anon_295924" + ".rodata.__anon_297580" + ".rodata.__anon_297661" + ".rodata.__anon_297926" + ".rodata.__anon_298401" + ".rodata.__anon_300319" + ".rodata.__anon_300385" + ".rodata.__anon_300698" + ".rodata.__anon_302068" + ".rodata.__anon_302100" + ".rodata.__anon_302135" + ".rodata.__anon_302152" + ".rodata.__anon_302164" + ".rodata.__anon_302327" + ".rodata.__anon_302535" + ".rodata.__anon_302558" + ".rodata.__anon_302575" + ".rodata.__anon_302587" + ".rodata.__anon_302600" + ".rodata.__anon_302627" + ".rodata.__anon_302643" + ".rodata.__anon_303087" + ".rodata.__anon_303314" + ".rodata.__anon_303516" + ".rodata.__anon_303991" + ".rodata.__anon_304124" + ".rodata.__anon_304205" + ".rodata.__anon_305208" + ".rodata.__anon_305350" + ".rodata.__anon_307861" + ".rodata.__anon_308872" + ".rodata.__anon_309009" + ".rodata.__anon_310427" + ".rodata.__anon_311098" + ".rodata.__anon_311100" + ".rodata.__anon_311109" + ".rodata.__anon_311112" + ".rodata.__anon_311118" + ".rodata.__anon_311139" + ".rodata.__anon_311230" + ".rodata.__anon_311585" + ".rodata.__anon_311866" + ".rodata.__anon_312253" + ".rodata.__anon_313510" + ".rodata.__anon_315289" + ".rodata.__anon_315362" + ".rodata.__anon_315598" + ".rodata.__anon_315974" + ".rodata.__anon_316135" + ".rodata.__anon_316586" + ".rodata.__anon_316594" + ".rodata.__anon_316677" + ".rodata.__anon_317046" + ".rodata.__anon_317193" + ".rodata.__anon_317608" + ".rodata.__anon_317712" + ".rodata.__anon_317894" + ".rodata.__anon_317906" + ".rodata.__anon_319319" + ".rodata.__anon_319323" + ".rodata.__anon_319826" + ".rodata.__anon_319838" + ".rodata.__anon_320318" + ".rodata.__anon_320333" + ".rodata.__anon_320331" + ".rodata.__anon_320594" + ".rodata.__anon_321451" + ".rodata.__anon_321876" + ".rodata.__anon_322094" + ".rodata.__anon_323580" + ".rodata.__anon_323625" + ".rodata.__anon_323836" + ".rodata.__anon_323962" + ".rodata.__anon_324605" + ".rodata.__anon_324669" + ".rodata.__anon_325806" + ".rodata.__anon_325810" + ".rodata.__anon_325811" + ".rodata.__anon_326315" + ".rodata.__anon_328349" + ".rodata.__anon_329009" + ".rodata.__anon_329031" + ".rodata.__anon_329037" + ".rodata.__anon_329040" + ".rodata.__anon_329677" + ".rodata.__anon_331303" + ".rodata.__anon_334470" + ".rodata.__anon_334525" + ".rodata.__anon_334666" + ".rodata.__anon_334687" + ".rodata.__anon_139300" + ".rodata.__anon_335212" + ".rodata.__anon_335603" + ".rodata.__anon_336933" + ".rodata.__anon_337137" + ".rodata.__anon_337443" + ".rodata.__anon_337486" + ".rodata.__anon_337724" + ".rodata.__anon_337732" + ".rodata.__anon_337740" + ".rodata.__anon_338028" + ".rodata.__anon_338310" + ".rodata.__anon_338577" + ".rodata.__anon_338618" + ".rodata.__anon_338872" + ".rodata.__anon_338903" + ".rodata.__anon_339458" + ".rodata.__anon_339594" + ".rodata.__anon_339816" + ".rodata.__anon_340236" + ".rodata.__anon_340238" + ".rodata.__anon_340232" + ".rodata.__anon_340517" + ".rodata.__anon_340621" + ".rodata.__anon_341346" + ".rodata.__anon_341377" + ".rodata.__anon_342053" + ".rodata.__anon_342868" + ".rodata.__anon_342871" + ".rodata.__anon_343792" + ".rodata.__anon_343925" + ".rodata.__anon_344382" + ".rodata.__anon_346039" + ".rodata.__anon_346038" + ".rodata.__anon_151112" + ".rodata.__anon_348015" + ".rodata.__anon_480524" + ".rodata.__anon_480954" + ".rodata.__anon_480985" + ".rodata.__anon_151062" + ".rodata.__anon_151057" + ".rodata.__anon_151052" + ".rodata.__anon_482027" + ".rodata.__anon_482045" + ".rodata.__anon_482110" + ".rodata.__anon_482143" + ".rodata.__anon_482179" + ".rodata.__anon_482249" + ".rodata.__anon_482270" + ".rodata.__anon_482335" + ".rodata.__anon_482372" + ".rodata.__anon_482619" + ".rodata.__anon_482844" + ".rodata.__anon_483100" + ".rodata.__anon_483206" + ".rodata.__anon_483627" + ".rodata.__anon_483638" + ".rodata.__anon_483649" + ".rodata.__anon_483592" + ".rodata.__anon_483756" + ".rodata.__anon_484409" + ".rodata.__anon_484678" + ".rodata.__anon_484897" + ".rodata.__anon_485129" + ".rodata.__anon_486723" + ".rodata.__anon_90591" + ".rodata.__anon_151072" + ".rodata.__anon_151077" + ".rodata.__anon_151082" + ".rodata.__anon_151067" + ".rodata.__anon_151022" + ".rodata.__anon_151027" + ".rodata.__anon_150997" + ".rodata.__anon_227847" + ".rodata.__anon_150985" + ".rodata.__anon_488332" + ".rodata.__anon_321565" + ".rodata.__anon_212228" + ".rodata.__anon_212225" + ".rodata.__anon_212235" + ".rodata.__anon_212245" + ".rodata.__anon_488758" + ".rodata.__anon_151122" + ".rodata.__anon_490025" + ".rodata.__anon_151017" + ".rodata.__anon_491208" + ".rodata.__anon_491218" + ".rodata.__anon_491219" + ".rodata.__anon_491227" + ".rodata.__anon_491405" + ".rodata.__anon_151117" + ".rodata.__anon_491764" + ".rodata.__anon_491924" + ".rodata.__anon_491925" + ".rodata.__anon_151042" + ".rodata.__anon_151037" + ".rodata.__anon_492861" + ".rodata.__anon_151007" + ".rodata.__anon_151002" + ".rodata.__anon_493186" + ".rodata.__anon_493749" + ".rodata.__anon_494230" + ".rodata.__anon_150992" + ".rodata.__anon_494622" + ".rodata.__anon_495220" + ".rodata.__anon_495242" + ".rodata.__anon_495264" + ".rodata.__anon_149756" + ".rodata.__anon_149185" + ".rodata.__anon_495405" + ".rodata.__anon_495569" + ".rodata.__anon_495661" + ".rodata.__anon_495665" + ".rodata.__anon_495667" + ".rodata.__anon_495702" + ".rodata.__anon_495811" + ".rodata.__anon_495868" + ".rodata.__anon_518659" + ".rodata.__anon_518660" ".rodata.crypto.aes.soft.sbox_key_schedule" - ".rodata.__anon_521883" - ".rodata.__anon_521899" - ".rodata.__anon_521952" - ".rodata.__anon_521975" - ".rodata.__anon_522003" - ".rodata.__anon_522088" - ".rodata.__anon_900652" - ".rodata.__anon_900661" - ".rodata.__anon_900732" - ".rodata.__anon_900772" - ".rodata.__anon_900798" - ".rodata.__anon_900847" - ".rodata.__anon_900869" - ".rodata.__anon_900906" - ".rodata.__anon_904635" - ".rodata.__anon_905299" - ".rodata.__anon_905449" - ".rodata.__anon_905479" - ".rodata.__anon_905869" - ".rodata.__anon_906365" - ".rodata.__anon_907524" - ".rodata.__anon_907624" - ".rodata.__anon_907630" - ".rodata.__anon_907776" - ".rodata.__anon_907787" - ".rodata.__anon_907796" - ".rodata.__anon_907814" - ".rodata.__anon_907884" - ".rodata.__anon_907888" - ".rodata.__anon_907942" - ".rodata.__anon_908010" - ".rodata.__anon_908571" - ".rodata.__anon_908576" - ".rodata.__anon_908605" - ".rodata.__anon_912114" - ".rodata.__anon_912338" - ".rodata.__anon_912434" - ".rodata.__anon_912488" - ".rodata.__anon_912597" - ".rodata.__anon_912637" - ".rodata.__anon_912648" - ".rodata.__anon_912726" - ".rodata.__anon_912852" - ".rodata.__anon_912920" - ".rodata.__anon_912997" - ".rodata.__anon_913084" - ".rodata.__anon_913116" - ".rodata.__anon_913126" - ".rodata.__anon_913175" - ".rodata.__anon_913263" - ".rodata.__anon_913274" - ".rodata.__anon_913398" - ".rodata.__anon_913496" - ".rodata.__anon_913578" - ".rodata.__anon_913602" - ".rodata.__anon_913613" - ".rodata.__anon_913636" - ".rodata.__anon_913687" - ".rodata.__anon_913863" - ".rodata.__anon_913980" - ".rodata.__anon_914020" - ".rodata.__anon_914136" - ".rodata.__anon_914175" - ".rodata.__anon_914296" - ".rodata.__anon_914413" - ".rodata.__anon_914487" - ".rodata.__anon_914611" - ".rodata.__anon_914650" - ".rodata.__anon_914691" - ".rodata.__anon_914750" - ".rodata.__anon_914799" - ".rodata.__anon_914851" - ".rodata.__anon_914904" - ".rodata.__anon_915039" - ".rodata.__anon_915141" - ".rodata.__anon_915241" - ".rodata.__anon_915304" - ".rodata.__anon_915700" - ".rodata.__anon_915762" - ".rodata.__anon_915821" - ".rodata.__anon_915893" - ".rodata.__anon_916036" - ".rodata.__anon_916052" - ".rodata.__anon_916164" - ".rodata.__anon_916310" - ".rodata.__anon_916334" - ".rodata.__anon_916664" - ".rodata.__anon_916885" - ".rodata.__anon_917010" - ".rodata.__anon_917134" - ".rodata.__anon_917453" - ".rodata.__anon_917598" - ".rodata.__anon_917732" - ".rodata.__anon_917823" - ".rodata.__anon_917918" - ".rodata.__anon_917979" - ".rodata.__anon_918090" - ".rodata.__anon_918151" - ".rodata.__anon_918239" - ".rodata.__anon_918285" - ".rodata.__anon_918323" - ".rodata.__anon_918425" - ".rodata.__anon_918463" - ".rodata.__anon_918483" - ".rodata.__anon_918590" - ".rodata.__anon_918658" - ".rodata.__anon_918830" - ".rodata.__anon_918869" - ".rodata.__anon_918908" - ".rodata.__anon_918985" - ".rodata.__anon_919008" - ".rodata.__anon_919026" - ".rodata.__anon_919267" - ".rodata.__anon_919345" - ".rodata.__anon_919495" - ".rodata.__anon_919637" - ".rodata.__anon_919799" - ".rodata.__anon_919832" - ".rodata.__anon_919936" - ".rodata.__anon_920004" - ".rodata.__anon_920124" - ".rodata.__anon_920322" - ".rodata.__anon_147503" - ".rodata.__anon_921464" - ".rodata.__anon_921530" - ".rodata.__anon_925481" - ".rodata.__anon_926291" - ".rodata.__anon_927079" - ".rodata.__anon_927085" - ".rodata.__anon_947046" - ".rodata.__anon_947671" - ".rodata.__anon_947528" - ".rodata.__anon_948949" - ".rodata.__anon_949157" - ".rodata.__anon_949186" - ".rodata.__anon_950411" - ".rodata.__anon_950412" - ".rodata.__anon_950415" - ".rodata.__anon_950464" - ".rodata.__anon_950474" - ".rodata.__anon_950942" - ".rodata.__anon_951334" - ".rodata.__anon_951692" - ".rodata.__anon_951976" - ".rodata.__anon_951979" - ".rodata.__anon_952334" - ".rodata.__anon_857760" - ".rodata.__anon_953666" - ".rodata.__anon_953646" - ".rodata.__anon_956952" - ".rodata.__anon_957158" - ".rodata.__anon_957159" - ".rodata.__anon_957160" - ".rodata.__anon_957162" - ".rodata.__anon_957206" - ".rodata.__anon_957213" - ".rodata.__anon_957229" - ".rodata.__anon_958500" - ".rodata.__anon_961684" - ".rodata.__anon_961699" - ".rodata.__anon_961771" - ".rodata.__anon_961786" - ".rodata.__anon_961787" - ".rodata.__anon_962216" - ".rodata.__anon_962387" - ".rodata.__anon_962417" - ".rodata.__anon_962480" - ".rodata.__anon_962511" - ".rodata.__anon_962523" - ".rodata.__anon_962550" - ".rodata.__anon_962560" - ".rodata.__anon_962569" - ".rodata.__anon_962574" - ".rodata.__anon_962583" - ".rodata.__anon_963034" - ".rodata.__anon_963432" - ".rodata.__anon_963558" - ".rodata.__anon_963587" - ".rodata.__anon_955948" - ".rodata.__anon_963881" - ".rodata.__anon_963907" - ".rodata.__anon_964093" - ".rodata.__anon_970561" - ".rodata.__anon_970616" - ".rodata.__anon_970694" - ".rodata.__anon_970768" - ".rodata.__anon_970832" - ".rodata.__anon_970902" - ".rodata.__anon_970965" - ".rodata.__anon_971035" - ".rodata.__anon_971098" - ".rodata.__anon_971166" - ".rodata.__anon_971225" - ".rodata.__anon_971285" - ".rodata.__anon_971349" - ".rodata.__anon_971389" - ".rodata.__anon_971453" - ".rodata.__anon_971514" - ".rodata.__anon_971583" - ".rodata.__anon_971644" - ".rodata.__anon_971705" - ".rodata.__anon_971766" - ".rodata.__anon_971849" - ".rodata.__anon_971891" - ".rodata.__anon_972006" - ".rodata.__anon_972075" - ".rodata.__anon_972143" - ".rodata.__anon_972211" - ".rodata.__anon_972279" - ".rodata.__anon_972346" - ".rodata.__anon_972413" - ".rodata.__anon_972480" - ".rodata.__anon_972546" - ".rodata.__anon_972612" - ".rodata.__anon_972683" - ".rodata.__anon_972724" - ".rodata.__anon_972838" - ".rodata.__anon_972909" - ".rodata.__anon_972980" - ".rodata.__anon_973050" - ".rodata.__anon_973120" - ".rodata.__anon_973190" - ".rodata.__anon_973259" - ".rodata.__anon_973328" - ".rodata.__anon_973391" - ".rodata.__anon_973424" - ".rodata.__anon_973459" - ".rodata.__anon_973519" - ".rodata.__anon_973578" - ".rodata.__anon_973637" - ".rodata.__anon_973696" - ".rodata.__anon_973754" - ".rodata.__anon_973812" - ".rodata.__anon_973870" - ".rodata.__anon_973927" - ".rodata.__anon_973985" - ".rodata.__anon_974042" - ".rodata.__anon_974134" - ".rodata.__anon_974202" - ".rodata.__anon_974315" - ".rodata.__anon_974379" - ".rodata.__anon_974446" - ".rodata.__anon_974506" - ".rodata.__anon_974568" - ".rodata.__anon_974624" - ".rodata.__anon_974684" - ".rodata.__anon_974744" - ".rodata.__anon_974811" - ".rodata.__anon_974869" - ".rodata.__anon_974927" - ".rodata.__anon_974985" - ".rodata.__anon_975048" - ".rodata.__anon_975106" - ".rodata.__anon_975175" - ".rodata.__anon_975210" - ".rodata.__anon_975247" - ".rodata.__anon_975314" - ".rodata.__anon_975381" - ".rodata.__anon_975448" - ".rodata.__anon_975514" - ".rodata.__anon_975580" - ".rodata.__anon_975646" - ".rodata.__anon_975711" - ".rodata.__anon_975775" - ".rodata.__anon_975812" - ".rodata.__anon_975870" - ".rodata.__anon_975925" - ".rodata.__anon_975978" - ".rodata.__anon_976015" - ".rodata.__anon_976073" - ".rodata.__anon_976128" - ".rodata.__anon_976182" - ".rodata.__anon_976235" - ".rodata.__anon_976299" - ".rodata.__anon_976413" - ".rodata.__anon_976467" - ".rodata.__anon_976525" - ".rodata.__anon_976580" - ".rodata.__anon_976634" - ".rodata.__anon_976687" - ".rodata.__anon_976748" - ".rodata.__anon_976810" - ".rodata.__anon_976846" - ".rodata.__anon_976881" + ".rodata.__anon_522656" + ".rodata.__anon_522672" + ".rodata.__anon_522725" + ".rodata.__anon_522748" + ".rodata.__anon_522776" + ".rodata.__anon_522861" + ".rodata.__anon_522859" + ".rodata.__anon_901544" + ".rodata.__anon_901570" + ".rodata.__anon_901619" + ".rodata.__anon_901641" + ".rodata.__anon_901678" + ".rodata.__anon_905407" + ".rodata.__anon_906071" + ".rodata.__anon_906221" + ".rodata.__anon_906251" + ".rodata.__anon_906641" + ".rodata.__anon_907137" + ".rodata.__anon_908296" + ".rodata.__anon_908396" + ".rodata.__anon_908402" + ".rodata.__anon_908548" + ".rodata.__anon_908559" + ".rodata.__anon_908568" + ".rodata.__anon_908586" + ".rodata.__anon_908656" + ".rodata.__anon_908660" + ".rodata.__anon_908714" + ".rodata.__anon_908782" + ".rodata.__anon_909343" + ".rodata.__anon_909348" + ".rodata.__anon_909377" + ".rodata.__anon_909567" + ".rodata.__anon_910286" + ".rodata.__anon_910291" + ".rodata.__anon_914268" + ".rodata.__anon_914350" + ".rodata.__anon_914374" + ".rodata.__anon_914385" + ".rodata.__anon_914408" + ".rodata.__anon_914459" + ".rodata.__anon_914635" + ".rodata.__anon_914752" + ".rodata.__anon_914792" + ".rodata.__anon_914908" + ".rodata.__anon_914947" + ".rodata.__anon_915068" + ".rodata.__anon_915185" + ".rodata.__anon_915259" + ".rodata.__anon_915383" + ".rodata.__anon_915422" + ".rodata.__anon_915463" + ".rodata.__anon_915522" + ".rodata.__anon_915571" + ".rodata.__anon_915623" + ".rodata.__anon_915676" + ".rodata.__anon_915811" + ".rodata.__anon_915913" + ".rodata.__anon_916013" + ".rodata.__anon_916076" + ".rodata.__anon_916472" + ".rodata.__anon_916534" + ".rodata.__anon_916593" + ".rodata.__anon_916665" + ".rodata.__anon_916808" + ".rodata.__anon_916824" + ".rodata.__anon_916936" + ".rodata.__anon_917082" + ".rodata.__anon_917106" + ".rodata.__anon_917436" + ".rodata.__anon_917657" + ".rodata.__anon_917782" + ".rodata.__anon_917906" + ".rodata.__anon_918225" + ".rodata.__anon_918370" + ".rodata.__anon_918504" + ".rodata.__anon_918595" + ".rodata.__anon_918690" + ".rodata.__anon_918751" + ".rodata.__anon_918862" + ".rodata.__anon_918923" + ".rodata.__anon_919011" + ".rodata.__anon_919057" + ".rodata.__anon_919095" + ".rodata.__anon_919197" + ".rodata.__anon_919235" + ".rodata.__anon_919255" + ".rodata.__anon_919362" + ".rodata.__anon_919430" + ".rodata.__anon_919602" + ".rodata.__anon_919641" + ".rodata.__anon_919680" + ".rodata.__anon_919757" + ".rodata.__anon_919780" + ".rodata.__anon_919798" + ".rodata.__anon_920039" + ".rodata.__anon_920117" + ".rodata.__anon_920267" + ".rodata.__anon_920409" + ".rodata.__anon_920571" + ".rodata.__anon_920604" + ".rodata.__anon_920708" + ".rodata.__anon_920776" + ".rodata.__anon_920896" + ".rodata.__anon_921094" + ".rodata.__anon_148454" + ".rodata.__anon_922236" + ".rodata.__anon_922302" + ".rodata.__anon_926253" + ".rodata.__anon_927063" + ".rodata.__anon_927851" + ".rodata.__anon_927857" + ".rodata.__anon_932295" + ".rodata.__anon_932521" + ".rodata.__anon_932637" + ".rodata.__anon_932725" + ".rodata.__anon_932753" + ".rodata.__anon_932978" + ".rodata.__anon_932986" + ".rodata.__anon_933005" + ".rodata.__anon_933961" + ".rodata.__anon_934247" + ".rodata.__anon_934284" + ".rodata.__anon_934486" + ".rodata.__anon_934519" + ".rodata.__anon_934867" + ".rodata.__anon_934915" + ".rodata.__anon_934958" + ".rodata.__anon_935000" + ".rodata.__anon_935055" + ".rodata.__anon_935096" + ".rodata.__anon_935137" + ".rodata.__anon_935484" + ".rodata.__anon_935485" + ".rodata.__anon_935487" + ".rodata.__anon_935489" + ".rodata.__anon_935491" + ".rodata.__anon_935495" + ".rodata.__anon_936139" + ".rodata.__anon_934957" + ".rodata.__anon_936210" + ".rodata.__anon_936263" + ".rodata.__anon_936313" + ".rodata.__anon_936363" + ".rodata.__anon_936388" + ".rodata.__anon_936444" + ".rodata.__anon_936470" + ".rodata.__anon_936512" + ".rodata.__anon_936561" + ".rodata.__anon_936605" + ".rodata.__anon_936669" + ".rodata.__anon_936721" + ".rodata.__anon_936768" + ".rodata.__anon_936853" + ".rodata.__anon_936894" + ".rodata.__anon_936948" + ".rodata.__anon_937003" + ".rodata.__anon_937052" + ".rodata.__anon_937169" + ".rodata.__anon_937217" + ".rodata.__anon_937257" + ".rodata.__anon_937311" + ".rodata.__anon_937367" + ".rodata.__anon_937409" + ".rodata.__anon_937485" + ".rodata.__anon_937582" + ".rodata.__anon_937633" + ".rodata.__anon_937670" + ".rodata.__anon_939003" + ".rodata.__anon_939692" + ".rodata.__anon_939727" + ".rodata.__anon_939833" + ".rodata.__anon_939891" + ".rodata.__anon_940004" + ".rodata.__anon_940092" + ".rodata.__anon_941623" + ".rodata.__anon_941626" + ".rodata.__anon_941826" + ".rodata.__anon_941830" + ".rodata.__anon_942314" + ".rodata.__anon_942324" + ".rodata.__anon_944156" + ".rodata.__anon_944406" + ".rodata.__anon_945160" + ".rodata.__anon_945161" + ".rodata.__anon_945162" + ".rodata.__anon_945163" + ".rodata.__anon_945164" + ".rodata.__anon_945165" + ".rodata.__anon_945166" + ".rodata.__anon_945167" + ".rodata.__anon_945168" + ".rodata.__anon_945169" + ".rodata.__anon_945170" + ".rodata.__anon_945171" + ".rodata.__anon_945172" + ".rodata.__anon_945173" + ".rodata.__anon_945174" + ".rodata.__anon_945175" + ".rodata.__anon_945176" + ".rodata.__anon_945177" + ".rodata.__anon_945179" + ".rodata.__anon_946175" + ".rodata.__anon_946216" + ".rodata.__anon_947338" + ".rodata.__anon_947633" + ".rodata.__anon_947818" + ".rodata.__anon_948443" + ".rodata.__anon_948300" + ".rodata.__anon_949721" + ".rodata.__anon_949929" + ".rodata.__anon_949958" + ".rodata.__anon_951183" + ".rodata.__anon_951184" + ".rodata.__anon_951187" + ".rodata.__anon_951236" + ".rodata.__anon_951246" + ".rodata.__anon_951714" + ".rodata.__anon_952106" + ".rodata.__anon_952464" + ".rodata.__anon_952748" + ".rodata.__anon_952751" + ".rodata.__anon_953106" + ".rodata.__anon_858532" + ".rodata.__anon_954438" + ".rodata.__anon_954418" + ".rodata.__anon_957724" + ".rodata.__anon_957930" + ".rodata.__anon_957931" + ".rodata.__anon_957932" + ".rodata.__anon_957934" + ".rodata.__anon_957978" + ".rodata.__anon_957985" + ".rodata.__anon_958001" + ".rodata.__anon_959272" + ".rodata.__anon_962456" + ".rodata.__anon_962471" + ".rodata.__anon_962543" + ".rodata.__anon_962558" + ".rodata.__anon_962559" + ".rodata.__anon_962988" + ".rodata.__anon_963159" + ".rodata.__anon_963189" + ".rodata.__anon_963252" + ".rodata.__anon_963283" + ".rodata.__anon_963295" + ".rodata.__anon_963322" + ".rodata.__anon_963332" + ".rodata.__anon_963341" + ".rodata.__anon_963346" + ".rodata.__anon_963355" + ".rodata.__anon_963806" + ".rodata.__anon_964204" + ".rodata.__anon_964330" + ".rodata.__anon_964359" + ".rodata.__anon_956720" + ".rodata.__anon_964653" + ".rodata.__anon_964679" + ".rodata.__anon_964865" + ".rodata.__anon_971333" + ".rodata.__anon_971388" + ".rodata.__anon_971466" + ".rodata.__anon_971540" + ".rodata.__anon_971604" + ".rodata.__anon_971674" + ".rodata.__anon_971737" + ".rodata.__anon_971807" + ".rodata.__anon_971870" + ".rodata.__anon_971938" + ".rodata.__anon_971997" + ".rodata.__anon_972057" + ".rodata.__anon_972121" + ".rodata.__anon_972161" + ".rodata.__anon_972225" + ".rodata.__anon_972286" + ".rodata.__anon_972355" + ".rodata.__anon_972416" + ".rodata.__anon_972477" + ".rodata.__anon_972538" + ".rodata.__anon_972621" + ".rodata.__anon_972663" + ".rodata.__anon_972778" + ".rodata.__anon_972847" + ".rodata.__anon_972915" + ".rodata.__anon_972983" + ".rodata.__anon_973051" + ".rodata.__anon_973118" + ".rodata.__anon_973185" + ".rodata.__anon_973252" + ".rodata.__anon_973318" + ".rodata.__anon_973384" + ".rodata.__anon_973455" + ".rodata.__anon_973496" + ".rodata.__anon_973610" + ".rodata.__anon_973681" + ".rodata.__anon_973752" + ".rodata.__anon_973822" + ".rodata.__anon_973892" + ".rodata.__anon_973962" + ".rodata.__anon_974031" + ".rodata.__anon_974100" + ".rodata.__anon_974163" + ".rodata.__anon_974196" + ".rodata.__anon_974231" + ".rodata.__anon_974291" + ".rodata.__anon_974350" + ".rodata.__anon_974409" + ".rodata.__anon_974468" + ".rodata.__anon_974526" + ".rodata.__anon_974584" + ".rodata.__anon_974642" + ".rodata.__anon_974699" + ".rodata.__anon_974757" + ".rodata.__anon_974814" + ".rodata.__anon_974906" + ".rodata.__anon_974974" + ".rodata.__anon_975087" + ".rodata.__anon_975151" + ".rodata.__anon_975218" + ".rodata.__anon_975278" + ".rodata.__anon_975340" + ".rodata.__anon_975396" + ".rodata.__anon_975456" + ".rodata.__anon_975516" + ".rodata.__anon_975583" + ".rodata.__anon_975641" + ".rodata.__anon_975699" + ".rodata.__anon_975757" + ".rodata.__anon_975820" + ".rodata.__anon_975878" + ".rodata.__anon_975947" + ".rodata.__anon_975982" + ".rodata.__anon_976019" + ".rodata.__anon_976086" + ".rodata.__anon_976153" + ".rodata.__anon_976220" + ".rodata.__anon_976286" + ".rodata.__anon_976352" + ".rodata.__anon_976418" + ".rodata.__anon_976483" + ".rodata.__anon_976547" + ".rodata.__anon_976584" + ".rodata.__anon_976642" + ".rodata.__anon_976697" + ".rodata.__anon_976750" + ".rodata.__anon_976787" + ".rodata.__anon_976845" + ".rodata.__anon_976900" ".rodata.__anon_976954" - ".rodata.__anon_977022" - ".rodata.__anon_977086" - ".rodata.__anon_977145" - ".rodata.__anon_977213" - ".rodata.__anon_977276" - ".rodata.__anon_977324" - ".rodata.__anon_977394" - ".rodata.__anon_977456" - ".rodata.__anon_977498" - ".rodata.__anon_977541" + ".rodata.__anon_977007" + ".rodata.__anon_977071" + ".rodata.__anon_977185" + ".rodata.__anon_977239" + ".rodata.__anon_977297" + ".rodata.__anon_977352" + ".rodata.__anon_977406" + ".rodata.__anon_977459" + ".rodata.__anon_977520" ".rodata.__anon_977582" + ".rodata.__anon_977618" ".rodata.__anon_977653" - ".rodata.__anon_977718" - ".rodata.__anon_977783" - ".rodata.__anon_977848" - ".rodata.__anon_977963" - ".rodata.__anon_977981" - ".rodata.__anon_978082" - ".rodata.__anon_979151" - ".rodata.__anon_979667" - ".rodata.__anon_982281" - ".rodata.__anon_982387" - ".rodata.__anon_982526" - ".rodata.__anon_982534" - ".rodata.__anon_982540" - ".rodata.__anon_982564" - ".rodata.__anon_982570" - ".rodata.__anon_982645" - ".rodata.__anon_137543" - ".rodata.__anon_982649" - ".rodata.__anon_985681" - ".rodata.__anon_985167" - ".rodata.__anon_986622" - ".rodata.__anon_986211" - ".rodata.__anon_986659" - ".rodata.__anon_986792" - ".rodata.__anon_923041" - ".rodata.__anon_986791" - ".rodata.__anon_986886" - ".rodata.__anon_987820" - ".rodata.__anon_987900" - ".rodata.__anon_988149" - ".rodata.__anon_988433" - ".rodata.__anon_988554" - ".rodata.__anon_988614" - ".rodata.__anon_988910" - ".rodata.__anon_988934" - ".rodata.__anon_989110" - ".rodata.__anon_989255" - ".rodata.__anon_989280" - ".rodata.__anon_989462" - ".rodata.__anon_989493" - ".rodata.__anon_989622" - ".rodata.__anon_991805" - ".rodata.__anon_1003550" - ".rodata.__anon_1003715" - ".rodata.__anon_1003757" - ".rodata.__anon_1003903" - ".rodata.__anon_1003942" - ".rodata.__anon_993359" - ".rodata.__anon_1004144" - ".rodata.__anon_1005473" - ".rodata.__anon_1008257" - ".rodata.__anon_1009466" - ".rodata.__anon_1009631" - ".rodata.__anon_1010693" - ".rodata.__anon_1010688" - ".rodata.__anon_1011099" - ".rodata.__anon_1011172" - ".rodata.__anon_1011260" - ".rodata.__anon_1011263" - ".rodata.__anon_1011392" - ".rodata.__anon_1011579" - ".rodata.__anon_1011801" - ".rodata.__anon_1011860" - ".rodata.__anon_1011862" - ".rodata.__anon_1011878" - ".rodata.__anon_1012685" - ".rodata.__anon_1012860" - ".rodata.__anon_1012861" - ".rodata.__anon_1013293" - ".rodata.__anon_1013345" - ".rodata.__anon_1013382" - ".rodata.__anon_287371" - ".rodata.__anon_1013514" - ".rodata.__anon_287369" - ".rodata.__anon_1013758" - ".rodata.__anon_1013776" - ".rodata.__anon_1013976" - ".rodata.__anon_1014018" - ".rodata.__anon_1014174" - ".rodata.__anon_1014265" - ".rodata.__anon_1014544" - ".rodata.__anon_1014521" - ".rodata.__anon_1014523" - ".rodata.__anon_1015527" - ".rodata.__anon_177823" - ".rodata.__anon_1015612" + ".rodata.__anon_977726" + ".rodata.__anon_977794" + ".rodata.__anon_977858" + ".rodata.__anon_977917" + ".rodata.__anon_977985" + ".rodata.__anon_978048" + ".rodata.__anon_978096" + ".rodata.__anon_978166" + ".rodata.__anon_978228" + ".rodata.__anon_978270" + ".rodata.__anon_978313" + ".rodata.__anon_978354" + ".rodata.__anon_978425" + ".rodata.__anon_978490" + ".rodata.__anon_978555" + ".rodata.__anon_978620" + ".rodata.__anon_978735" + ".rodata.__anon_978753" + ".rodata.__anon_978854" + ".rodata.__anon_979923" + ".rodata.__anon_980439" + ".rodata.__anon_983053" + ".rodata.__anon_983159" + ".rodata.__anon_983298" + ".rodata.__anon_983306" + ".rodata.__anon_983312" + ".rodata.__anon_983336" + ".rodata.__anon_983342" + ".rodata.__anon_983417" + ".rodata.__anon_138496" + ".rodata.__anon_983421" + ".rodata.__anon_986453" + ".rodata.__anon_985939" + ".rodata.__anon_987394" + ".rodata.__anon_986983" + ".rodata.__anon_987431" + ".rodata.__anon_987564" + ".rodata.__anon_923813" + ".rodata.__anon_987563" + ".rodata.__anon_987658" + ".rodata.__anon_988592" + ".rodata.__anon_988672" + ".rodata.__anon_988921" + ".rodata.__anon_989205" + ".rodata.__anon_989326" + ".rodata.__anon_989386" + ".rodata.__anon_989682" + ".rodata.__anon_989706" + ".rodata.__anon_989882" + ".rodata.__anon_990027" + ".rodata.__anon_990052" + ".rodata.__anon_990234" + ".rodata.__anon_990265" + ".rodata.__anon_990394" + ".rodata.__anon_992577" + ".rodata.str1.4" + ".rodata.__anon_1003204" + ".rodata.__anon_1004326" + ".rodata.__anon_1004491" + ".rodata.__anon_1004533" + ".rodata.__anon_1004679" + ".rodata.__anon_1004718" + ".rodata.__anon_994135" + ".rodata.__anon_1004920" + ".rodata.__anon_1006255" + ".rodata.__anon_1009091" + ".rodata.__anon_288045" + ".rodata.__anon_1014347" + ".rodata.__anon_288043" + ".rodata.__anon_1014591" + ".rodata.__anon_1014609" + ".rodata.__anon_1014809" + ".rodata.__anon_1014851" + ".rodata.__anon_1015007" + ".rodata.__anon_1015098" + ".rodata.__anon_1015377" + ".rodata.__anon_1015354" + ".rodata.__anon_1015356" + ".rodata.__anon_1016360" + ".rodata.__anon_178554" + ".rodata.__anon_1016445" ".rodata.browser.webapi.canvas.OffscreenCanvas.BlankPNG.bytes" - ".rodata.__anon_1014985" - ".rodata.__anon_1023777" - ".rodata.__anon_1023880" - ".rodata.__anon_1024830" - ".rodata.__anon_1025340" - ".rodata.__anon_1025789" - ".rodata.__anon_1026850" - ".rodata.__anon_1026892" - ".rodata.__anon_1027226" - ".rodata.__anon_1028715" - ".rodata.__anon_1029335" - ".rodata.__anon_1029298" - ".rodata.__anon_1030959" - ".rodata.__anon_1030961" - ".rodata.__anon_1030963" - ".rodata.__anon_1030949" - ".rodata.__anon_1031114" - ".rodata.__anon_1031373" - ".rodata.__anon_1031380" - ".rodata.__anon_1031346" - ".rodata.__anon_232934" - ".rodata.__anon_1035178" - ".rodata.__anon_1035316" - ".rodata.__anon_242323" - ".rodata.__anon_231204" - ".rodata.__anon_231213" - ".rodata.__anon_1038845" - ".rodata.__anon_150136" - ".rodata.__anon_1040291" - ".rodata.__anon_1041153" - ".rodata.__anon_1042643" - ".rodata.__anon_1043415" - ".rodata.__anon_1043576" - ".rodata.__anon_1043927" - ".rodata.__anon_1044201" - ".rodata.__anon_1044205" - ".rodata.__anon_1044573" - ".rodata.__anon_1044825" - ".rodata.__anon_1044832" - ".rodata.__anon_1044965" - ".rodata.__anon_1043551" - ".rodata.__anon_1045067" + ".rodata.__anon_1015818" + ".rodata.__anon_1024610" + ".rodata.__anon_1024713" + ".rodata.__anon_1025663" + ".rodata.__anon_1026173" + ".rodata.__anon_1026622" + ".rodata.__anon_1027683" + ".rodata.__anon_1027725" + ".rodata.__anon_1028059" + ".rodata.__anon_1029577" + ".rodata.__anon_1030232" + ".rodata.__anon_1030195" + ".rodata.__anon_1031856" + ".rodata.__anon_1031858" + ".rodata.__anon_1031860" + ".rodata.__anon_1031846" + ".rodata.__anon_1032011" + ".rodata.__anon_1032270" + ".rodata.__anon_1032277" + ".rodata.__anon_1032243" + ".rodata.__anon_233720" + ".rodata.__anon_1036073" + ".rodata.__anon_1036211" + ".rodata.__anon_243071" + ".rodata.__anon_231990" + ".rodata.__anon_231999" + ".rodata.__anon_1039740" + ".rodata.__anon_151087" + ".rodata.__anon_1041186" + ".rodata.__anon_1042005" + ".rodata.__anon_1043357" + ".rodata.__anon_1044331" + ".rodata.__anon_1044492" + ".rodata.__anon_1044843" + ".rodata.__anon_1045117" + ".rodata.__anon_1045121" + ".rodata.__anon_1045489" + ".rodata.__anon_1045741" + ".rodata.__anon_1045748" + ".rodata.__anon_1045881" + ".rodata.__anon_1044467" + ".rodata.__anon_1045983" ".rodata.browser.webapi.net.URLSearchParams.HEX_DECODE_ARRAY" - ".rodata.__anon_1045985" - ".rodata.__anon_1046103" - ".rodata.__anon_1048042" - ".rodata.__anon_1048045" - ".rodata.__anon_1050026" - ".rodata.__anon_1050566" - ".rodata.__anon_1051067" - ".rodata.__anon_1051111" - ".rodata.__anon_1052216" - ".rodata.__anon_1052241" - ".rodata.__anon_1052265" - ".rodata.__anon_1052294" - ".rodata.__anon_1052322" - ".rodata.__anon_137687" - ".rodata.__anon_1052424" - ".rodata.__anon_1052472" - ".rodata.__anon_1052499" - ".rodata.__anon_1052578" - ".rodata.__anon_1052597" - ".rodata.__anon_1052626" - ".rodata.__anon_1052656" - ".rodata.__anon_1052686" - ".rodata.__anon_1052811" - ".rodata.__anon_1052842" - ".rodata.__anon_1053089" + ".rodata.__anon_1046901" + ".rodata.__anon_1047019" + ".rodata.__anon_1048956" + ".rodata.__anon_1048959" + ".rodata.__anon_1050940" + ".rodata.__anon_1051480" + ".rodata.__anon_1051981" + ".rodata.__anon_1052025" ".rodata.__anon_1053130" - ".rodata.__anon_1053160" - ".rodata.__anon_1053188" - ".rodata.__anon_1053327" - ".rodata.__anon_1053393" - ".rodata.__anon_1053604" - ".rodata.__anon_1053679" - ".rodata.__anon_1054135" - ".rodata.__anon_1054647" - ".rodata.__anon_1054913" - ".rodata.__anon_1055296" - ".rodata.__anon_1049192" - ".rodata.__anon_227128" - ".rodata.__anon_227138" - ".rodata.__anon_227148" - ".rodata.__anon_1058308" - ".rodata.__anon_1058473" - ".rodata.__anon_1058659" - ".rodata.__anon_1059436" - ".rodata.__anon_1062032" - ".rodata.__anon_1062209" - ".rodata.__anon_1064022" - ".rodata.__anon_1067255" - ".rodata.__anon_1070339" - ".rodata.__anon_1070874" - ".rodata.__anon_214706" - ".rodata.__anon_214722" - ".rodata.__anon_1071637" - ".rodata.__anon_1071652" - ".rodata.__anon_1072079" - ".rodata.__anon_1072513" - ".rodata.__anon_1072709" - ".rodata.__anon_1073112" - ".rodata.__anon_1073143" - ".rodata.__anon_1079411" - ".rodata.__anon_1080116" - ".rodata.__anon_215421" - ".rodata.__anon_150151" - ".rodata.__anon_1081450" - ".rodata.__anon_1081866" - ".rodata.__anon_1082024" - ".rodata.__anon_1082204" - ".rodata.__anon_1082513" - ".rodata.__anon_1083705" - ".rodata.__anon_213898" - ".rodata.__anon_1085189" - ".rodata.__anon_1086187" - ".rodata.__anon_214380" - ".rodata.__anon_226937" - ".rodata.__anon_1088112" - ".rodata.__anon_1089237" - ".rodata.__anon_1091112" - ".rodata.__anon_1091377" - ".rodata.__anon_1091472" - ".rodata.__anon_1092147" - ".rodata.__anon_1093204" - ".rodata.__anon_1093426" - ".rodata.__anon_1093718" - ".rodata.__anon_1093905" - ".rodata.__anon_1263535" - ".rodata.__anon_1266038" - ".rodata.__anon_1266116" - ".rodata.__anon_1266247" - ".rodata.__anon_1266672" - ".rodata.__anon_1266691" - ".rodata.__anon_1266756" - ".rodata.__anon_1266803" - ".rodata.__anon_1266819" - ".rodata.__anon_1266864" - ".rodata.__anon_1267956" - ".rodata.__anon_1267985" - ".rodata.__anon_1268267" - ".rodata.__anon_1268299" - ".rodata.__anon_1268506" - ".rodata.__anon_1268816" - ".rodata.__anon_1269027" - ".rodata.__anon_1269048" - ".rodata.__anon_1269320" - ".rodata.__anon_1269345" - ".rodata.__anon_1269527" - ".rodata.__anon_1270161" - ".rodata.__anon_1270473" - ".rodata.__anon_1270737" - ".rodata.__anon_1270851" - ".rodata.__anon_1271808" - ".rodata.__anon_1271863" - ".rodata.__anon_1271865" - ".rodata.__anon_1271867" - ".rodata.__anon_1271869" - ".rodata.__anon_1271871" - ".rodata.__anon_1271989" - ".rodata.__anon_1272102" - ".rodata.__anon_1272579" - ".rodata.__anon_1272683" - ".rodata.__anon_1272687" - ".rodata.__anon_1272689" - ".rodata.__anon_1272691" - ".rodata.__anon_1272693" - ".rodata.__anon_1272697" - ".rodata.__anon_1272701" - ".rodata.__anon_1273674" - ".rodata.__anon_1273738" + ".rodata.__anon_1053155" + ".rodata.__anon_1053179" + ".rodata.__anon_1053208" + ".rodata.__anon_1053236" + ".rodata.__anon_138640" + ".rodata.__anon_1053338" + ".rodata.__anon_1053386" + ".rodata.__anon_1053413" + ".rodata.__anon_1053492" + ".rodata.__anon_1053511" + ".rodata.__anon_1053540" + ".rodata.__anon_1053570" + ".rodata.__anon_1053600" + ".rodata.__anon_1053725" + ".rodata.__anon_1053756" + ".rodata.__anon_1054003" + ".rodata.__anon_1054044" + ".rodata.__anon_1054074" + ".rodata.__anon_1054102" + ".rodata.__anon_1054241" + ".rodata.__anon_1054307" + ".rodata.__anon_1054518" + ".rodata.__anon_1054593" + ".rodata.__anon_1055049" + ".rodata.__anon_1055561" + ".rodata.__anon_1055827" + ".rodata.__anon_1056210" + ".rodata.__anon_1050106" + ".rodata.__anon_227859" + ".rodata.__anon_227869" + ".rodata.__anon_227879" + ".rodata.__anon_1059222" + ".rodata.__anon_1059387" + ".rodata.__anon_1059573" + ".rodata.__anon_1060350" + ".rodata.__anon_1062946" + ".rodata.__anon_1063123" + ".rodata.__anon_1064925" + ".rodata.__anon_1068160" + ".rodata.__anon_1071248" + ".rodata.__anon_1071783" + ".rodata.__anon_215437" + ".rodata.__anon_215453" + ".rodata.__anon_1072546" + ".rodata.__anon_1072561" + ".rodata.__anon_1072988" + ".rodata.__anon_1073422" + ".rodata.__anon_1073618" + ".rodata.__anon_1074021" + ".rodata.__anon_1074052" + ".rodata.__anon_1080320" + ".rodata.__anon_1081025" + ".rodata.__anon_216152" + ".rodata.__anon_151102" + ".rodata.__anon_1082359" + ".rodata.__anon_1082775" + ".rodata.__anon_1082933" + ".rodata.__anon_1083113" + ".rodata.__anon_1083422" + ".rodata.__anon_1084614" + ".rodata.__anon_214629" + ".rodata.__anon_1086098" + ".rodata.__anon_1087096" + ".rodata.__anon_215111" + ".rodata.__anon_227668" + ".rodata.__anon_1089021" + ".rodata.__anon_1090146" + ".rodata.__anon_1092021" + ".rodata.__anon_1092286" + ".rodata.__anon_1092381" + ".rodata.__anon_1093056" + ".rodata.__anon_1094113" + ".rodata.__anon_1094335" + ".rodata.__anon_1094627" + ".rodata.__anon_1094814" + ".rodata.__anon_1094871" + ".rodata.__anon_1095207" + ".rodata.__anon_1095494" + ".rodata.__anon_1095957" + ".rodata.__anon_1096189" + ".rodata.__anon_1097060" + ".rodata.__anon_1096960" + ".rodata.__anon_1097536" + ".rodata.__anon_1097726" + ".rodata.__anon_1098774" + ".rodata.__anon_1099263" + ".rodata.__anon_1100079" + ".rodata.__anon_1100180" + ".rodata.__anon_1265483" + ".rodata.__anon_1267986" + ".rodata.__anon_1268064" + ".rodata.__anon_1268195" + ".rodata.__anon_1268620" + ".rodata.__anon_1268639" + ".rodata.__anon_1268704" + ".rodata.__anon_1268751" + ".rodata.__anon_1268767" + ".rodata.__anon_1268812" + ".rodata.__anon_1269904" + ".rodata.__anon_1269933" + ".rodata.__anon_1270215" + ".rodata.__anon_1270247" + ".rodata.__anon_1270454" + ".rodata.__anon_1270764" + ".rodata.__anon_1270975" + ".rodata.__anon_1270996" + ".rodata.__anon_1271268" + ".rodata.__anon_1271293" + ".rodata.__anon_1271475" + ".rodata.__anon_1272109" + ".rodata.__anon_1272421" + ".rodata.__anon_1272685" + ".rodata.__anon_1272799" + ".rodata.__anon_1273756" + ".rodata.__anon_1273811" + ".rodata.__anon_1273813" + ".rodata.__anon_1273815" + ".rodata.__anon_1273817" + ".rodata.__anon_1273819" + ".rodata.__anon_1273937" + ".rodata.__anon_1274050" + ".rodata.__anon_1274527" + ".rodata.__anon_1274631" + ".rodata.__anon_1274635" + ".rodata.__anon_1274637" + ".rodata.__anon_1274639" + ".rodata.__anon_1274641" + ".rodata.__anon_1274645" + ".rodata.__anon_1274649" + ".rodata.__anon_1275622" + ".rodata.__anon_1275686" ".rodata.__anon_13917" - ".rodata.__anon_1274191" - ".rodata.__anon_1274221" - ".rodata.__anon_1274419" - ".rodata.__anon_1274607" - ".rodata.__anon_1275146" - ".rodata.__anon_1275169" - ".rodata.__anon_1275420" - ".rodata.__anon_1275447" - ".rodata.__anon_1275477" - ".rodata.__anon_1275498" - ".rodata.__anon_1275516" - ".rodata.__anon_1275565" - ".rodata.__anon_1275590" - ".rodata.__anon_1275650" - ".rodata.__anon_1275698" - ".rodata.__anon_1275717" - ".rodata.__anon_1275738" - ".rodata.__anon_1275759" - ".rodata.__anon_1276397" - ".rodata.__anon_1276965" - ".rodata.__anon_1276964" - ".rodata.__anon_1277964" - ".rodata.__anon_1277988" - ".rodata.__anon_1278059" - ".rodata.__anon_1278135" - ".rodata.__anon_1278136" - ".rodata.__anon_1279726" - ".rodata.__anon_1279789" - ".rodata.__anon_1279844" - ".rodata.__anon_1279889" - ".rodata.__anon_1280037" - ".rodata.__anon_1280291" - ".rodata.__anon_1280317" - ".rodata.__anon_1280527" - ".rodata.__anon_1280564" - ".rodata.__anon_1280606" + ".rodata.__anon_1276139" + ".rodata.__anon_1276169" + ".rodata.__anon_1276367" + ".rodata.__anon_1276555" + ".rodata.__anon_1277094" + ".rodata.__anon_1277117" + ".rodata.__anon_1277368" + ".rodata.__anon_1277395" + ".rodata.__anon_1277425" + ".rodata.__anon_1277446" + ".rodata.__anon_1277464" + ".rodata.__anon_1277513" + ".rodata.__anon_1277538" + ".rodata.__anon_1277598" + ".rodata.__anon_1277646" + ".rodata.__anon_1277665" + ".rodata.__anon_1277686" + ".rodata.__anon_1277707" + ".rodata.__anon_1278345" + ".rodata.__anon_1278912" + ".rodata.__anon_1279911" + ".rodata.__anon_1279935" + ".rodata.__anon_1280006" + ".rodata.__anon_1280082" + ".rodata.__anon_1280083" + ".rodata.__anon_1281673" + ".rodata.__anon_1281736" + ".rodata.__anon_1281791" + ".rodata.__anon_1281836" + ".rodata.__anon_1281984" + ".rodata.__anon_1282238" + ".rodata.__anon_1282264" + ".rodata.__anon_1282474" + ".rodata.__anon_1282511" + ".rodata.__anon_1282553" ) *lightpanda_ffi-b5cc47667d2c70bb.url-85d11ab45289c88d.url.8a8ec6265781451b-cgu.0.rcgu.o.rcgu.o( ".rodata.str1.1" diff --git a/orderfile/v8.txt b/orderfile/v8.txt index 375db5d5d..da83e5d14 100644 --- a/orderfile/v8.txt +++ b/orderfile/v8.txt @@ -65,6 +65,7 @@ _ZN10__cxxabiv117__class_type_infoD0Ev _ZN10__cxxabiv120__si_class_type_infoD0Ev _ZN10__cxxabiv121__vmi_class_type_infoD0Ev _ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv +__dynamic_cast _ZN12v8_inspector8String16D2Ev v8__Platform__NewDefaultPlatform v8__Platform__DELETE @@ -642,8 +643,7 @@ _ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv _ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi _ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi _ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj -_ZNSt4__Cr13basic_filebufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE -_ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev +_ZNSt4__Cr13basic_filebufIcNS_11char_traitsIcEEE4openEPKcj _ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev _ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj _ZNSt4__Cr18basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev @@ -820,14 +820,6 @@ _ZNKSt4__Cr7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4 _ZNSt4__Cr9__num_putIcE21__widen_and_group_intEPcS2_S2_S2_RS2_S3_RKNS_6localeE _ZNSt4__Cr9__num_putIcE23__widen_and_group_floatEPcS2_S2_S2_RS2_S3_RKNS_6localeE _ZNSt4__Cr9__num_putIwE21__widen_and_group_intEPcS2_S2_PwRS3_S4_RKNS_6localeE -_ZNSt4__Cr9__num_putIwE23__widen_and_group_floatEPcS2_S2_PwRS3_S4_RKNS_6localeE -_ZNKSt4__Cr8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE3getES4_S4_RNS_8ios_baseERjP2tmPKcSC_ -_ZNKSt4__Cr8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13do_date_orderEv -_ZNKSt4__Cr8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_timeES4_S4_RNS_8ios_baseERjP2tm -_ZNKSt4__Cr8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_dateES4_S4_RNS_8ios_baseERjP2tm -_ZNKSt4__Cr8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE14do_get_weekdayES4_S4_RNS_8ios_baseERjP2tm -_ZNKSt4__Cr8messagesIcE6do_getEliiRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE -_ZNKSt4__Cr8messagesIcE8do_closeEl _ZNKSt4__Cr8messagesIwE7do_openERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_6localeE _ZNKSt4__Cr8messagesIwE6do_getEliiRKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEE _ZNKSt4__Cr16__narrow_to_utf8ILm32EEclINS_20back_insert_iteratorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEwEET_SB_PKT0_SE_ @@ -1191,7 +1183,7 @@ _ZN2v84base21RandomNumberGenerator10NextDoubleEv _ZN2v84base21RandomNumberGenerator9NextInt64Ev _ZN2v84base21RandomNumberGenerator9NextBytesEPvm _ZN2v84base21RandomNumberGenerator10NextSampleEmm -_ZNSt4__Cr12__hash_tableImNS_4hashImEENS_8equal_toImEENS_9allocatorImEEE11__do_rehashILb1EEEvm +_ZN2v84baseL16ComplementSampleERKNSt4__Cr13unordered_setImNS1_4hashImEENS1_8equal_toImEENS1_9allocatorImEEEEm _ZZNSt4__Cr12__hash_tableImNS_4hashImEENS_8equal_toImEENS_9allocatorImEEE16__emplace_uniqueIJRmEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeImPvEEEEbEEDpOT_ENKUlRKmS9_E_clESM_S9_ _ZNK2v84base9TimeDelta10InSecondsFEv _ZNK2v84base9TimeDelta9InSecondsEv @@ -2168,6 +2160,7 @@ _ZN2v88internal7Isolate22PrintCurrentStackTraceERNSt4__Cr13basic_ostreamIcNS2_11 _ZNKRSt4__Cr19basic_ostringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv _ZN2v88internal7Isolate16IsOnCentralStackEv _ZN2v88internal7Isolate15ComputeLocationEPNS0_15MessageLocationE +_ZN2v88internal7Isolate34NotifyExceptionPropagationCallbackEv _ZN2v88internal12_GLOBAL__N_124TryGetCurrentTaskPromiseEPNS0_7IsolateE _ZN2v88internal12_GLOBAL__N_123WalkPromiseTreeInternalEPNS0_7IsolateENS0_12DirectHandleINS0_9JSPromiseEEERKNSt4__Cr8functionIFvNS2_14PromiseHandlerEEEE _ZN2v88internal7Isolate41SetCaptureStackTraceForUncaughtExceptionsEbiNS_10StackTrace17StackTraceOptionsE @@ -2421,6 +2414,7 @@ _ZN2v88internal14FutexEmulation17NotifyAsyncWaiterEPNS0_17FutexWaitListNodeE _ZN2v88internal13FutexWaitList10RemoveNodeEPNS0_17FutexWaitListNodeE _ZN2v84base8SmallMapINSt4__Cr3mapIPNS_8internal7IsolateENS4_13FutexWaitList11HeadAndTailENS2_4lessIS6_EENS2_9allocatorINS2_4pairIKS6_S8_EEEEEELm4ENS0_8internal16select_equal_keyISG_Lb0EE9equal_keyENSH_19SmallMapDefaultInitISG_EEE6insertERKSE_ _ZN2v84base8SmallMapINSt4__Cr3mapIPvNS_8internal13FutexWaitList11HeadAndTailENS2_4lessIS4_EENS2_9allocatorINS2_4pairIKS4_S7_EEEEEELm16ENS0_8internal16select_equal_keyISF_Lb0EE9equal_keyENSG_19SmallMapDefaultInitISF_EEE6insertERKSD_ +_ZN2v84base8SmallMapINSt4__Cr3mapIPvNS_8internal13FutexWaitList11HeadAndTailENS2_4lessIS4_EENS2_9allocatorINS2_4pairIKS4_S7_EEEEEELm16ENS0_8internal16select_equal_keyISF_Lb0EE9equal_keyENSG_19SmallMapDefaultInitISF_EEE4findERSC_ _ZN2v88internal14FutexEmulation4WakeEPvj _ZN2v88internal14FutexEmulation4WakeEmj _ZN2v88internal14FutexEmulation25CleanupAsyncWaiterPromiseEPNS0_17FutexWaitListNodeE @@ -3119,7 +3113,7 @@ _ZN4absl18container_internal12_GLOBAL__N_132ResizeEmptyNonAllocatedTableImplERNS _ZN4absl18container_internal4CopyERNS0_12CommonFieldsERKNS0_15PolicyFunctionsERKS1_NS_11FunctionRefIFvPvPKvEEE _ZN4absl18container_internal24ReserveTableToFitNewSizeERNS0_12CommonFieldsERKNS0_15PolicyFunctionsEm _ZN4absl18container_internal12_GLOBAL__N_121ReserveAllocatedTableERNS0_12CommonFieldsERKNS0_15PolicyFunctionsEm -_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPKvmEENS_22__unordered_map_hasherIS3_NS_4pairIKS3_mEENS_4hashIS3_EENS_8equal_toIS3_EEEENS_21__unordered_map_equalIS3_S8_SC_SA_EENS_9allocatorIS8_EEE16__emplace_uniqueIJS8_EEENS6_INS_15__hash_iteratorIPNS_11__hash_nodeIS4_PvEEEEbEEDpOT_ENKUlRS7_OS8_E_clESU_SV_ +_ZN4absl18container_internal18PrepareInsertLargeERNS0_12CommonFieldsERKNS0_15PolicyFunctionsEmNS0_18NonIterableBitMaskIjLi16ELi0EEENS0_8FindInfoE _ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPKvmEENS_22__unordered_map_hasherIS3_NS_4pairIKS3_mEENS_4hashIS3_EENS_8equal_toIS3_EEEENS_21__unordered_map_equalIS3_S8_SC_SA_EENS_9allocatorIS8_EEE11__do_rehashILb1EEEvm _ZNSt4__Cr6vectorIN5cppgc14HeapStatistics16ObjectStatsEntryENS_9allocatorIS3_EEE20__throw_length_errorEv _ZNK4heap4base5Stack26IteratePointersUntilMarkerEPNS0_12StackVisitorE @@ -3596,6 +3590,8 @@ _ZN2v88internal9Assembler4movlENS0_7OperandEPNS0_5LabelE _ZN2v88internal9Assembler7movsxblENS0_8RegisterES2_ _ZN2v88internal9Assembler7movsxblENS0_8RegisterENS0_7OperandE _ZN2v88internal9Assembler7movsxbqENS0_8RegisterENS0_7OperandE +_ZN2v88internal9Assembler7movsxbqENS0_8RegisterES2_ +_ZN2v88internal9Assembler7movsxwlENS0_8RegisterES2_ _ZN2v88internal9Assembler22emit_trace_instructionENS0_9ImmediateE _ZN2v88internal9Assembler5pushqENS0_8RegisterE _ZN2v88internal9Assembler4popqENS0_8RegisterE @@ -3626,7 +3622,10 @@ _ZN2v88internal9Assembler5testwENS0_7OperandENS0_8RegisterE _ZN2v88internal9Assembler5fld_dENS0_7OperandE _ZN2v88internal9Assembler6fstp_dENS0_7OperandE _ZN2v88internal9Assembler4fstpEi -_ZN2v88internal9Assembler6movupsENS0_11XMMRegisterENS0_7OperandE +_ZN2v88internal9Assembler5fpremEv +_ZN2v88internal9Assembler9fnstsw_axEv +_ZN2v88internal9Assembler4sahfEv +_ZN2v88internal9Assembler4movdENS0_11XMMRegisterENS0_8RegisterE _ZN2v88internal9Assembler6movupsENS0_7OperandENS0_11XMMRegisterE _ZN2v88internal9Assembler9sse_instrENS0_11XMMRegisterES2_hh _ZN2v88internal9Assembler9sse_instrENS0_11XMMRegisterENS0_7OperandEhh @@ -3720,7 +3719,7 @@ _ZNSt4__Cr6vectorIN2v88internal13VirtualMemoryENS_9allocatorIS3_EEE7reserveEm _ZN2v88internal4wasm17WasmCodeAllocatorD2Ev _ZN2v88internal4wasm17WasmCodeAllocatorD1Ev _ZN2v88internal4wasm17WasmCodeAllocator4InitENS0_13VirtualMemoryE -_ZN2v88internal4wasm12NativeModule12SetWireBytesENS_4base11OwnedVectorIKhEE +_ZNSt4__Cr6vectorIN2v88internal13VirtualMemoryENS_9allocatorIS3_EEE12emplace_backIJS3_EEERS3_DpOT_ _ZNK2v88internal4wasm12NativeModule6LookupEm _ZN2v88internal4wasm12NativeModuleD2Ev _ZN2v88internal4wasm12NativeModuleD1Ev @@ -3766,7 +3765,7 @@ _ZN2v88internal14SegmentedTableINS0_4wasm25WasmCodePointerTableEntryELm134217728 _ZZNSt4__Cr6vectorINS_10unique_ptrIN2v88internal4wasm8WasmCodeENS_14default_deleteIS5_EEEENS_9allocatorIS8_EEE12emplace_backIJS8_EEERS8_DpOT_ENKUlvE0_clEv _ZNSt4__Cr6vectorINS_10unique_ptrIN2v88internal4wasm8WasmCodeENS_14default_deleteIS5_EEEENS_9allocatorIS8_EEE20__throw_length_errorEv _ZZNSt4__Cr6vectorIPN2v88internal4wasm8WasmCodeENS_9allocatorIS5_EEE12emplace_backIJS5_EEERS5_DpOT_ENKUlvE0_clEv -_ZNSt4__Cr6vectorIN2v88internal4wasm19UnpublishedWasmCodeENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJNS_10unique_ptrINS3_8WasmCodeENS_14default_deleteISA_EEEENS9_INS3_18AssumptionsJournalENSB_ISE_EEEEEEEPS4_DpOT_ +_ZN2v88internal4wasm19WasmModuleSourceMapD2Ev _ZNSt4__Cr25__try_key_extraction_implIN2v84base13AddressRegionENS_4pairINS_15__tree_iteratorIS3_PNS_11__tree_nodeIS3_PvEElEEbEEZNS_6__treeIS3_NS3_16StartAddressLessENS_9allocatorIS3_EEE21__emplace_hint_uniqueIJRKS3_EEESB_NS_21__tree_const_iteratorIS3_S9_lEEDpOT_EUlSJ_SJ_E_ZNSH_IJSJ_EEESB_SL_SO_EUlSJ_E_SJ_TnNS_9enable_ifIXsr7is_sameIT_u14__remove_constIu20__remove_reference_tIT3_EEEE5valueEiE4typeELi0EEET0_NS_14__priority_tagILm1EEET1_T2_OST_ _ZNSt4__Cr6__treeIN2v84base13AddressRegionENS3_16StartAddressLessENS_9allocatorIS3_EEE12__find_equalIS3_EENS_4pairIPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSE_EENS_21__tree_const_iteratorIS3_PNS_11__tree_nodeIS3_SC_EElEESH_RKT_ _ZNSt4__Cr25__try_key_extraction_implIN2v84base13AddressRegionENS_4pairINS_15__tree_iteratorIS3_PNS_11__tree_nodeIS3_PvEElEEbEEZNS_6__treeIS3_NS3_16StartAddressLessENS_9allocatorIS3_EEE21__emplace_hint_uniqueIJS3_EEESB_NS_21__tree_const_iteratorIS3_S9_lEEDpOT_EUlRKS3_OS3_E_ZNSH_IJS3_EEESB_SJ_SM_EUlSP_E_S3_TnNS_9enable_ifIXsr7is_sameIT_u14__remove_constIu20__remove_reference_tIT3_EEEE5valueEiE4typeELi0EEET0_NS_14__priority_tagILm1EEET1_T2_OSU_ @@ -3829,7 +3828,7 @@ _ZN2v88internal12trap_handler24CoveredMemoryRecordsLockC1Ev _ZN2v88internal12trap_handler24CoveredMemoryRecordsLockD2Ev _ZN2v88internal12trap_handler24CoveredMemoryRecordsLockD1Ev _ZN2v88internal4wasm11AdaptiveMapINS1_12WireBytesRefEE20FinishInitializationEv -_ZN2v88internal12StringHasher20HashSequentialStringIcEEjPKT_jNS0_8HashSeedE +_ZNSt4__Cr6vectorIN2v88internal4wasm12WireBytesRefENS_9allocatorIS4_EEE6resizeEm _ZN2v88internal4wasm16NumFeedbackSlotsEPKNS1_10WasmModuleEi _ZNSt4__Cr6vectorIN2v88internal4wasm12WireBytesRefENS_9allocatorIS4_EEE20__throw_length_errorEv _ZNSt4__Cr6__treeINS_12__value_typeIjN2v88internal4wasm12WireBytesRefEEENS_19__map_value_compareIjNS_4pairIKjS5_EENS_4lessIjEEEENS_9allocatorISA_EEE14__tree_deleterclEPNS_11__tree_nodeIS6_PvEE @@ -3857,6 +3856,7 @@ _ZN2v88internal4wasm10WasmEngineD1Ev _ZNK2v88internal4wasm10WasmEngine37PrintCurrentMemoryConsumptionEstimateEv _ZNSt4__Cr6vectorINS_10shared_ptrIN2v88internal4wasm12NativeModuleEEENS_9allocatorIS6_EEED2Ev _ZN2v88internal4wasm17TypeCanonicalizerD2Ev +_ZN2v88internal4wasm10WasmEngine12SyncValidateEPNS0_7IsolateENS1_19WasmEnabledFeaturesENS1_18CompileTimeImportsENS_4base6VectorIKhEE _ZN2v88internal4wasm10WasmEngine24LeaveDebuggingForIsolateEPNS0_7IsolateE _ZN2v88internal4wasm10WasmEngine16FlushLiftoffCodeEv _ZN2v88internal4wasm10WasmEngine26GetOrCreateTurboStatisticsEv @@ -3940,7 +3940,6 @@ _ZN2v88internal4wasm10WasmEngine12LogCodesTask11RunInternalEv _ZThn32_N2v88internal4wasm10WasmEngine12LogCodesTaskD1Ev _ZThn32_N2v88internal4wasm10WasmEngine12LogCodesTaskD0Ev _ZNSt4__Cr6vectorIPN2v88internal4wasm8WasmCodeENS_9allocatorIS5_EEE18__insert_with_sizeINS_17_ClassicAlgPolicyEPS5_SB_EENS_11__wrap_iterISB_EENSC_IPKS5_EET0_T1_l -_ZNK2v88internal4wasm17NativeModuleCache3KeyltERKS3_ _ZZNSt4__Cr6__treeINS_12__value_typeIN2v88internal4wasm17NativeModuleCache3KeyENS_8optionalINS_8weak_ptrINS4_12NativeModuleEEEEEEENS_19__map_value_compareIS6_NS_4pairIKS6_SB_EENS_4lessIS6_EEEENS_9allocatorISG_EEE16__emplace_uniqueIJRS6_RKNS_9nullopt_tEEEENSE_INS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEbEEDpOT_ENKUlRSF_SO_SR_E_clES12_SO_SR_ _ZNSt4__Cr6__treeINS_12__value_typeIN2v88internal4wasm17NativeModuleCache3KeyENS_8optionalINS_8weak_ptrINS4_12NativeModuleEEEEEEENS_19__map_value_compareIS6_NS_4pairIKS6_SB_EENS_4lessIS6_EEEENS_9allocatorISG_EEE5eraseENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEE _ZZNSt4__Cr6__treeINS_12__value_typeIN2v88internal4wasm17NativeModuleCache3KeyENS_8optionalINS_8weak_ptrINS4_12NativeModuleEEEEEEENS_19__map_value_compareIS6_NS_4pairIKS6_SB_EENS_4lessIS6_EEEENS_9allocatorISG_EEE16__emplace_uniqueIJRSF_SB_EEENSE_INS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEbEEDpOT_ENKUlSO_SO_OSB_E_clESO_SO_SZ_ @@ -4182,33 +4181,6 @@ _ZN2v88internal4wasm20WasmCodePointerTable13SweepSegmentsEm _ZN2v88internal4wasm34GetProcessWideWasmCodePointerTableEv _ZN2v84base11LeakyObjectINS_8internal4wasm20WasmCodePointerTableEEC2IJEEEDpOT_ _ZN2v88internal4wasm20WasmCodePointerTable16VectorToFreelistENSt4__Cr6vectorIjNS3_9allocatorIjEEEE -_ZN2v88internal4wasm20WasmCodePointerTable17EntrypointEqualToENS0_15WasmCodePointerEm -_ZNSt4__Cr6vectorIjNS_9allocatorIjEEE20__throw_length_errorEv -_ZZNSt4__Cr6vectorIjNS_9allocatorIjEEE12emplace_backIJRKjEEERjDpOT_ENKUlvE0_clEv -_ZNSt4__Cr6__treeINS_12__value_typeImN2v88internal15WasmCodePointerEEENS_19__map_value_compareImNS_4pairIKmS4_EENS_4lessImEEEENS_9allocatorIS9_EEE14__tree_deleterclEPNS_11__tree_nodeIS5_PvEE -_ZN2v84base30EmulatedVirtualAddressSubspaceC2EPNS_19VirtualAddressSpaceEmmm -_ZN2v84base30EmulatedVirtualAddressSubspaceC1EPNS_19VirtualAddressSpaceEmmm -_ZN2v84base30EmulatedVirtualAddressSubspaceD2Ev -_ZN2v84base30EmulatedVirtualAddressSubspaceD1Ev -_ZN2v84base30EmulatedVirtualAddressSubspaceD0Ev -_ZN2v84base30EmulatedVirtualAddressSubspace13SetRandomSeedEl -_ZN2v84base30EmulatedVirtualAddressSubspace17RandomPageAddressEv -_ZN2v84base30EmulatedVirtualAddressSubspace13AllocatePagesEmmmNS_15PagePermissionsE -_ZN2v84base30EmulatedVirtualAddressSubspace9FreePagesEmm -_ZN2v84base30EmulatedVirtualAddressSubspace19AllocateSharedPagesEmmNS_15PagePermissionsENS_18SharedMemoryHandleEm -_ZN2v84base30EmulatedVirtualAddressSubspace15FreeSharedPagesEmm -_ZN2v84base30EmulatedVirtualAddressSubspace18SetPagePermissionsEmmNS_15PagePermissionsE -_ZN2v84base30EmulatedVirtualAddressSubspace19AllocateGuardRegionEmm -_ZN2v84base30EmulatedVirtualAddressSubspace15FreeGuardRegionEmm -_ZN2v84base30EmulatedVirtualAddressSubspace20CanAllocateSubspacesEv -_ZN2v84base30EmulatedVirtualAddressSubspace16AllocateSubspaceEmmmNS_15PagePermissionsENSt4__Cr8optionalIiEENS4_INS_18SharedMemoryHandleEEE -_ZN2v84base30EmulatedVirtualAddressSubspace13RecommitPagesEmmNS_15PagePermissionsE -_ZN2v84base30EmulatedVirtualAddressSubspace18DiscardSystemPagesEmm -_ZN2v84base30EmulatedVirtualAddressSubspace13DecommitPagesEmm -_ZN2v84base30EmulatedVirtualAddressSubspace25ActiveMemoryProtectionKeyEv -_ZN2v819VirtualAddressSpace7SetNameERKNSt4__Cr12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE -_ZNSt4__Cr6__sortIRNS_6__lessIaaEEPaEEvT0_S5_T_ -_ZNSt4__Cr11__introsortINS_17_ClassicAlgPolicyENS_6ranges4lessEPaLb1EEEvT1_S5_T0_NS_15iterator_traitsIS5_E15difference_typeEb _ZNSt4__Cr18__bitset_partitionINS_17_ClassicAlgPolicyEPdNS_6ranges4lessEEENS_4pairIT0_bEES6_S6_T1_ _ZNSt4__Cr27__insertion_sort_incompleteINS_17_ClassicAlgPolicyENS_6ranges4lessEPdEEbT1_S5_T0_ _ZNSt4__Cr19__partial_sort_implINS_17_ClassicAlgPolicyERNS_6ranges4lessEPdS5_EET1_S6_S6_T2_OT0_ @@ -4346,7 +4318,6 @@ _ZN2v88internal6String11WriteToFlatItEEvNS0_6TaggedIS1_EEPT_jjRKNS0_31SharedStri _ZN2v88internal6String11WriteToFlatIhEEvNS0_6TaggedIS1_EEPT_jjRKNS0_31SharedStringAccessGuardIfNeededE _ZN2v88internal6String12WriteToFlat2IhEEvPT_NS0_6TaggedINS0_10ConsStringEEEjjRKNS0_31SharedStringAccessGuardIfNeededERKNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELSC_2EEEE _ZN2v88internal6String12WriteToFlat2ItEEvPT_NS0_6TaggedINS0_10ConsStringEEEjjRKNS0_31SharedStringAccessGuardIfNeededERKNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELSC_2EEEE -_ZN2v88internal21StringCharacterStream14CountUtf8BytesEj _ZN2v88internal21StringCharacterStream14WriteUtf8BytesEjPcm _ZN2v88internal6String9ToCStringEPm _ZN2v88internal6String11ToStdStringEv @@ -4404,7 +4375,7 @@ _ZN2v84base11SmallVectorIiLm32ENSt4__Cr9allocatorIiEEE11FreeStorageEv _ZN2v84base11SmallVectorIiLm32ENSt4__Cr9allocatorIiEEE4GrowEm _ZN2v84base11SmallVectorIiLm32ENSt4__Cr9allocatorIiEEE4GrowEv _ZN2v88internal12StringSearchIhhE16SingleCharSearchEPS2_NS_4base6VectorIKhEEi -_ZN2v88internal12StringSearchIttE24BoyerMooreHorspoolSearchEPS2_NS_4base6VectorIKtEEi +_ZN2v88internal12StringSearchIhhE12LinearSearchEPS2_NS_4base6VectorIKhEEi _ZN2v88internal12StringSearchIttE23PopulateBoyerMooreTableEv _ZN2v88internal12StringSearchIttE16BoyerMooreSearchEPS2_NS_4base6VectorIKtEEi _ZN2v88internal12StringHasher20HashSequentialStringIhEEjPKT_jNS0_8HashSeedE @@ -4594,6 +4565,7 @@ _ZN2v88internal7Factory32NewJSArrayWithUnverifiedElementsENS0_12DirectHandleINS0 _ZN2v88internal7Factory33NewJSArrayForTemplateLiteralArrayENS0_12DirectHandleINS0_10FixedArrayEEES4_ii _ZN2v88internal7Factory17NewJSArrayStorageENS0_12DirectHandleINS0_7JSArrayEEEjjNS0_26ArrayStorageAllocationModeE _ZN2v88internal7Factory20NewJSModuleNamespaceEv +_ZN2v88internal7Factory28NewJSDeferredModuleNamespaceEv _ZN2v88internal7Factory28NewJSUint8ArraySetFromResultENS0_12DirectHandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberEEEEEES7_ _ZN2v88internal7Factory18NewJSBoundFunctionENS0_12DirectHandleINS0_10JSReceiverEEENS2_INS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedES3_EEEEENS_4base6VectorINS2_INS0_6ObjectEEEEENS2_INS5_IJS3_SC_EEEEE _ZN2v88internal7Factory29NewUninitializedJSGlobalProxyEi @@ -5273,6 +5245,7 @@ _ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor15VisitCodeTargetENS0_6 _ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor20VisitEmbeddedPointerENS0_6TaggedINS0_17InstructionStreamEEEPNS0_9RelocInfoE _ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor15VisitMapPointerENS0_6TaggedINS0_10HeapObjectEEE _ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor17VisitRootPointersENS0_4RootEPKcNS0_14FullObjectSlotES6_ +_ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor27VisitCompressedRootPointersENS0_4RootEPKcNS0_27OffHeapCompressedObjectSlotINS0_27V8HeapCompressionSchemeImplINS0_8MainCageEEEEESA_ _ZZNSt4__Cr12__hash_tableIN2v88internal6TaggedINS2_10HeapObjectEEENS2_6Object6HasherENS_8equal_toIS5_EENS_9allocatorIS5_EEE16__emplace_uniqueIJRKS5_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEEDpOT_ENKUlSF_SF_E_clESF_SF_ _ZNSt4__Cr12__hash_tableIN2v88internal6TaggedINS2_10HeapObjectEEENS2_6Object6HasherENS_8equal_toIS5_EENS_9allocatorIS5_EEE11__do_rehashILb1EEEvm _ZZNSt4__Cr6vectorIN2v88internal6TaggedINS2_10HeapObjectEEENS_9allocatorIS5_EEE12emplace_backIJRKS5_EEERS5_DpOT_ENKUlvE0_clEv @@ -5375,6 +5348,7 @@ _ZN2v88internal23FixedWeakBodyDescriptorILi4ELi8ELi8EE11IterateBodyINS0_12_GLOBA _ZN2v88internal11CodeWrapper14BodyDescriptor11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_ _ZN2v88internal24FixedRangeBodyDescriptorILi12ELi20EE11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_ _ZN2v88internal24FixedRangeBodyDescriptorILi12ELi16EE11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_ +_ZN2v88internal25SuffixRangeBodyDescriptorILi8EE11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_ _ZN2v88internal12IrRegExpData14BodyDescriptor11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_ _ZN2v88internal10RegExpData14BodyDescriptor11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_ _ZN2v88internal14WasmImportData14BodyDescriptor11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_ @@ -5542,7 +5516,6 @@ _ZN2v88internal10HeapObject16RehashBasedOnMapINS0_7IsolateEEEvPT_ _ZN2v88internal9HashTableINS0_15ObjectHashTableENS0_20ObjectHashTableShapeEE6RehashENS0_16PtrComprCageBaseE _ZN2v88internal9HashTableINS0_14NameDictionaryENS0_19NameDictionaryShapeEE6RehashENS0_16PtrComprCageBaseE _ZN2v88internal9HashTableINS0_20NameToIndexHashTableENS0_16NameToIndexShapeEE6RehashENS0_16PtrComprCageBaseE -_ZN2v88internal9HashTableINS0_20SimpleNameDictionaryENS0_25SimpleNameDictionaryShapeEE6RehashENS0_16PtrComprCageBaseE _ZN2v88internal9HashTableINS0_22SimpleNumberDictionaryENS0_27SimpleNumberDictionaryShapeEE6RehashENS0_16PtrComprCageBaseE _ZN2v88internal5JSMap6RehashEPNS0_7IsolateE _ZN2v88internal5JSSet6RehashEPNS0_7IsolateE @@ -5604,7 +5577,6 @@ _ZN2v88internal19ObjectHashTableBaseINS0_18EphemeronHashTableENS0_23EphemeronHas _ZN2v88internal9HashTableINS0_18ObjectTwoHashTableENS0_25ObjectMultiHashTableShapeILi2EEEE6RehashENS0_16PtrComprCageBaseE _ZN2v88internal9HashTableINS0_18ObjectTwoHashTableENS0_25ObjectMultiHashTableShapeILi2EEEE4SwapENS0_13InternalIndexES6_NS0_16WriteBarrierModeE _ZN2v88internal9HashTableINS0_18ObjectTwoHashTableENS0_25ObjectMultiHashTableShapeILi2EEEE6RehashENS0_16PtrComprCageBaseENS0_6TaggedIS2_EE -_ZN2v88internal10DictionaryINS0_22SimpleNumberDictionaryENS0_27SimpleNumberDictionaryShapeEE8SetEntryENS0_13InternalIndexENS0_6TaggedINS0_6ObjectEEES8_NS0_15PropertyDetailsE _ZN2v88internal10DictionaryINS0_22SimpleNumberDictionaryENS0_27SimpleNumberDictionaryShapeEE3AddINS0_7IsolateENS0_6HandleELNS0_14AllocationTypeE0EQsr3stdE16is_convertible_vITL0_0_IT_ENS0_12DirectHandleISA_EEEEET0_IS2_EPSA_SF_jNSC_INS0_6ObjectEEENS0_15PropertyDetailsEPNS0_13InternalIndexE _ZN2v88internal9HashTableINS0_16NumberDictionaryENS0_21NumberDictionaryShapeEE4SwapENS0_13InternalIndexES5_NS0_16WriteBarrierModeE _ZN2v88internal9HashTableINS0_16NumberDictionaryENS0_21NumberDictionaryShapeEE6RehashENS0_16PtrComprCageBaseENS0_6TaggedIS2_EE @@ -5677,7 +5649,6 @@ _ZN2v88internallsERNSt4__Cr13basic_ostreamIcNS1_11char_traitsIcEEEENS0_12Instanc _ZN2v88internal6Object11OptimalTypeENS0_6TaggedIS1_EEPNS0_7IsolateENS0_14RepresentationE _ZN2v88internal6Object13NewStorageForEPNS0_7IsolateENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverENS0_4HoleEEEEEENS0_14RepresentationE _ZN2v88internal6Object12ToObjectImplEPNS0_7IsolateENS0_12DirectHandleIS1_EEPKc -_ZN2v88internal6Object23CreateListFromArrayLikeEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_12ElementTypesE _ZN2v88internal6Object22GetLengthFromArrayLikeEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEE _ZN2v88internal6Object24InstantiateIfLazyClosureEPNS0_14LookupIteratorENS0_12DirectHandleIS1_EE _ZN2v88internal6Object11SetPropertyEPNS0_14LookupIteratorENS0_12DirectHandleIS1_EENS0_11StoreOriginENS_5MaybeINS0_11ShouldThrowEEE @@ -5821,14 +5792,6 @@ _ZNSt4__Cr26__insertion_sort_unguardedINS_17_ClassicAlgPolicyERN2v88internal19En _ZNSt4__Cr31__partition_with_equals_on_leftINS_17_ClassicAlgPolicyEN2v88internal10AtomicSlotERNS3_19EnumIndexComparatorINS3_14NameDictionaryEEEEET0_S9_S9_T1_ _ZNSt4__Cr32__partition_with_equals_on_rightINS_17_ClassicAlgPolicyEN2v88internal10AtomicSlotERNS3_19EnumIndexComparatorINS3_14NameDictionaryEEEEENS_4pairIT0_bEESA_SA_T1_ _ZNSt4__Cr27__insertion_sort_incompleteINS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotEEEbT1_S9_T0_ -_ZNSt4__Cr19__partial_sort_implINS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotES8_EET1_S9_S9_T2_OT0_ -_ZNSt4__Cr11__make_heapINS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotEEEvT1_S9_OT0_ -_ZNSt4__Cr11__sift_downINS_17_ClassicAlgPolicyELb0ERN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotEEEvT2_OT1_NS_15iterator_traitsIS9_E15difference_typeESE_ -_ZNSt4__Cr11__sift_downINS_17_ClassicAlgPolicyELb1ERN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotEEEvT2_OT1_NS_15iterator_traitsIS9_E15difference_typeESE_ -_ZNSt4__Cr10__pop_heapINS_17_ClassicAlgPolicyEN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotEEEvT1_S8_RT0_NS_15iterator_traitsIS8_E15difference_typeE -_ZNSt4__Cr11__introsortINS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_16GlobalDictionaryEEENS3_10AtomicSlotELb0EEEvT1_S9_T0_NS_15iterator_traitsIS9_E15difference_typeEb -_ZNSt4__Cr7__sort3INS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_16GlobalDictionaryEEENS3_10AtomicSlotETnNS_9enable_ifIXnt21__use_branchless_sortIT0_T1_EEiE4typeELi0EEEbSB_SB_SB_SA_ -_ZNSt4__Cr7__sort4INS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_16GlobalDictionaryEEENS3_10AtomicSlotETnNS_9enable_ifIXnt21__use_branchless_sortIT0_T1_EEiE4typeELi0EEEvSB_SB_SB_SB_SA_ _ZNSt4__Cr10__pop_heapINS_17_ClassicAlgPolicyEN2v88internal19EnumIndexComparatorINS3_16GlobalDictionaryEEENS3_10AtomicSlotEEEvT1_S8_RT0_NS_15iterator_traitsIS8_E15difference_typeE _ZN2v88internal17PrototypeIterator23AdvanceFollowingProxiesEv _ZN2v88internal17PrototypeIterator43AdvanceFollowingProxiesIgnoringAccessChecksEv @@ -5900,6 +5863,11 @@ _ZN2v88internal10JSReceiver17SetIntegrityLevelEPNS0_7IsolateENS0_12DirectHandleI _ZN2v88internal8JSObject18TestIntegrityLevelEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_18PropertyAttributesE _ZN2v88internal8JSObject31PreventExtensionsWithTransitionILNS0_18PropertyAttributesE4EEENS_5MaybeIbEEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_11ShouldThrowE _ZN2v88internal8JSObject31PreventExtensionsWithTransitionILNS0_18PropertyAttributesE5EEENS_5MaybeIbEEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_11ShouldThrowE +_ZN2v88internal10JSReceiver17PreventExtensionsEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_11ShouldThrowE +_ZN2v88internal10JSReceiver18TestIntegrityLevelEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_18PropertyAttributesE +_ZN2v88internal12_GLOBAL__N_125GenericTestIntegrityLevelEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEENS0_18PropertyAttributesE +_ZN2v88internal8JSObject17PreventExtensionsEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_11ShouldThrowE +_ZN2v88internal10JSReceiver12IsExtensibleEPNS0_7IsolateENS0_12DirectHandleIS1_EE _ZN2v88internal25FastGetOwnValuesOrEntriesEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEEbPNS0_6HandleINS0_10FixedArrayEEE _ZN2v88internal8JSObject14FastPropertyAtEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_14RepresentationENS0_10FieldIndexE _ZN2v88internal21GetOwnValuesOrEntriesEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEENS0_14PropertyFilterEbb @@ -6396,9 +6364,7 @@ _ZN2v88internal20MarkCompactCollector28CustomRootBodyMarkingVisitorD0Ev _ZN2v88internal20MarkCompactCollector28CustomRootBodyMarkingVisitor13VisitPointersENS0_6TaggedINS0_10HeapObjectEEENS0_20CompressedObjectSlotES6_ _ZN2v88internal20MarkCompactCollector28CustomRootBodyMarkingVisitor13VisitPointersENS0_6TaggedINS0_10HeapObjectEEENS0_25CompressedMaybeObjectSlotES6_ _ZN2v88internal20MarkCompactCollector28CustomRootBodyMarkingVisitor29VisitInstructionStreamPointerENS0_6TaggedINS0_4CodeEEENS0_27OffHeapCompressedObjectSlotINS0_29ExternalCodeCompressionSchemeEEE -_ZN2v88internal20MarkCompactCollector23SharedHeapObjectVisitor12VisitPointerENS0_6TaggedINS0_10HeapObjectEEENS0_25CompressedMaybeObjectSlotE -_ZN2v88internal20MarkCompactCollector23SharedHeapObjectVisitor15VisitCodeTargetENS0_6TaggedINS0_17InstructionStreamEEEPNS0_9RelocInfoE -_ZN2v88internal20MarkCompactCollector23SharedHeapObjectVisitor20VisitEmbeddedPointerENS0_6TaggedINS0_17InstructionStreamEEEPNS0_9RelocInfoE +_ZN2v88internal20MarkCompactCollector28CustomRootBodyMarkingVisitor12VisitPointerENS0_6TaggedINS0_10HeapObjectEEENS0_20CompressedObjectSlotE _ZN2v88internal20MarkCompactCollector23SharedHeapObjectVisitor15VisitMapPointerENS0_6TaggedINS0_10HeapObjectEEE _ZN2v88internal13RememberedSetILNS0_17RememberedSetTypeE3EE6InsertILNS0_10AccessModeE1EEEvPNS0_11MutablePageEm _ZNSt4__Cr26__throw_bad_variant_accessEv @@ -6433,6 +6399,8 @@ _ZN2v88internal13NativeContext14BodyDescriptor11IterateBodyINS0_18MainMarkingVis _ZN2v88internal24FixedRangeBodyDescriptorILi12ELi24EE11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal24FixedRangeBodyDescriptorILi4ELi32EE11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal12PreparseData14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ +_ZN2v88internal24FixedRangeBodyDescriptorILi4ELi20EE11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ +_ZN2v88internal7JSProxy14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZNK2v88internal18MarkingVisitorBaseINS0_18MainMarkingVisitorEE23ShouldFlushBaselineCodeENS0_6TaggedINS0_10JSFunctionEEE _ZNK2v88internal10JSFunction8raw_codeENS0_17IsolateForSandboxENS_14AcquireLoadTagE _ZN2v88internal10JSFunction30NeedsResetDueToFlushedBytecodeEPNS0_7IsolateENS0_6TaggedINS0_18SharedFunctionInfoEEENS4_INS0_4CodeEEE @@ -6504,8 +6472,7 @@ _ZN2v88internal25RecordMigratedSlotVisitor15VisitMapPointerENS0_6TaggedINS0_10He _ZN2v88internal25RecordMigratedSlotVisitor12VisitPointerENS0_6TaggedINS0_10HeapObjectEEENS0_20CompressedObjectSlotE _ZN2v88internal25RecordMigratedSlotVisitor18RecordMigratedSlotENS0_6TaggedINS0_10HeapObjectEEENS2_INS0_5UnionIJNS0_3SmiES3_NS0_4WeakIS3_EEEEEEEm _ZN2v88internal13RememberedSetILNS0_17RememberedSetTypeE6EE6InsertILNS0_10AccessModeE1EEEvPNS0_11MutablePageEm -_ZN2v88internal25SmallOrderedHashTableImplINS0_19SmallOrderedHashSetEE14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS7_INS0_10HeapObjectEEEiPT_ -_ZN2v88internal25SmallOrderedHashTableImplINS0_26SmallOrderedNameDictionaryEE14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS7_INS0_10HeapObjectEEEiPT_ +_ZN2v88internal13RememberedSetILNS0_17RememberedSetTypeE5EE6InsertILNS0_10AccessModeE1EEEvPNS0_11MutablePageEm _ZN2v88internal24FixedRangeBodyDescriptorILi4ELi56EE11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal22SubclassBodyDescriptorINS0_19FixedBodyDescriptorILi4ELi32ELi32EEENS2_ILi32ELi76ELi76EEEE11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS8_INS0_10HeapObjectEEEiPT_ _ZN2v88internal19SwissNameDictionary14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ @@ -6532,8 +6499,8 @@ _ZN2v88internal10JSFunction14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlo _ZN2v88internal8JSRegExp14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal26JSSynchronizationPrimitive14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal12JSTypedArray14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ -_ZN2v88internal23WasmTrustedInstanceData14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ -_ZN2v88internal19WasmSuspenderObject14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ +_ZN2v88internal9JSWeakRef14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ +_ZN2v88internal16WasmGlobalObject14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal8JSObject18FastBodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal28JSAPIObjectWithEmbedderSlots14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal25PrecisePagePinningVisitorD0Ev @@ -6563,11 +6530,6 @@ _ZN2v88internal23EvacuateNewSpaceVisitor5VisitENS0_6TaggedINS0_10HeapObjectEEENS _ZN2v88internal19EvacuateVisitorBase16RawMigrateObjectILNS1_13MigrationModeE0EEEvPS1_NS0_6TaggedINS0_10HeapObjectEEES7_NS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEENS0_15AllocationSpaceE _ZN2v88internal19EvacuateVisitorBaseD0Ev _ZN2v88internal19EvacuateVisitorBase17TryEvacuateObjectENS0_15AllocationSpaceENS0_6TaggedINS0_10HeapObjectEEENS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEEPS5_ -_ZN2v88internal19EvacuationAllocator8AllocateENS0_15AllocationSpaceENS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEENS0_19AllocationAlignmentE -_ZN2v88internal32EvacuateNewToOldSpacePageVisitorD0Ev -_ZN2v88internal19EvacuateVisitorBaseD2Ev -_ZN2v88internal23EvacuateOldSpaceVisitorD0Ev -_ZN2v88internal23EvacuateOldSpaceVisitor5VisitENS0_6TaggedINS0_10HeapObjectEEENS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEE _ZN2v88internal19EvacuateVisitorBase16RawMigrateObjectILNS1_13MigrationModeE1EEEvPS1_NS0_6TaggedINS0_10HeapObjectEEES7_NS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEENS0_15AllocationSpaceE _ZZNSt4__Cr6vectorIPN2v88internal17MigrationObserverENS_9allocatorIS4_EEE12emplace_backIJRKS4_EEERS4_DpOT_ENKUlvE0_clEv _ZNSt4__Cr6vectorIPN2v88internal17MigrationObserverENS_9allocatorIS4_EEE20__throw_length_errorEv @@ -6618,6 +6580,7 @@ _ZN4absl18container_internal23TypeErasedApplyToSlotFnIN2v88internal6Object6Hashe _ZN4absl18container_internal12raw_hash_setINS0_17FlatHashMapPolicyIN2v88internal6TaggedINS4_10HeapObjectEEENS3_4base11SmallVectorIS7_Lm1ENSt4__Cr9allocatorIS7_EEEEEEJNS4_6Object6HasherENSF_12KeyEqualSafeEEE19transfer_n_slots_fnEPvSJ_SJ_m _ZN4absl18container_internal12raw_hash_setINS0_17FlatHashMapPolicyIN2v88internal6TaggedINS4_10HeapObjectEEENS3_4base11SmallVectorIS7_Lm1ENSt4__Cr9allocatorIS7_EEEEEEJNS4_6Object6HasherENSF_12KeyEqualSafeEEE46transfer_unprobed_elements_to_next_capacity_fnERNS0_12CommonFieldsEPKNS0_6ctrl_tEPvSO_PFvSO_hmmE _ZN4absl18container_internal15map_slot_policyIN2v88internal6TaggedINS3_10HeapObjectEEENS2_4base11SmallVectorIS6_Lm1ENSt4__Cr9allocatorIS6_EEEEE8transferINSA_INS9_4pairIKS6_SC_EEEEEEDaPT_PNS0_13map_slot_typeIS6_SC_EESN_ +_ZN4heap4base8WorklistIN2v88internal9EphemeronELt64EE5Local18PublishPushSegmentEv _ZN2v88internal20MarkCompactCollector22ProcessMarkingWorklistILNS1_29MarkingWorklistProcessingModeE1EEENSt4__Cr4pairImmEENS_4base9TimeDeltaEm _ZN4absl18container_internal12raw_hash_setINS0_17FlatHashMapPolicyIN2v88internal6TaggedINS4_10HeapObjectEEENS3_4base11SmallVectorIS7_Lm1ENSt4__Cr9allocatorIS7_EEEEEEJNS4_6Object6HasherENSF_12KeyEqualSafeEEE5eraseENSI_8iteratorE _ZNK4heap4base8WorklistIN2v88internal9EphemeronELt64EE5Local10NewSegmentEv @@ -6680,6 +6643,8 @@ _ZN2v88internal16MarkingWorklists5Local7IsEmptyEv _ZNK2v88internal16MarkingWorklists5Local14IsWrapperEmptyEv _ZN2v88internal16MarkingWorklists5Local9ShareWorkEv _ZNSt4__Cr8for_eachINS_11__wrap_iterIPN4heap4base8WorklistIN2v88internal6TaggedINS6_10HeapObjectEEELt64EE5LocalEEEZNS6_16MarkingWorklists5Local9ShareWorkEvE3$_0EET0_T_SI_SH_ +_ZN2v88internal16MarkingWorklists5Local11PublishWorkEv +_ZN2v88internal16MarkingWorklists5Local11MergeOnHoldEv _ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeImjEENS_22__unordered_map_hasherImNS_4pairIKmjEEN2v88internal16MarkingWorklists11ContextHashENS_8equal_toImEEEENS_21__unordered_map_equalImS6_SC_SA_EENS_9allocatorIS6_EEE16__emplace_uniqueIJRmjEEENS4_INS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEEDpOT_ENKUlRS5_SK_OjE_clESV_SK_SW_ _ZN2v88internal11WeakObjects5LocalC2EPS1_ _ZN2v88internal11WeakObjects5LocalC1EPS1_ @@ -6967,6 +6932,7 @@ _ZN2v88internal18FlatStringToDoubleENS0_6TaggedINS0_6StringEEENS0_14ConversionFl _ZN2v88internal17TryStringToDoubleEPNS0_12LocalIsolateENS0_12DirectHandleINS0_6StringEEEj _ZN2v88internal14TryStringToIntEPNS0_12LocalIsolateENS0_12DirectHandleINS0_6StringEEEi _ZN2v88internal14IsSpecialIndexENS0_6TaggedINS0_6StringEEE +_ZN2v88internal14IsSpecialIndexENS0_6TaggedINS0_6StringEEERNS0_31SharedStringAccessGuardIfNeededE _ZN2v88internal25InternalStringToIntDoubleILi1EtEEdPKT0_S4_bb _ZN2v88internal25InternalStringToIntDoubleILi2EtEEdPKT0_S4_bb _ZN2v88internal25InternalStringToIntDoubleILi3EtEEdPKT0_S4_bb @@ -7331,6 +7297,8 @@ _ZN2v88internal12DeserializerINS0_12LocalIsolateEE13ReadRootArrayINS0_21SlotAcce _ZN2v88internal12DeserializerINS0_12LocalIsolateEE22ReadStartupObjectCacheINS0_21SlotAccessorForHandleIS2_EEEEihT_ _ZN2v88internal12DeserializerINS0_12LocalIsolateEE25ReadSharedHeapObjectCacheINS0_21SlotAccessorForHandleIS2_EEEEihT_ _ZN2v88internal12DeserializerINS0_12LocalIsolateEE21ReadExternalReferenceINS0_21SlotAccessorForHandleIS2_EEEEihT_ +_ZN2v88internal12DeserializerINS0_12LocalIsolateEE24ReadRawExternalReferenceINS0_21SlotAccessorForHandleIS2_EEEEihT_ +_ZN2v88internal12DeserializerINS0_12LocalIsolateEE21ReadAttachedReferenceINS0_21SlotAccessorForHandleIS2_EEEEihT_ _ZN2v88internal12DeserializerINS0_12LocalIsolateEE23ReadOffHeapBackingStoreINS0_24SlotAccessorForRootSlotsEEEihT_ _ZN2v88internal12DeserializerINS0_12LocalIsolateEE16ReadApiReferenceINS0_24SlotAccessorForRootSlotsEEEihT_ _ZN2v88internal12DeserializerINS0_12LocalIsolateEE13ReadHotObjectINS0_24SlotAccessorForRootSlotsEEEihT_ @@ -7347,6 +7315,18 @@ _ZN2v88internal20FixedStringAllocator8allocateEj _ZN2v88internal20FixedStringAllocator4growEPj _ZN2v88internal12StringStream3PutEc _ZN2v88internal12StringStream3AddENS_4base6VectorIKcEENS3_INS1_6FmtElmEEE +_ZN2v88internal12StringStream13PrintUsingMapEPNS0_7IsolateENS0_6TaggedINS0_8JSObjectEEE +_ZN2v88internal12StringStream15PrintFixedArrayENS0_6TaggedINS0_10FixedArrayEEEj +_ZN2v88internal12StringStream14PrintByteArrayENS0_6TaggedINS0_9ByteArrayEEE +_ZN2v88internal12StringStream25PrintMentionedObjectCacheEPNS0_7IsolateE +_ZN2v88internal12StringStream27PrintSecurityTokenIfChangedEPNS0_7IsolateENS0_6TaggedINS0_10JSFunctionEEE +_ZN2v88internal12StringStream13PrintFunctionEPNS0_7IsolateENS0_6TaggedINS0_10JSFunctionEEENS4_INS0_6ObjectEEE +_ZN2v88internal12StringStream14PrintPrototypeEPNS0_7IsolateENS0_6TaggedINS0_10JSFunctionEEENS4_INS0_6ObjectEEE +_ZN2v88internal19HeapStringAllocator4growEPj +_ZN2v88internal19HeapStringAllocatorD2Ev +_ZN2v88internal19HeapStringAllocatorD0Ev +_ZN2v88internal15StringAllocatorD2Ev +_ZN2v88internal20FixedStringAllocatorD0Ev _ZZNSt4__Cr6vectorIN2v88internal6HandleINS2_10HeapObjectEEENS_9allocatorIS5_EEE12emplace_backIJS5_EEERS5_DpOT_ENKUlvE0_clEv _ZN2v88internal9ScopeInfo6CreateINS0_7IsolateEEENS0_6HandleIS1_EEPT_PNS0_4ZoneEPNS0_5ScopeENS0_17MaybeDirectHandleIS1_EENS0_12FunctionKindE _ZN2v88internal20SourceTextModuleInfo3NewINS0_7IsolateEEENS0_12DirectHandleIS1_EEPT_PNS0_4ZoneEPNS0_26SourceTextModuleDescriptorE @@ -7624,7 +7604,6 @@ _ZN2v88internal18BasicBlockProfiler11ResetCountsEPNS0_7IsolateE _ZN2v88internal18BasicBlockProfiler7HasDataEPNS0_7IsolateE _ZN2v88internal18BasicBlockProfiler5PrintEPNS0_7IsolateERNSt4__Cr13basic_ostreamIcNS4_11char_traitsIcEEEE _ZN2v88internallsERNSt4__Cr13basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_22BasicBlockProfilerDataE -_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal7BuiltinENS_13unordered_mapIS4_NS3_15CallProbabilityENS_4hashIS4_EENS_8equal_toIS4_EENS_9allocatorINS_4pairIKS4_S6_EEEEEEEENS_22__unordered_map_hasherIS4_NSC_ISD_SG_EES8_SA_EENS_21__unordered_map_equalIS4_SJ_SA_S8_EENSB_ISJ_EEE11__do_rehashILb1EEEvm _ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal7BuiltinENS3_15CallProbabilityEEENS_22__unordered_map_hasherIS4_NS_4pairIKS4_S5_EENS_4hashIS4_EENS_8equal_toIS4_EEEENS_21__unordered_map_equalIS4_SA_SE_SC_EENS_9allocatorISA_EEE16__emplace_uniqueIJRS9_RS5_EEENS8_INS_15__hash_iteratorIPNS_11__hash_nodeIS6_PvEEEEbEEDpOT_ENKUlSM_SM_SN_E_clESM_SM_SN_ _ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal7BuiltinENS3_15CallProbabilityEEENS_22__unordered_map_hasherIS4_NS_4pairIKS4_S5_EENS_4hashIS4_EENS_8equal_toIS4_EEEENS_21__unordered_map_equalIS4_SA_SE_SC_EENS_9allocatorISA_EEE11__do_rehashILb1EEEvm _ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal7BuiltinEjEENS_22__unordered_map_hasherIS4_NS_4pairIKS4_jEENS_4hashIS4_EENS_8equal_toIS4_EEEENS_21__unordered_map_equalIS4_S9_SD_SB_EENS_9allocatorIS9_EEE16__emplace_uniqueIJRS4_RiEEENS7_INS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEEDpOT_ENKUlRS8_SL_SM_E_clESX_SL_SM_ @@ -8440,8 +8419,6 @@ _ZN2v88internal16InterpretedFrame19PatchBytecodeOffsetEi _ZN2v88internal16InterpretedFrame18PatchBytecodeArrayENS0_6TaggedINS0_13BytecodeArrayEEE _ZNK2v88internal13BaselineFrame17GetBytecodeOffsetEv _ZN2v88internal4Code30GetBytecodeOffsetForBaselinePCEmNS0_6TaggedINS0_13BytecodeArrayEEE -_ZN2v88internal26FastConstructStubFrameInfoC2Eb -_ZN2v88internal26FastConstructStubFrameInfoC1Eb _ZN2v88internal28BuiltinContinuationFrameInfoC2EiRKNS0_23CallInterfaceDescriptorEPKNS0_21RegisterConfigurationEbNS0_14DeoptimizeKindENS0_23BuiltinContinuationModeENS0_13FrameInfoKindE _ZN2v88internal28BuiltinContinuationFrameInfoC1EiRKNS0_23CallInterfaceDescriptorEPKNS0_21RegisterConfigurationEbNS0_14DeoptimizeKindENS0_23BuiltinContinuationModeENS0_13FrameInfoKindE _ZNK2v88internal10TypedFrame14unchecked_codeEv @@ -8716,6 +8693,15 @@ _ZN2v88internal5Debug19return_value_handleEv _ZN2v88internal16ReturnValueScopeD2Ev _ZN2v88internal16ReturnValueScopeD1Ev _ZN2v88internal5Debug32UpdateDebugInfosForExecutionModeEv +_ZN2v88internal11StructProxy7GetNameEPNS0_7IsolateENS0_12DirectHandleINS0_10WasmStructEEEj +_ZN2v88internal10ArrayProxy14CreateTemplateEPNS_7IsolateE +_ZN2v88internal12_GLOBAL__N_117IndexedDebugProxyINS0_10ArrayProxyELNS1_12DebugProxyIdE8ENS0_9WasmArrayEE13IndexedGetterEjRKNS_20PropertyCallbackInfoINS_5ValueEEE +_ZN2v88internal12_GLOBAL__N_117IndexedDebugProxyINS0_10ArrayProxyELNS1_12DebugProxyIdE8ENS0_9WasmArrayEE12IndexedQueryEjRKNS_20PropertyCallbackInfoINS_7IntegerEEE +_ZN2v88internal12_GLOBAL__N_117IndexedDebugProxyINS0_10ArrayProxyELNS1_12DebugProxyIdE8ENS0_9WasmArrayEE17IndexedEnumeratorERKNS_20PropertyCallbackInfoINS_5ArrayEEE +_ZN2v88internal12_GLOBAL__N_117IndexedDebugProxyINS0_10ArrayProxyELNS1_12DebugProxyIdE8ENS0_9WasmArrayEE17IndexedDescriptorEjRKNS_20PropertyCallbackInfoINS_5ValueEEE +_ZN2v88internal12_GLOBAL__N_112ContextProxy14CreateTemplateEPNS_7IsolateE +_ZN2v88internal12_GLOBAL__N_111LocalsProxy6CreateEPNS0_9WasmFrameE +_ZN2v88internal12_GLOBAL__N_110StackProxy6CreateEPNS0_9WasmFrameE _ZN2v88internal12_GLOBAL__N_112ContextProxy11NamedGetterENS_5LocalINS_4NameEEERKNS_20PropertyCallbackInfoINS_5ValueEEE _ZN2v88internal10JSReceiver11GetPropertyEPNS0_7IsolateENS0_12DirectHandleIS1_EEPKc _ZN2v88internal12_GLOBAL__N_115NamedDebugProxyINS1_11LocalsProxyELNS1_12DebugProxyIdE5ENS0_10FixedArrayEE14CreateTemplateEPNS_7IsolateE @@ -8748,26 +8734,6 @@ _ZN2v88internal4wasm26WasmModuleSignatureStorage19AllocateMoreStorageEm _ZNSt4__Cr6vectorIhNS_9allocatorIhEEE6resizeEm _ZNSt4__Cr6vectorIhNS_9allocatorIhEEE20__throw_length_errorEv _ZNSt4__Cr6vectorINS0_IhNS_9allocatorIhEEEENS1_IS3_EEE24__emplace_back_slow_pathIJS3_EEEPS3_DpOT_ -_ZNSt4__Cr6vectorINS0_IhNS_9allocatorIhEEEENS1_IS3_EEE20__throw_length_errorEv -_ZN2v88internal4wasm17ModuleDecoderImpl20consume_storage_typeEv -_ZN2v88internal4wasm14StructTypeBase17InitializeOffsetsEv -_ZN2v88internal4wasm7Decoder6errorfIJjPKcS5_jS5_EEEvPKhS5_DpT_ -_ZN2v88internal4wasm7Decoder6errorfIJjjPKcEEEvPKhS5_DpT_ -_ZN2v88internal4wasm7Decoder6errorfIJjjjjEEEvPKhPKcDpT_ -_ZN2v88internal4wasm7Decoder6errorfIJjjEEEvPKhPKcDpT_ -_ZN2v88internal4wasm7Decoder6errorfIJjPKcEEEvPKhS5_DpT_ -_ZNK2v88internal4wasm10WasmModule9heap_typeENS1_15ModuleTypeIndexE -_ZNSt4__Cr6vectorIN2v88internal4wasm18CanonicalTypeIndexENS_9allocatorIS4_EEE6resizeEm -_ZN2v88internal4wasm7Decoder6errorfIJjEEEvPKcDpT_ -_ZN2v88internal4wasm7Decoder6errorfIJjjEEEvPKcDpT_ -_ZN2v88internal4wasm7Decoder6errorfIJjPKcS5_jS5_EEEvjS5_DpT_ -_ZN2v88internal4wasm7Decoder6errorfIJjjPKcEEEvjS5_DpT_ -_ZN2v88internal4wasm7Decoder6errorfIJjjjjEEEvjPKcDpT_ -_ZN2v88internal4wasm7Decoder6errorfIJjjEEEvjPKcDpT_ -_ZN2v88internal4wasm7Decoder6errorfIJjPKcEEEvjS5_DpT_ -_ZNSt4__Cr6vectorIN2v88internal4wasm18CanonicalTypeIndexENS_9allocatorIS4_EEE20__throw_length_errorEv -_ZN2v88internal4wasm17ModuleDecoderImpl25DecodeSingleOrGroupImportENS1_12WireBytesRefES3_NS1_20ImportExportKindCodeEb -_ZNSt4__Cr6vectorIN2v88internal4wasm26AsmJsOffsetFunctionEntriesENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJS4_EEEPS4_DpOT_ _ZZNSt4__Cr6vectorIN2v88internal4wasm19CustomSectionOffsetENS_9allocatorIS4_EEE12emplace_backIJS4_EEERS4_DpOT_ENKUlvE0_clEv _ZNSt4__Cr6vectorIN2v88internal4wasm19CustomSectionOffsetENS_9allocatorIS4_EEE20__throw_length_errorEv _ZN2v88internal4wasm12_GLOBAL__N_121ValidateFunctionsTaskD2Ev @@ -8810,17 +8776,12 @@ _ZN7simdutf23atomic_binary_to_base64EPKcmPcNS_14base64_optionsE _ZN7simdutf16binary_to_base64EPKcmPcNS_14base64_optionsE _ZN7simdutf21base64_to_binary_safeEPKcmPcRmNS_14base64_optionsENS_27last_chunk_handling_optionsEb _ZN7simdutf26base64_to_binary_safe_implIcEENS_6resultEPKT_mPcRmNS_14base64_optionsENS_27last_chunk_handling_optionsEb -_ZNK7simdutf7haswell14implementation25utf32_length_from_utf16leEPKDsm -_ZNK7simdutf7haswell14implementation25utf32_length_from_utf16beEPKDsm -_ZNK7simdutf7haswell14implementation22utf16_length_from_utf8EPKcm -_ZNK7simdutf7haswell14implementation41utf8_length_from_utf16le_with_replacementEPKDsm -_ZNK7simdutf7haswell14implementation41utf8_length_from_utf16be_with_replacementEPKDsm -_ZNK7simdutf7haswell14implementation23utf8_length_from_latin1EPKcm -_ZNK7simdutf7haswell14implementation22utf8_length_from_utf32EPKDim -_ZNK7simdutf7haswell14implementation23utf16_length_from_utf32EPKDim -_ZNK7simdutf7haswell14implementation22utf32_length_from_utf8EPKcm -_ZNK7simdutf7haswell14implementation16base64_to_binaryEPKcmPcNS_14base64_optionsENS_27last_chunk_handling_optionsE -_ZN7simdutf7haswell12_GLOBAL__N_16base6422compress_decode_base64ILb0ELb1ELb1EcEENS_11full_resultEPcPKT2_mNS_14base64_optionsENS_27last_chunk_handling_optionsE +_ZNK7simdutf7icelake14implementation25utf32_length_from_utf16beEPKDsm +_ZNK7simdutf7icelake14implementation23utf8_length_from_latin1EPKcm +_ZNK7simdutf7icelake14implementation22utf16_length_from_utf8EPKcm +_ZNK7simdutf7icelake14implementation41utf8_length_from_utf16le_with_replacementEPKDsm +_ZNK7simdutf7icelake14implementation41utf8_length_from_utf16be_with_replacementEPKDsm +_ZNK7simdutf7icelake14implementation22utf8_length_from_utf32EPKDim _ZNK7simdutf8westmere14implementation4findEPKDsS3_Ds _ZNK7simdutf14implementation4nameEv _ZNK7simdutf14implementation11descriptionEv @@ -9038,6 +8999,19 @@ uscript_getScript_77 uscript_hasScript_77 ublock_getCode_77 uchar_addPropertyStarts_77 +_ZL24_enumPropertyStartsRangePKviij +upropsvec_addPropertyStarts_77 +ublock_addPropertyStarts_77 +utrie2_get32_77 +utrie2_openFromSerialized_77 +utrie2_close_77 +utrie2_isFrozen_77 +utrie2_enum_77 +_ZL14enumEitherTriePK6UTrie2iiPFjPKvjEPFaS3_iijES3_ +utrie2_enumForLeadSurrogate_77 +_ZL13enumSameValuePKvj +utf8_nextCharSafeBody_77 +utf8_prevCharSafeBody_77 utf8_back1SafeBody_77 uprv_malloc_77 uprv_realloc_77 @@ -9091,9 +9065,6 @@ _ZNKSt4__Cr12__hash_tableIN2v88internal4wasm17TypeCanonicalizer14CanonicalGroupE _ZNKSt4__Cr12__hash_tableIN2v88internal4wasm17TypeCanonicalizer23CanonicalSingletonGroupENS1_4base4hashIS5_EENS_8equal_toIS5_EENS_9allocatorIS5_EEE4findIS5_EENS_21__hash_const_iteratorIPNS_11__hash_nodeIS5_PvEEEERKT_ _ZNK2v88internal4wasm13ValueTypeBase23value_type_code_numericEv _ZNK2v88internal4wasm13ValueTypeBase23value_type_code_genericEv -_ZNK2v88internal4wasm13ValueTypeBase21generic_heaptype_nameEv -_ZNK2v88internal4wasm13ValueTypeBase4nameEv -_ZN2v88internal4wasm27WasmReturnTypeFromSignatureEPKNS1_12CanonicalSigE _ZN2v88internal4wasm20EquivalentNumericSigEPKNS1_12CanonicalSigEPKNS0_9SignatureINS1_9ValueTypeEEE _ZN2v88internal4wasm12CanonicalSigC2EmmPKNS1_18CanonicalValueTypeENS1_18CanonicalTypeIndexE _ZN2v88internal4wasm12CanonicalSigC1EmmPKNS1_18CanonicalValueTypeENS1_18CanonicalTypeIndexE @@ -9113,7 +9084,6 @@ _ZN2v88internal4wasm12ErrorThrowerD1Ev _ZN2v88internal4wasm22ValidSubtypeDefinitionENS1_15ModuleTypeIndexES2_PKNS1_10WasmModuleE _ZN2v88internal4wasm15IsSubtypeOfImplENS1_8HeapTypeES2_PKNS1_10WasmModuleES5_ _ZN2v88internal4wasm12_GLOBAL__N_122IsSubtypeOf_CommonImplENS1_13ValueTypeBaseES3_ -_ZNSt4__Cr32__partition_with_equals_on_rightINS_17_ClassicAlgPolicyEPN2v88internal4wasm17LiftoffStackSlots4SlotERZNS5_15SortInPushOrderEvEUlRKS6_S9_E_EENS_4pairIT0_bEESD_SD_T1_ _ZNSt4__Cr27__insertion_sort_incompleteINS_17_ClassicAlgPolicyERZN2v88internal4wasm17LiftoffStackSlots15SortInPushOrderEvEUlRKNS5_4SlotES8_E_PS6_EEbT1_SC_T0_ _ZNSt4__Cr19__partial_sort_implINS_17_ClassicAlgPolicyERZN2v88internal4wasm17LiftoffStackSlots15SortInPushOrderEvEUlRKNS5_4SlotES8_E_PS6_SB_EET1_SC_SC_T2_OT0_ _ZN2v88internal10ZoneVectorIiE4GrowEm @@ -9753,7 +9723,6 @@ _ZN2v84base19TemplateHashMapImplIPvS2_NS0_26HashEqualityThenKeyMatcherIS2_PFbS2_ _ZNSt4__Cr10__function13__policy_funcIFvvEE11__call_funcIZN2v84base8CallOnceIJEEEvPNS_6atomicIhEENS6_16FunctionWithArgsIJDpT_EE4typeESD_Qsr3stdE13conjunction_vIDpNS_9is_scalarISC_EEEEUlvE_EEvPKNS0_16__policy_storageE _ZN2v88internal8HashSeed15InitializeRootsEPNS0_7IsolateE _ZN2v88internal23Runtime_IterableForEachEiPmPNS0_7IsolateE -_ZNK2v88internal12JSTypedArray12element_sizeEv _ZNK2v88internal12JSTypedArray34GetVariableByteLengthOrOutOfBoundsERb _ZNK2v88internal12JSTypedArray30GetVariableLengthOrOutOfBoundsERb _ZN2v88internal10Protectors30InvalidateArrayBufferDetachingEPNS0_7IsolateE @@ -9878,6 +9847,7 @@ _ZN2v88internal14OrderedHashSet18ConvertToKeysArrayEPNS0_7IsolateENS0_6HandleIS1 _ZN2v88internal14OrderedHashMap7GetHashEPNS0_7IsolateEm _ZN2v88internal32ArrayConstructInitializeElementsEPNS0_7IsolateENS0_12DirectHandleINS0_7JSArrayEEEPNS0_9ArgumentsILNS0_13ArgumentsTypeE1EEE _ZN2v88internal41CopyFastNumberJSArrayElementsToTypedArrayEmmmmm +_ZN2v88internal12_GLOBAL__N_121TypedElementsAccessorILNS0_12ElementsKindE18EE25TryCopyElementsFastNumberENS0_6TaggedINS0_7ContextEEENS5_INS0_7JSArrayEEENS5_INS0_12JSTypedArrayEEEmm _ZN2v88internal12_GLOBAL__N_121TypedElementsAccessorILNS0_12ElementsKindE41EE26CopyElementsFromTypedArrayENS0_6TaggedINS0_12JSTypedArrayEEES7_mm _ZN2v88internal27CopyTypedArrayElementsSliceEmmmm _ZN2v88internal16ElementsAccessor24InitializeOncePerProcessEv @@ -9893,6 +9863,7 @@ _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsA _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE16NumberOfElementsEPNS0_7IsolateENS0_6TaggedINS0_8JSObjectEEE _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE9SetLengthEPNS0_7IsolateENS0_12DirectHandleINS0_7JSArrayEEEj _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE21CollectElementIndicesENS0_12DirectHandleINS0_8JSObjectEEENS8_INS0_14FixedArrayBaseEEEPNS0_14KeyAccumulatorE +_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE22CollectValuesOrEntriesEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENSA_INS0_10FixedArrayEEEjbPjNS0_14PropertyFilterE _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE5ShiftEPNS0_7IsolateENS0_12DirectHandleINS0_7JSArrayEEE _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE9NormalizeEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEE _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE11GetCapacityENS0_6TaggedINS0_8JSObjectEEENS8_INS0_14FixedArrayBaseEEE @@ -10124,6 +10095,8 @@ _ZN2v88internal6Module11RecordErrorEPNS0_7IsolateENS0_6TaggedINS0_6ObjectEEE _ZN2v88internal6Module10ResetGraphEPNS0_7IsolateENS0_12DirectHandleIS1_EE _ZN2v88internal6Module5ResetEPNS0_7IsolateENS0_12DirectHandleIS1_EE _ZN2v88internal6Module12GetExceptionEv +_ZN2v88internal6Module13ResolveExportEPNS0_7IsolateENS0_6HandleIS1_EENS0_12DirectHandleINS0_6StringEEENS4_IS7_EENS0_15MessageLocationEbPNS1_10ResolveSetE +_ZN2v88internal6Module11InstantiateEPNS0_7IsolateENS0_6HandleIS1_EENS_5LocalINS_7ContextEEERKNS1_20UserResolveCallbacksE _ZZNSt4__Cr6__treeINS_12__value_typeIPKN2v88internal12AstRawStringEPNS3_26SourceTextModuleDescriptor5EntryEEENS_19__map_value_compareIS6_NS_4pairIKS6_S9_EENS7_20AstRawStringComparerEEENS3_13ZoneAllocatorISE_EEE16__emplace_uniqueIJRS6_RS9_EEENSC_INS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEElEEbEEDpOT_ENKUlRSD_SL_SM_E_clESX_SL_SM_ _ZZNSt4__Cr6__treeINS_12__value_typeIPKN2v88internal12AstRawStringEPKNS3_26SourceTextModuleDescriptor5EntryEEENS_19__map_value_compareIS6_NS_4pairIKS6_SA_EENS7_20AstRawStringComparerEEENS3_13ZoneAllocatorISF_EEE16__emplace_uniqueIJRSE_RSA_EEENSD_INS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEElEEbEEDpOT_ENKUlSM_SM_SN_E_clESM_SM_SN_ _ZNSt4__Cr6__treeINS_12__value_typeIPKN2v88internal12AstRawStringEPNS3_26SourceTextModuleDescriptor5EntryEEENS_19__map_value_compareIS6_NS_4pairIKS6_S9_EENS7_20AstRawStringComparerEEENS3_13ZoneAllocatorISE_EEE15__emplace_multiIJRS6_RS9_EEENS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEElEEDpOT_ @@ -10171,7 +10144,6 @@ _ZN2v88internal14MessageHandler25ReportMessageNoExceptionsEPNS0_7IsolateEPKNS0_1 _ZN2v88internal14MessageHandler10GetMessageEPNS0_7IsolateENS0_12DirectHandleINS0_6ObjectEEE _ZN2v88internal16MessageFormatter6FormatEPNS0_7IsolateENS0_15MessageTemplateENS_4base6VectorIKNS0_12DirectHandleINS0_6ObjectEEEEE _ZN2v88internal10ErrorUtils16FormatStackTraceEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENS4_INS0_6ObjectEEE -_ZN2v88internal10ErrorUtils17CaptureStackTraceEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENS0_13FrameSkipModeENS0_6HandleINS0_6ObjectEEE _ZN2v88internal25StringBuilderConcatHelperIhEEvNS0_6TaggedINS0_6StringEEEPT_NS2_INS0_10FixedArrayEEEj _ZN2v88internal25StringBuilderConcatHelperItEEvNS0_6TaggedINS0_6StringEEEPT_NS2_INS0_10FixedArrayEEEj _ZN2v88internal25StringBuilderConcatLengthEiNS0_6TaggedINS0_10FixedArrayEEEiPb @@ -10198,15 +10170,15 @@ _ZN2v88internal24IncrementalStringBuilder12AppendStringENS0_12DirectHandleINS0_6 _ZN2v88internal12CallSiteInfo20ConstructFromRawDataEPNS0_7IsolateENS0_12DirectHandleINS0_10FixedArrayEEEi _ZN2v88internal12CallSiteInfo20ExpandDeferredFramesEPNS0_7IsolateENS0_6HandleINS0_10FixedArrayEEE _ZNK2v88internal18SharedFunctionInfo16GetBytecodeArrayINS0_7IsolateEEENS0_6TaggedINS0_13BytecodeArrayEEEPT_ +_ZNK2v88internal12CallSiteInfo12IsPromiseAllEv +_ZNK2v88internal12CallSiteInfo19IsPromiseAllSettledEv +_ZNK2v88internal12CallSiteInfo12IsPromiseAnyEv _ZN2v88internal12CallSiteInfo15GetFunctionNameENS0_12DirectHandleIS1_EE _ZN2v88internal12CallSiteInfo20GetFunctionDebugNameENS0_12DirectHandleIS1_EE _ZN2v88internal12CallSiteInfo13GetMethodNameENS0_12DirectHandleIS1_EE _ZNK2v88internal18SharedFunctionInfo13inferred_nameEv _ZN2v88internal11PropertyKeyC2INS0_6HandleEQsr3stdE16is_convertible_vIT_INS0_4NameEENS0_12DirectHandleIS5_EEEEEPNS0_7IsolateES6_ _ZN2v88internal12CallSiteInfo11GetTypeNameENS0_12DirectHandleIS1_EE -_ZN2v88internal12CallSiteInfo21ComputeSourcePositionENS0_12DirectHandleIS1_EEi -_ZN2v88internal12CallSiteInfo15ComputeLocationENS0_12DirectHandleIS1_EEPNS0_15MessageLocationE -_ZN2v88internal21SerializeCallSiteInfoEPNS0_7IsolateENS0_12DirectHandleINS0_12CallSiteInfoEEEPNS0_24IncrementalStringBuilderE _ZN2v88internal12_GLOBAL__N_121SerializeJSStackFrameEPNS0_7IsolateENS0_12DirectHandleINS0_12CallSiteInfoEEEPNS0_24IncrementalStringBuilderE _ZN2v88internal21SerializeCallSiteInfoEPNS0_7IsolateENS0_12DirectHandleINS0_12CallSiteInfoEEE _ZN2v88internal12_GLOBAL__N_118AppendFileLocationEPNS0_7IsolateENS0_12DirectHandleINS0_12CallSiteInfoEEEPNS0_24IncrementalStringBuilderE @@ -10544,8 +10516,7 @@ _ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE19VisitForInSt _ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE19VisitForOfStatementEPNS0_14ForOfStatementE _ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE24VisitExpressionStatementEPNS0_19ExpressionStatementE _ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE33VisitSloppyBlockFunctionStatementEPNS0_28SloppyBlockFunctionStatementE -_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE16VisitConditionalEPNS0_11ConditionalE -_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE19VisitCountOperationEPNS0_14CountOperationE +_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE16VisitIfStatementEPNS0_11IfStatementE _ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE25VisitImportCallExpressionEPNS0_20ImportCallExpressionE _ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE18VisitOptionalChainEPNS0_13OptionalChainE _ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE13VisitPropertyEPNS0_8PropertyE @@ -10834,9 +10805,6 @@ _ZL13isPOSIX_graphRK14BinaryPropertyi9UProperty _ZL13isPOSIX_printRK14BinaryPropertyi9UProperty _ZL14isPOSIX_xdigitRK14BinaryPropertyi9UProperty _ZL21changesWhenCasefoldedRK14BinaryPropertyi9UProperty -UDatamemory_assign_77 -UDataMemory_createNewInstance_77 -UDataMemory_normalizeDataPointer_77 UDataMemory_setData_77 udata_close_77 udata_getMemory_77 @@ -11027,6 +10995,9 @@ uprv_max_77 uprv_min_77 _ZN6icu_7721LoadedNormalizer2ImplD2Ev _ZN6icu_7721LoadedNormalizer2ImplD1Ev +_ZN6icu_7721LoadedNormalizer2ImplD0Ev +_ZN6icu_7721LoadedNormalizer2Impl12isAcceptableEPvPKcS3_PK9UDataInfo +_ZN6icu_7721LoadedNormalizer2Impl4loadEPKcS2_R10UErrorCode _ZNK6icu_776BMPSet8spanUTF8EPKhi17USetSpanCondition _ZNK6icu_776BMPSet12spanBackUTF8EPKhi17USetSpanCondition _ZN6icu_7712ByteSinkUtil12appendChangeEiPKDsiRNS_8ByteSinkEPNS_5EditsER10UErrorCode @@ -11095,6 +11066,7 @@ _ZN6icu_7718Normalizer2Factory14getFCDInstanceER10UErrorCode _ZN6icu_7718Normalizer2Factory10getNFCImplER10UErrorCode u_getCombiningClass_77 unorm_getFCD16_77 +_ZNK6icu_7719Normalizer2WithImpl9normalizeERKNS_13UnicodeStringERS1_R10UErrorCode _ZN2v84base7ieee7546legacy3powEdd _ZN2v84base7ieee7544sinhEd _ZN2v88internal16FuncNameInferrerC2EPNS0_15AstValueFactoryE @@ -11356,6 +11328,7 @@ _ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhE20ParseClassSetOperandEPKNS2_ _ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhE29AddMaybeSimpleCaseFoldedRangeEPNS0_8ZoneListINS1_14CharacterRangeEEES6_ _ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhE16ParseClassEscapeEPNS0_8ZoneListINS1_14CharacterRangeEEEPNS0_4ZoneEbPjPb _ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhE22ParseClassSetCharacterEv +_ZN2v88internal6regexp12_GLOBAL__N_111TextBuilder8ToRegExpEv _ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhE15ScanForCapturesENS2_18InClassEscapeStateE _ZN2v88internal10ZoneVectorIcE4GrowEm _ZN2v88internal6regexp12_GLOBAL__N_112_GLOBAL__N_123LookupPropertyValueNameE9UPropertyPKcbPNS0_8ZoneListINS1_14CharacterRangeEEEPNS0_7ZoneMapINS_4base6VectorIKjEEPNS1_4TreeENS1_24CharacterClassStringLessEEENSC_5FlagsINS1_4FlagEiiEEPNS0_4ZoneE @@ -11549,6 +11522,7 @@ _ZN2v88internal6regexp10Lookaround10ToNodeImplEPNS1_8CompilerEPNS1_4NodeE _ZN2v88internal6regexp7Capture10ToNodeImplEPNS1_8CompilerEPNS1_4NodeE _ZN2v88internal6regexp7Capture6ToNodeEPNS1_4TreeEiPNS1_8CompilerEPNS1_4NodeE _ZN2v88internal6regexp11Alternative10ToNodeImplEPNS1_8CompilerEPNS1_4NodeE +_ZN2v88internal6regexp14CharacterRange18AddCaseEquivalentsEPNS0_7IsolateEPNS0_4ZoneEPNS0_8ZoneListIS2_EEb _ZN2v88internal21FixedIntegerArrayBaseItNS0_9ByteArrayEE3NewIJEEENS0_6HandleIS3_EEPNS0_7IsolateEjDpOT_ _ZNKSt4__Cr12__hash_tableINS_17__hash_value_typeIjN2v88internal6HandleINS3_21FixedIntegerArrayBaseItNS3_9ByteArrayEEEEEEENS_22__unordered_map_hasherIjNS_4pairIKjS8_EENS2_4base4hashIjEENS_8equal_toIjEEEENS_21__unordered_map_equalIjSD_SI_SG_EENS3_13ZoneAllocatorISD_EEE4findIjEENS_21__hash_const_iteratorIPNS_11__hash_nodeIS9_PvEEEERKT_ _ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIjN2v88internal6HandleINS3_21FixedIntegerArrayBaseItNS3_9ByteArrayEEEEEEENS_22__unordered_map_hasherIjNS_4pairIKjS8_EENS2_4base4hashIjEENS_8equal_toIjEEEENS_21__unordered_map_equalIjSD_SI_SG_EENS3_13ZoneAllocatorISD_EEE16__emplace_uniqueIJRKNS_21piecewise_construct_tENS_5tupleIJRSC_EEENST_IJEEEEEENSB_INS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEEDpOT_ENKUlSU_SS_OSV_OSW_E_clESU_SS_S17_S18_ @@ -11564,6 +11538,7 @@ _Z22ulocimp_getKeywords_77NSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEEcbR _Z22ulocimp_getKeywords_77NSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEEcRN6icu_778ByteSinkEbR10UErrorCode _ZN12_GLOBAL__N_121compareKeywordStructsEPKvS1_S1_ uloc_getKeywordValue_77 +_Z26ulocimp_getKeywordValue_77PKcNSt4__Cr17basic_string_viewIcNS1_11char_traitsIcEEEER10UErrorCode uloc_getCurrentCountryID_77 uloc_getCurrentLanguageID_77 _Z22ulocimp_getLanguage_77NSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode @@ -11593,6 +11568,7 @@ _Z32ulocimp_toBcpTypeWithFallback_77NSt4__Cr17basic_string_viewIcNS_11char_trait uloc_toLegacyKey_77 _Z34ulocimp_toLegacyKeyWithFallback_77NSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEE uloc_toLegacyType_77 +_Z35ulocimp_toLegacyTypeWithFallback_77NSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEES3_ _ZN12_GLOBAL__N_125_isUnicodeExtensionSubtagERiPKci _Z24ulocimp_toLanguageTag_77PKcRN6icu_778ByteSinkEbR10UErrorCode _ZNSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEC2EPKc @@ -11695,7 +11671,10 @@ _ZN6icu_7718UStringEnumerationC2EP12UEnumeration _ZN6icu_7718UStringEnumerationC1EP12UEnumeration _ZN6icu_7718UStringEnumerationD2Ev _ZN6icu_7718UStringEnumerationD1Ev -_ZN6icu_7710MemoryPoolINS_10CharStringELi8EE6createIJEEEPS1_DpOT_ +_ZN6icu_7718UStringEnumerationD0Ev +_ZNK6icu_7718UStringEnumeration5countER10UErrorCode +_ZN6icu_7718UStringEnumeration4nextEPiR10UErrorCode +_ZN6icu_7718UStringEnumeration5snextER10UErrorCode _ZN6icu_7710MemoryPoolINS_10CharStringELi8EE6createIJRPKcR10UErrorCodeEEEPS1_DpOT_ _ZN6icu_7710MemoryPoolI10LocExtTypeLi8EE6createIJEEEPS1_DpOT_ _ZN6icu_7710MemoryPoolI9TypeAliasLi8EE6createIJS1_EEEPS1_DpOT_ @@ -11721,13 +11700,6 @@ _ZN6icu_7710UnicodeSet9closeOverEi _ZN6icu_7710UnicodeSet10setPatternERKNS_13UnicodeStringE _ZN6icu_7710UnicodeSet24closeOverCaseInsensitiveEb _ZN6icu_7710UnicodeSet24closeOverAddCaseMappingsEv -_ZNK6icu_7724WholeStringBreakIterator7getTextEv -_ZNK6icu_7724WholeStringBreakIterator8getUTextEP5UTextR10UErrorCode -_ZN6icu_7724WholeStringBreakIterator7setTextERKNS_13UnicodeStringE -_ZN6icu_7724WholeStringBreakIterator7setTextEP5UTextR10UErrorCode -_ZN6icu_7724WholeStringBreakIterator9adoptTextEPNS_17CharacterIteratorE -_ZN6icu_7724WholeStringBreakIterator5firstEv -_ZN6icu_7724WholeStringBreakIterator4lastEv _ZN6icu_7724WholeStringBreakIterator8previousEv _ZN6icu_7724WholeStringBreakIterator4nextEv _ZNK6icu_7724WholeStringBreakIterator7currentEv @@ -11809,7 +11781,6 @@ _ZN2v88internal6regexp18ExperimentalRegExp12CanBeHandledEPNS1_4TreeENS0_12Direct _ZN2v88internal6regexp18ExperimentalRegExp10InitializeEPNS0_7IsolateENS0_12DirectHandleINS0_8JSRegExpEEENS5_INS0_6StringEEES9_NS_4base5FlagsINS1_4FlagEiiEEi _ZN2v88internal6regexp18ExperimentalRegExp10IsCompiledENS0_12DirectHandleINS0_12IrRegExpDataEEEPNS0_7IsolateE _ZN2v88internal6regexp18ExperimentalRegExp7CompileEPNS0_7IsolateENS0_12DirectHandleINS0_12IrRegExpDataEEE -_ZN2v88internal12BackingStore35TryAllocateAndPartiallyCommitMemoryEPNS0_7IsolateEmmmmmNS0_14WasmMemoryFlagENS0_10SharedFlagEb _ZN2v88internal12BackingStore18AllocateWasmMemoryEPNS0_7IsolateEmmNS0_14WasmMemoryFlagENS0_10SharedFlagE _ZN2v88internal12BackingStore14CopyWasmMemoryEPNS0_7IsolateEmmNS0_14WasmMemoryFlagE _ZN2v88internal12BackingStore21GrowWasmMemoryInPlaceEPNS0_7IsolateEmm @@ -12363,15 +12334,6 @@ _ZN2v88internal8Compiler21GetSharedFunctionInfoINS0_7IsolateEEENS0_12DirectHandl _ZN2v88internal8Compiler21GetSharedFunctionInfoINS0_12LocalIsolateEEENS0_12DirectHandleINS0_18SharedFunctionInfoEEEPNS0_15FunctionLiteralENS4_INS0_6ScriptEEEPT_ _ZN2v88internal8Compiler22LogFunctionCompilationEPNS0_7IsolateENS0_16LogEventListener7CodeTagENS0_12DirectHandleINS0_6ScriptEEENS6_INS0_18SharedFunctionInfoEEENS6_INS0_14FeedbackVectorEEENS6_INS0_12AbstractCodeEEENS0_8CodeKindEd _ZN2v88internal23OptimizedCompilationJob10ExecuteJobEPNS0_16RuntimeCallStatsEPNS0_12LocalIsolateE -_ZN2v88internal23OptimizedCompilationJob11FinalizeJobEPNS0_7IsolateE -_ZN2v88internal23OptimizedCompilationJob19CollectRetainedMapsEPNS0_7IsolateENS0_12DirectHandleINS0_4CodeEEE -_ZN2v88internal23OptimizedCompilationJob34RegisterWeakObjectsInOptimizedCodeEPNS0_7IsolateENS0_12DirectHandleINS0_13NativeContextEEENS4_INS0_4CodeEEENS0_18GlobalHandleVectorINS0_3MapEEE -_ZN2v88internal22TurbofanCompilationJobC2EPNS0_7IsolateEPNS0_24OptimizedCompilationInfoENS0_14CompilationJob5StateE -_ZN2v88internal22TurbofanCompilationJob17RetryOptimizationENS0_13BailoutReasonE -_ZN2v88internal22TurbofanCompilationJob17AbortOptimizationENS0_13BailoutReasonE -_ZN2v88internal22TurbofanCompilationJob6CancelEv -_ZNK2v88internal22TurbofanCompilationJob22RecordCompilationStatsENS0_15ConcurrencyModeEPNS0_7IsolateE -_ZNK2v88internal22TurbofanCompilationJob25RecordFunctionCompilationENS0_16LogEventListener7CodeTagEPNS0_7IsolateE _ZN2v88internal8Compiler32InstallInterpreterTrampolineCopyEPNS0_7IsolateENS0_12DirectHandleINS0_18SharedFunctionInfoEEENS0_16LogEventListener7CodeTagE _ZN2v88internal22CompilationHandleScopeD2Ev _ZN2v88internal22CompilationHandleScopeD1Ev @@ -12437,6 +12399,7 @@ _ZNK2v88internal22TurbofanCompilationJob13FinalizeOrderEv _ZN2v88internal23OptimizedCompilationJobD0Ev _ZNKSt4__Cr19__hash_map_iteratorINS_15__hash_iteratorIPNS_11__hash_nodeINS_17__hash_value_typeIiN2v88internal6TaggedINS5_9ScopeInfoEEEEEPvEEEEEptEv _ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiN2v88internal6TaggedINS3_9ScopeInfoEEEEENS_22__unordered_map_hasherIiNS_4pairIKiS6_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSB_SF_SD_EENS_9allocatorISB_EEE16__emplace_uniqueIJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSQ_IJEEEEEENS9_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEEDpOT_ENKUlRSA_SP_OSS_OST_E_clES14_SP_S15_S16_ +_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiN2v88internal6TaggedINS3_9ScopeInfoEEEEENS_22__unordered_map_hasherIiNS_4pairIKiS6_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSB_SF_SD_EENS_9allocatorISB_EEE11__do_rehashILb1EEEvm _ZN2v88internal28ConstantPoolPointerForwarder14VisitScopeInfoINS0_10FixedArrayEEEvNS0_6TaggedIT_EEjNS4_INS0_9ScopeInfoEEE _ZN2v88internal5PrintILNS0_23HeapObjectReferenceTypeE1EmEEvNS0_10TaggedImplIXT_ET0_EE _ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiN2v88internal6HandleINS3_9ScopeInfoEEEEENS_22__unordered_map_hasherIiNS_4pairIKiS6_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSB_SF_SD_EENS_9allocatorISB_EEE16__emplace_uniqueIJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSQ_IJEEEEEENS9_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEEDpOT_ENKUlRSA_SP_OSS_OST_E_clES14_SP_S15_S16_ @@ -12468,6 +12431,8 @@ _ZNSt4__Cr6vectorIN2v88internal27DeferredFinalizationJobDataENS_9allocatorIS3_EE _ZZNSt4__Cr12__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEE16__emplace_uniqueIJiEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIiPvEEEEbEEDpOT_ENKUlRKiOiE_clESL_SM_ _ZN2v88internal24OptimizedCompilationInfoC2EPNS0_4ZoneEPNS0_7IsolateENS0_6HandleINS0_18SharedFunctionInfoEEENS6_INS0_10JSFunctionEEENS0_8CodeKindENS0_14BytecodeOffsetE _ZN2v88internal24OptimizedCompilationInfoC1EPNS0_4ZoneEPNS0_7IsolateENS0_6HandleINS0_18SharedFunctionInfoEEENS6_INS0_10JSFunctionEEENS0_8CodeKindENS0_14BytecodeOffsetE +_ZN2v88internal24OptimizedCompilationInfoC2ENS_4base6VectorIKcEEPNS0_4ZoneENS0_8CodeKindENS0_7BuiltinE +_ZN2v88internal24OptimizedCompilationInfoC1ENS_4base6VectorIKcEEPNS0_4ZoneENS0_8CodeKindENS0_7BuiltinE _ZN2v88internal10Serializer16ObjectSerializer13VisitPointersENS0_6TaggedINS0_10HeapObjectEEENS0_25CompressedMaybeObjectSlotES6_ _ZN2v88internal10Serializer16ObjectSerializer29VisitInstructionStreamPointerENS0_6TaggedINS0_4CodeEEENS0_27OffHeapCompressedObjectSlotINS0_29ExternalCodeCompressionSchemeEEE _ZN2v88internal10Serializer16ObjectSerializer20VisitEmbeddedPointerENS0_6TaggedINS0_17InstructionStreamEEEPNS0_9RelocInfoE @@ -12491,6 +12456,7 @@ _ZN2v88internal10Serializer32SerializeReadOnlyObjectReferenceENS0_6TaggedINS0_10 _ZN2v88internal10SerializerD0Ev _ZN2v88internal10Serializer16ObjectSerializerD0Ev _ZZNSt4__Cr6vectorIhNS_9allocatorIhEEE12emplace_backIJRKhEEERhDpOT_ENKUlvE0_clEv +_ZN2v88internal14CodeAddressMapD2Ev _ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v84base11StrongAliasINS2_8internal24JSDispatchHandleAliasTagEjEEjEENS_22__unordered_map_hasherIS7_NS_4pairIKS7_jEENS_4hashIS7_EENS_8equal_toIS7_EEEENS_21__unordered_map_equalIS7_SC_SG_SE_EENS_9allocatorISC_EEE16__emplace_uniqueIJRKNS_21piecewise_construct_tENS_5tupleIJRSB_EEENSR_IJEEEEEENSA_INS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEEDpOT_ENKUlSS_SQ_OST_OSU_E_clESS_SQ_S15_S16_ _ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v84base11StrongAliasINS2_8internal24JSDispatchHandleAliasTagEjEEjEENS_22__unordered_map_hasherIS7_NS_4pairIKS7_jEENS_4hashIS7_EENS_8equal_toIS7_EEEENS_21__unordered_map_equalIS7_SC_SG_SE_EENS_9allocatorISC_EEE11__do_rehashILb1EEEvm _ZN2v88internal24ExternalReferenceEncoderC2EPNS0_7IsolateE @@ -12617,6 +12583,7 @@ _ZN2v88internal12_GLOBAL__N_144CollectPrivateMethodsAndAccessorsFromContextEPNS0 _ZZNSt4__Cr6vectorIN2v88internal13PrivateMemberENS_9allocatorIS3_EEE12emplace_backIJS3_EEERS3_DpOT_ENKUlvE0_clEv _ZNSt4__Cr6vectorIN2v88internal13PrivateMemberENS_9allocatorIS3_EEE20__throw_length_errorEv _ZN2v88internal19SwissNameDictionary3AddINS0_7IsolateENS0_12DirectHandleEQsr3stdE16is_convertible_vIT0_IS1_ENS4_IS1_EEEEES6_PT_S6_NS4_INS0_4NameEEENS4_INS0_6ObjectEEENS0_15PropertyDetailsEPNS0_13InternalIndexE +_ZN2v88internal19SwissNameDictionary11AddInternalENS0_6TaggedINS0_4NameEEENS2_INS0_6ObjectEEENS0_15PropertyDetailsE _ZN2v88internal19SwissNameDictionary16EqualsForTestingENS0_6TaggedIS1_EE _ZNSt4__Cr6vectorIZN2v88internal19SwissNameDictionary6RehashINS2_12LocalIsolateEEEvPT_E5EntryNS_9allocatorIS8_EEE20__throw_length_errorEv _ZNSt4__Cr6vectorIZN2v88internal19SwissNameDictionary6RehashINS2_7IsolateEEEvPT_E5EntryNS_9allocatorIS8_EEE20__throw_length_errorEv @@ -12624,6 +12591,7 @@ _ZN2v88internal18PropertyDescriptor8ToObjectEPNS0_7IsolateE _ZN2v88internal18PropertyDescriptor20ToPropertyDescriptorEPNS0_7IsolateENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverEEEEEEPS1_ _ZN2v88internal12_GLOBAL__N_120GetPropertyIfPresentEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEENS4_INS0_6StringEEEPNS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntES7_NS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedES5_EEEEE _ZN2v88internal18PropertyDescriptor26CompletePropertyDescriptorEPNS0_7IsolateEPS1_ +_ZN2v88internal18PropertyDescriptor26ToPropertyDescriptorObjectEPNS0_7IsolateE _ZNK2v88internal6String9IsEqualToILNS1_12EqualityTypeE0EcEEbNS_4base6VectorIKT0_EEPNS0_12LocalIsolateE _ZN2v88internal24IcuBreakIteratorWithTextC2ENSt4__Cr10unique_ptrIN6icu_7713BreakIteratorENS2_14default_deleteIS5_EEEE _ZN2v88internal24IcuBreakIteratorWithTextC1ENSt4__Cr10unique_ptrIN6icu_7713BreakIteratorENS2_14default_deleteIS5_EEEE @@ -12636,14 +12604,13 @@ _ZN2v88internal4Intl18ToICUUnicodeStringEPNS0_7IsolateENS0_12DirectHandleINS0_6S _ZN2v88internal4Intl18ToLatin1LowerTableEv _ZN2v88internal9CopyCharsIhDsEEvPT0_PKT_m _ZN2v88internal12_GLOBAL__N_122GetUCharBufferFromFlatERKNS0_6String11FlatContentEPNSt4__Cr10unique_ptrIA_tNS6_14default_deleteIS8_EEEEj -_ZN2v88internal4Intl14BuildLocaleSetERKNSt4__Cr6vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEEPKcSF_ +_ZN2v88internal4Intl21ConvertOneByteToLowerENS0_6TaggedINS0_6StringEEES4_ _ZN2v88internal12_GLOBAL__N_116ValidateResourceEN6icu_776LocaleEPKcS5_ _ZN2v88internal4Intl13ToLanguageTagERKN6icu_776LocaleE _ZN2v88internal4Intl20LegacyUnwrapReceiverEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEENS4_INS0_10JSFunctionEEEb _ZN2v88internal4Intl38ValidateAndCanonicalizeUnicodeLocaleIdEPNS0_7IsolateENSt4__Cr17basic_string_viewIcNS4_11char_traitsIcEEEE _ZNSt4__Cr12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2INS_17basic_string_viewIcS2_EETnNS_9enable_ifIXaa35__can_be_converted_to_string_view_vIcS2_T_Entsr7is_sameIu14__remove_cvrefISA_ES5_EE5valueEiE4typeELi0EEERKSA_ _ZN2v88internal4Intl22CanonicalizeLocaleListEPNS0_7IsolateENS0_12DirectHandleINS0_6ObjectEEEb -_ZN2v88internal4Intl19StringLocaleCompareEPNS0_7IsolateENS0_12DirectHandleINS0_6StringEEES6_NS4_INS0_6ObjectEEES8_PKc _ZN2v88internal4Intl14CompareStringsEPNS0_7IsolateERKN6icu_778CollatorENS0_12DirectHandleINS0_6StringEEESA_NS1_21CompareStringsOptionsE _ZN2v88internal4Intl23AsciiCollationWeightsL1Ev _ZN2v88internal4Intl23AsciiCollationWeightsL3Ev @@ -12671,7 +12638,9 @@ _ZN2v88internal16ICUTimezoneCacheD2Ev _ZN2v88internal16ICUTimezoneCacheD0Ev _ZNSt4__Cr6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE24__emplace_back_slow_pathIJRKS6_EEEPS6_DpOT_ _ZNSt4__Cr9__find_ifIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_ZNS_14__find_genericIS7_S7_S6_NS_10__identityEEET_SA_T0_RKT1_RT2_EUlTyOSA_E_RS9_EESA_SA_SB_OSC_OSF_ -_ZNSt4__Cr10__pop_heapINS_17_ClassicAlgPolicyENS_6__lessIvvEEPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEvT1_SB_RT0_NS_15iterator_traitsISB_E15difference_typeE +_ZNSt4__Cr10__function13__policy_funcIFNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPKcEE11__call_funcIZN2v88internal12_GLOBAL__N_119AvailableCollationsEPNSE_7IsolateEE3$_0EES7_PKNS0_16__policy_storageES9_ +_ZNSt4__Cr10__function13__policy_funcIFbPKcEE11__call_funcIPS4_EEbPKNS0_16__policy_storageES3_ +_ZN2v84base16LazyInstanceImplINS_8internal12_GLOBAL__N_112_GLOBAL__N_127ResourceAvailableCurrenciesENS0_32StaticallyAllocatedInstanceTraitIS5_EENS0_21DefaultConstructTraitIS5_EENS0_23ThreadSafeInitOnceTraitENS0_18LeakyInstanceTraitIS5_EEE12InitInstanceEPv _ZNSt4__Cr9__sift_upINS_17_ClassicAlgPolicyERNS_6__lessIvvEEPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEvT1_SC_OT0_NS_15iterator_traitsISC_E15difference_typeE _ZNSt4__Cr6__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE14__tree_deleterclEPNS_11__tree_nodeIS6_PvEE _ZZNSt4__Cr6__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE16__emplace_uniqueIJRKS6_EEENS_4pairINS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEbEEDpOT_ENKUlSD_SD_E_clESD_SD_ @@ -12686,7 +12655,6 @@ _ZN6icu_7714StringByteSinkINSt4__Cr12basic_stringIcNS1_11char_traitsIcEENS1_9all _ZN6icu_7714StringByteSinkINSt4__Cr12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEE6AppendEPKci _ZN2v84base16LazyInstanceImplINS_8internal4Intl16AvailableLocalesINS3_17SkipResourceCheckEEENS0_32StaticallyAllocatedInstanceTraitIS6_EENS0_21DefaultConstructTraitIS6_EENS0_23ThreadSafeInitOnceTraitENS0_18LeakyInstanceTraitIS6_EEE12InitInstanceEPv _ZN2v88internal4Intl16AvailableLocalesINS1_17SkipResourceCheckEEC2Ev -_ZN6icu_7722FormattedStringBuilder6insertEiRKNS_13UnicodeStringENS0_5FieldER10UErrorCode _ZN6icu_7722FormattedStringBuilder6insertEiRKNS_13UnicodeStringEiiNS0_5FieldER10UErrorCode _ZN6icu_7722FormattedStringBuilder6spliceEiiRKNS_13UnicodeStringEiiNS0_5FieldER10UErrorCode _ZN6icu_7722FormattedStringBuilder6insertEiRKS0_R10UErrorCode @@ -12716,6 +12684,8 @@ _ZN6icu_776number4impl15CurrencySymbolsC1ENS_12CurrencyUnitERKNS_6LocaleERKNS_20 _ZNK6icu_776number4impl15CurrencySymbols10getIsoCodeEv _ZNK6icu_776number4impl15CurrencySymbols23getNarrowCurrencySymbolER10UErrorCode _ZNK6icu_776number4impl15CurrencySymbols23getFormalCurrencySymbolER10UErrorCode +_ZNK6icu_776number4impl15CurrencySymbols24getVariantCurrencySymbolER10UErrorCode +_ZNK6icu_776number4impl15CurrencySymbols17getCurrencySymbolER10UErrorCode _ZN2v88internal12_GLOBAL__N_122InstallContextFunctionEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEEPKcNS0_7BuiltinENS4_INS0_7ContextEEE _ZN2v85debug12SetContextIdENS_5LocalINS_7ContextEEEi _ZN2v85debug12GetContextIdENS_5LocalINS_7ContextEEE @@ -12730,6 +12700,25 @@ _ZN2v85debug26SetBreakOnNextFunctionCallEPNS_7IsolateE _ZN2v85debug28ClearBreakOnNextFunctionCallEPNS_7IsolateE _ZN2v85debug21GetInternalPropertiesEPNS_7IsolateENS_5LocalINS_5ValueEEE _ZN2v85debug17GetPrivateMembersENS_5LocalINS_7ContextEEENS1_INS_6ObjectEEEiPNS_11LocalVectorINS_5ValueEEES9_ +_ZNK2v85debug8Location15GetColumnNumberEv +_ZNK2v85debug6Script15SetScriptSourceENS_5LocalINS_6StringEEEbbPNS0_14LiveEditResultE +_ZNK2v85debug6Script13SetBreakpointENS_5LocalINS_6StringEEEPNS0_8LocationEPi +_ZNK2v85debug6Script28SetInstrumentationBreakpointEPi +_ZN2v85debug6Script20RemoveWasmBreakpointEi +_ZN2v85debug16RemoveBreakpointEPNS_7IsolateEi +_ZN2v85debug18GetCurrentPlatformEv +_ZN2v85debug22ForceGarbageCollectionEPNS_7IsolateEN5cppgc18EmbedderStackStateE +_ZN2v85debug10WasmScript4CastEPNS0_6ScriptE +_ZNK2v85debug10WasmScript15GetDebugSymbolsEv +_ZN2v85debug10WasmScript11DisassembleEPNS0_20DisassemblyCollectorEPNSt4__Cr6vectorIiNS4_9allocatorIiEEEE +_ZN2v85debug11DisassembleENS_4base6VectorIKhEEPNS0_20DisassemblyCollectorEPNSt4__Cr6vectorIiNS7_9allocatorIiEEEE +_ZNK2v85debug10WasmScript16GetModuleBuildIdEv +_ZNK2v85debug10WasmScript10CodeOffsetEv +_ZN2v85debug8LocationC2Eii +_ZN2v85debug8LocationC1Eii +_ZN2v85debug8LocationC2Ev +_ZN2v85debug8LocationC1Ev +_ZN2v85debug16GetLoadedScriptsEPNS_7IsolateERNSt4__Cr6vectorINS_6GlobalINS0_6ScriptEEENS3_9allocatorIS7_EEEE _ZN2v85debug15GetScriptOriginEPNS_7IsolateEi _ZN2v85debug22CompileInspectorScriptEPNS_7IsolateENS_5LocalINS_6StringEEE _ZN2v85debug24EnterDebuggingForIsolateEPNS_7IsolateE @@ -12837,6 +12826,7 @@ _ZN2v88internal29SmallStringOptimizedAllocatorILm128EED0Ev _ZN2v88internal29SmallStringOptimizedAllocatorILm128EE8allocateEj _ZN2v88internal29SmallStringOptimizedAllocatorILm128EE4growEPj _ZN2v84base11SmallVectorIcLm128ENSt4__Cr9allocatorIcEEE4GrowEm +_ZN2v88internal10DateParser16ParseES5DateTimeIKhEENS1_9DateTokenEPNS1_19DateStringTokenizerIT_EEPNS1_11DayComposerEPNS1_12TimeComposerEPNS1_16TimeZoneComposerE _ZNK2v88internal13ScopeIterator11VisitLocalsERKNSt4__Cr8functionIFbNS0_6HandleINS0_6StringEEENS4_INS0_6ObjectEEENS1_9ScopeTypeEEEENS1_4ModeES9_ _ZN2v88internal12_GLOBAL__N_119ScopeChainRetriever20RetrieveClosureScopeEPNS0_5ScopeE _ZN2v88internal12_GLOBAL__N_119ScopeChainRetriever18RetrieveStartScopeEPNS0_5ScopeE @@ -12891,6 +12881,7 @@ _ZN2v88internal13DebugEvaluate14ContextBuilder12UpdateValuesEv _ZN2v88internal13DebugEvaluate20WithTopmostArgumentsEPNS0_7IsolateENS0_12DirectHandleINS0_6StringEEE _ZN2v88internal13DebugEvaluate14ContextBuilderC2EPNS0_7IsolateEPNS0_15JavaScriptFrameEi _ZN2v88internal13DebugEvaluate14ContextBuilderC1EPNS0_7IsolateEPNS0_15JavaScriptFrameEi +_ZN2v88internal13DebugEvaluate25IsSideEffectFreeIntrinsicENS0_7Runtime10FunctionIdE _ZNSt4__Cr19__partial_sort_implINS_17_ClassicAlgPolicyERPFbRKN2v88internal13CoverageBlockES6_EPS4_SA_EET1_SB_SB_T2_OT0_ _ZN2v88internal20TraceManualRecompileENS0_6TaggedINS0_10JSFunctionEEENS0_8CodeKindENS0_15ConcurrencyModeE _ZN2v88internal14TieringManager8OptimizeENS0_6TaggedINS0_10JSFunctionEEENS0_20OptimizationDecisionE @@ -12931,7 +12922,7 @@ _ZN2v88internal8baseline16BaselineCompiler26VisitLdaCurrentContextSlotEv _ZN2v88internal8baseline16BaselineCompiler9VisitStarEv _ZN2v88internal8baseline16BaselineCompiler8VisitMovEv _ZN2v88internal8baseline16BaselineCompiler16VisitPushContextEv -_ZN2v88internal8baseline16BaselineCompiler19VisitStaContextSlotEv +_ZN2v88internal8baseline16BaselineCompiler15VisitPopContextEv _ZN2v88internal8baseline16BaselineCompiler26VisitStaCurrentContextSlotEv _ZN2v88internal8baseline16BaselineCompiler18VisitLdaLookupSlotEv _ZN2v88internal8baseline16BaselineCompiler31VisitLdaLookupContextSlotNoCellEv @@ -12952,7 +12943,7 @@ _ZN2v88internal8baseline16BaselineCompiler22VisitStaModuleVariableEv _ZN2v88internal8baseline16BaselineCompiler21VisitSetNamedPropertyEv _ZN2v88internal8baseline16BaselineCompiler27VisitDefineNamedOwnPropertyEv _ZN2v88internal8baseline16BaselineCompiler21VisitSetKeyedPropertyEv -_ZN2v88internal8baseline16BaselineCompiler8VisitIncEv +_ZN2v88internal8baseline16BaselineCompiler27VisitDefineKeyedOwnPropertyEv _ZN2v88internal8baseline16BaselineCompiler8VisitDecEv _ZN2v88internal8baseline16BaselineCompiler11VisitNegateEv _ZN2v88internal8baseline16BaselineCompiler15VisitBitwiseNotEv @@ -12975,7 +12966,6 @@ _ZN2v88internal8baseline16BaselineCompiler27VisitCallUndefinedReceiver2Ev _ZN2v88internal8baseline16BaselineCompiler19VisitCallWithSpreadEv _ZN2v88internal8baseline16BaselineCompiler16VisitCallRuntimeEv _ZN2v88internal8baseline16BaselineCompiler23VisitCallRuntimeForPairEv -_ZN2v88internal8baseline16BaselineCompiler17VisitTestLessThanEv _ZN2v88internal8baseline16BaselineCompiler20VisitTestGreaterThanEv _ZN2v88internal8baseline16BaselineCompiler24VisitTestLessThanOrEqualEv _ZN2v88internal8baseline16BaselineCompiler27VisitTestGreaterThanOrEqualEv @@ -13043,7 +13033,6 @@ _ZN2v88internal8baseline16BaselineCompiler13JumpIfNotRootENS0_9RootIndexE _ZN2v88internal8baseline16BaselineCompiler15JumpIfToBooleanEbPNS0_5LabelENS3_8DistanceE _ZN2v88internal8baseline17BaselineAssembler20LdaContextSlotNoCellENS0_8RegisterEjjNS2_15CompressionModeES3_ _ZN2v88internal8baseline17BaselineAssembler20StaContextSlotNoCellENS0_8RegisterES3_jj -_ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE2EJNS0_11interpreter12RegisterListEEEEvjjDpT0_ _ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE1EJNS0_11interpreter12RegisterListEEEEvjjDpT0_ _ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE1EJNS0_11interpreter8RegisterEEEEvjjDpT0_ _ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE1EJNS0_11interpreter8RegisterES6_EEEvjjDpT0_ @@ -13169,7 +13158,6 @@ _ZN2v88internal21DebugPropertyIterator14is_array_indexEv _ZN2v85debug16PropertyIteratorD2Ev _ZN2v88internal21DebugPropertyIteratorD0Ev _ZN2v88internal27Builtin_DataViewConstructorEiPmPNS0_7IsolateE -_ZN2v88internal42Builtin_AsyncDisposableStackPrototypeDeferEiPmPNS0_7IsolateE _ZN2v88internal41Builtin_AsyncDisposableStackPrototypeMoveEiPmPNS0_7IsolateE _ZN2v88internal24Builtin_ErrorConstructorEiPmPNS0_7IsolateE _ZN2v88internal30Builtin_ErrorCaptureStackTraceEiPmPNS0_7IsolateE @@ -13194,6 +13182,8 @@ _ZN2v88internal20Builtin_GlobalEscapeEiPmPNS0_7IsolateE _ZN2v88internal22Builtin_GlobalUnescapeEiPmPNS0_7IsolateE _ZN2v88internal18Builtin_GlobalEvalEiPmPNS0_7IsolateE _ZN2v88internal3Uri6DecodeEPNS0_7IsolateENS0_12DirectHandleINS0_6StringEEEb +_ZN2v88internal3Uri8UnescapeEPNS0_7IsolateENS0_6HandleINS0_6StringEEE +_ZZNSt4__Cr6vectorItNS_9allocatorItEEE12emplace_backIJtEEERtDpOT_ENKUlvE0_clEv _ZZNSt4__Cr6vectorItNS_9allocatorItEEE12emplace_backIJRKtEEERtDpOT_ENKUlvE0_clEv _ZZNSt4__Cr6vectorIhNS_9allocatorIhEEE12emplace_backIJhEEERhDpOT_ENKUlvE0_clEv _ZN2v88internal12_GLOBAL__N_16EncodeEjPNS1_15ResizableBufferIhEE @@ -13259,6 +13249,7 @@ _ZN2v84base11SmallVectorIiLm16ENSt4__Cr9allocatorIiEEE11FreeStorageEv _ZNSt4__Cr6vectorIN2v88internal10JsonParserIhE16JsonContinuationENS_9allocatorIS5_EEE7reserveEm _ZN2v88internal10JsonParserIhE16JsonContinuationaSEOS3_ _ZNSt4__Cr6vectorIN2v88internal10JsonParserIhE16JsonContinuationENS_9allocatorIS5_EEE8pop_backEv +_ZN2v88internal10JsonParserIhE10ExpectNextILNS0_9JsonTokenE1EEEbNSt4__Cr8optionalINS0_15MessageTemplateEEE _ZN2v88internal10JsonParserIhE15BuildJsonObjectILb1EEENS0_6HandleINS0_8JSObjectEEERKNS2_16JsonContinuationENS0_12DirectHandleINS0_3MapEEE _ZN2v88internal11HandleScope14CloseAndEscapeINS0_18ObjectTwoHashTableENS0_6HandleEQsr3stdE16is_convertible_vIT0_IT_ENS0_12DirectHandleIS6_EEEEES7_S7_ _ZN2v88internal11HandleScope14CloseAndEscapeINS0_10FixedArrayENS0_6HandleEQsr3stdE16is_convertible_vIT0_IT_ENS0_12DirectHandleIS6_EEEEES7_S7_ @@ -13293,7 +13284,7 @@ _ZN2v88internal19JSDataObjectBuilder45RewindExpectedFinalMapFastPathToBeforeCurr _ZN2v88internal19JSDataObjectBuilder46RewindExpectedFinalMapFastPathToIncludeCurrentEv _ZN2v88internal15JsonStringifierC2EPNS0_7IsolateE _ZN2v88internal15JsonStringifierC1EPNS0_7IsolateE -_ZN2v88internal43Builtin_ObjectPrototypePropertyIsEnumerableEiPmPNS0_7IsolateE +_ZN2v88internal15JsonStringifier9StringifyENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverEEEEEESE_NS2_INS0_6ObjectEEE _ZN2v88internal30Builtin_ObjectDefinePropertiesEiPmPNS0_7IsolateE _ZN2v88internal28Builtin_ObjectDefinePropertyEiPmPNS0_7IsolateE _ZN2v88internal26Builtin_ObjectDefineGetterEiPmPNS0_7IsolateE @@ -13486,8 +13477,6 @@ _ZN2v88internal7Genesis31InitializeGlobal_harmony_structEv _ZN2v88internal7Genesis40InitializeGlobal_js_source_phase_importsEv _ZN2v88internal7Genesis35InitializeGlobal_regexp_linear_flagEv _ZN2v88internal7Genesis34InitializeGlobal_sharedarraybufferEv -_ZN2v88internal7Genesis16CompileExtensionEPNS0_7IsolateEPNS_9ExtensionE -_ZN2v88internal7Genesis27InitializeIteratorFunctionsEv _ZN2v88internal7Genesis32CreateInitialMapForArraySubclassEii _ZN2v88internal7Genesis21InstallExtrasBindingsEv _ZN2v88internal7Genesis19InitializeMapCachesEv @@ -13580,7 +13569,6 @@ _ZN2v88internal14V8HeapExplorerC2EPNS0_12HeapSnapshotEPNS0_38SnapshottingProgres _ZN2v88internal14V8HeapExplorerC1EPNS0_12HeapSnapshotEPNS0_38SnapshottingProgressReportingInterfaceEPNS_12HeapProfiler19ContextNameResolverE _ZN2v88internal14V8HeapExplorer13AllocateEntryEPv _ZN2v88internal14V8HeapExplorer8AddEntryENS0_6TaggedINS0_10HeapObjectEEE -_ZN2v88internal18OutputStreamWriter9AddNumberIjEEvT_ _ZN2v88internal18OutputStreamWriter9AddNumberImEEvT_ _ZN2v88internal18OutputStreamWriter9AddNumberIhEEvT_ _ZN2v88internal26HeapSnapshotJSONSerializer18SerializeTraceNodeEPNS0_19AllocationTraceNodeE @@ -13602,6 +13590,9 @@ _ZNSt4__Cr6vectorIN2v88internal14HeapObjectsMap12TimeIntervalENS_9allocatorIS4_E _ZNSt4__Cr6vectorIN2v815HeapStatsUpdateENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJjRjS7_EEEPS2_DpOT_ _ZNSt4__Cr6vectorIN2v815HeapStatsUpdateENS_9allocatorIS2_EEE20__throw_length_errorEv _ZN2v88internal12_GLOBAL__N_122ExternalStringRecorder23RecordSharedMemoryUsageEPKvm +_ZN2v88internal12_GLOBAL__N_126ExternalDataEntryAllocatorD0Ev +_ZN2v88internal12_GLOBAL__N_126ExternalDataEntryAllocator13AllocateEntryEPv +_ZN2v88internal12_GLOBAL__N_126ExternalDataEntryAllocator13AllocateEntryENS0_6TaggedINS0_3SmiEEE _ZN4absl18container_internal12raw_hash_setINS0_17FlatHashMapPolicyINSt4__Cr12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPN2v88internal9HeapEntryEEEJEE46transfer_unprobed_elements_to_next_capacity_fnERNS0_12CommonFieldsEPKNS0_6ctrl_tEPvSL_PFvSL_hmmE _ZN4absl13hash_internal15MixingHashState18combine_contiguousES1_PKhm _ZN4absl19functional_internal12InvokeObjectIRNS_18container_internal7HashKeyINS2_10StringHashEPKcLb1EEEmJmEEET0_NS0_7VoidPtrEDpNS0_8ForwardTIT1_E4typeE @@ -13629,6 +13620,7 @@ _ZN2v88internal19AllocationTraceNodeC2EPNS0_19AllocationTraceTreeEj _ZN2v88internal19AllocationTraceNodeC1EPNS0_19AllocationTraceTreeEj _ZN2v88internal19AllocationTraceNodeD2Ev _ZN2v88internal19AllocationTraceNodeD1Ev +_ZN2v88internal19AllocationTraceNode14FindOrAddChildEj _ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPN2v88internal20SamplingHeapProfiler6SampleENS_10unique_ptrIS5_NS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS6_NS_4pairIKS6_SA_EENS_4hashIS6_EENS_8equal_toIS6_EEEENS_21__unordered_map_equalIS6_SF_SJ_SH_EENS_9allocatorISF_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeISB_PvEEEE _ZNSt4__Cr5dequeIN2v817AllocationProfile4NodeENS_9allocatorIS3_EEE19__add_back_capacityEv _ZNSt4__Cr14__split_bufferIPN2v817AllocationProfile4NodeENS_9allocatorIS4_EENS_29__split_buffer_pointer_layoutEE12emplace_backIJRS4_EEEvDpOT_ @@ -13644,6 +13636,7 @@ _ZN2v88internal16FileOutputStreamD0Ev _ZN2v812OutputStream12GetChunkSizeEv _ZN2v88internal26ExternalizeStringExtension11BuildSourceEPcm _ZN2v88internal26ExternalizeStringExtension25GetNativeFunctionTemplateEPNS_7IsolateENS_5LocalINS_6StringEEE +_ZN2v88internal26ExternalizeStringExtension11ExternalizeERKNS_20FunctionCallbackInfoINS_5ValueEEE _ZN2v88internal6WasmJs18PrepareForSnapshotEPNS0_7IsolateE _ZN2v88internal12_GLOBAL__N_111InstallFuncEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEEPKcPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEEibNS0_18PropertyAttributesENS_14SideEffectTypeE _ZN2v88internal6WasmJs13InstallModuleEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEE @@ -13686,6 +13679,9 @@ _ZN2v88internal17ContextSerializerD2Ev _ZN2v88internal17ContextSerializerD1Ev _ZN2v88internal17ContextSerializerD0Ev _ZN2v88internal17ContextSerializer9SerializeEPNS0_6TaggedINS0_7ContextEEERKNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELS7_2EEEE +_ZN2v88internal29InternalFieldSerializeWrapperEibNS_31SerializeInternalFieldsCallbackENS_5LocalINS_6ObjectEEE +_ZN2v88internal27ContextDataSerializeWrapperEibNS_28SerializeContextDataCallbackENS_5LocalINS_7ContextEEE +_ZN2v88internal17ContextSerializer19SerializeObjectImplENS0_6HandleINS0_10HeapObjectEEENS0_22SerializerDeserializer8SlotTypeE _ZN2v88internal17ContextSerializer33SerializeObjectWithEmbedderFieldsINS0_17EmbedderDataArrayEPFNS_11StartupDataEibNS_28SerializeContextDataCallbackENS_5LocalINS_7ContextEEEES5_S8_EEvNS0_6HandleIT_EEiT0_T1_T2_ _ZNSt4__Cr6vectorIbNS_9allocatorIbEEE9push_backERKb _ZZNSt4__Cr6vectorIN2v811StartupDataENS_9allocatorIS2_EEE12emplace_backIJS2_EEERS2_DpOT_ENKUlvE0_clEv @@ -13693,7 +13689,6 @@ _ZNSt4__Cr6vectorIN2v811StartupDataENS_9allocatorIS2_EEE20__throw_length_errorEv _ZZNSt4__Cr6vectorIN2v811StartupDataENS_9allocatorIS2_EEE12emplace_backIJRKS2_EEERS2_DpOT_ENKUlvE0_clEv _ZN2v88internal21DescriptorLookupCache5ClearEv _ZN2v88internal17ReadOnlyPromotion7PromoteEPNS0_7IsolateERKNS0_14SafepointScopeERKNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELS8_2EEEE -_ZNSt4__Cr6vectorIN2v88internal6TaggedINS2_10HeapObjectEEENS_9allocatorIS5_EEE18__insert_with_sizeINS_17_ClassicAlgPolicyENS_11__wrap_iterIPS5_EESD_EESD_NSB_IPKS5_EET0_T1_l _ZN2v88internal12_GLOBAL__N_121ReadOnlyPromotionImpl17LogPromotedObjectENS0_6TaggedINS0_10HeapObjectEEES5_ _ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal6TaggedINS3_10HeapObjectEEES6_EENS_22__unordered_map_hasherIS6_NS_4pairIKS6_S6_EENS3_6Object6HasherENSC_12KeyEqualSafeEEENS_21__unordered_map_equalIS6_SB_SE_SD_EENS_9allocatorISB_EEE16__emplace_uniqueIJRS6_SM_EEENS9_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEEDpOT_ENKUlRSA_SM_SM_E_clESX_SM_SM_ _ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal6TaggedINS3_10HeapObjectEEES6_EENS_22__unordered_map_hasherIS6_NS_4pairIKS6_S6_EENS3_6Object6HasherENSC_12KeyEqualSafeEEENS_21__unordered_map_equalIS6_SB_SE_SD_EENS_9allocatorISB_EEE11__do_rehashILb1EEEvm @@ -13808,7 +13803,6 @@ _ZNK2v88internal8compiler7Linkage29GetParameterSecondaryLocationEi _ZZNSt4__Cr6vectorIN2v88internal11MachineTypeENS_9allocatorIS3_EEE12emplace_backIJRKS3_EEERS3_DpOT_ENKUlvE0_clEv _ZNSt4__Cr6vectorIN2v88internal11MachineTypeENS_9allocatorIS3_EEE20__throw_length_errorEv _ZN2v88internal4wasm20IterateSignatureImplINS0_16SignatureBuilderINS0_9SignatureINS0_15LinkageLocationEEES5_EENS4_INS0_11MachineTypeEEEEEvPKT0_bRT_PiSF_SF_SF_ -_ZN2v88internal8compiler10turboshaft10OperationTINS2_18StringToCaseIntlOpEE18PrintOptionsHelperIJNS4_4KindENS1_16LazyDeoptOnThrowEEJLm0ELm1EEEEvRNSt4__Cr13basic_ostreamIcNS9_11char_traitsIcEEEERKNS9_5tupleIJDpT_EEENS9_16integer_sequenceImJXspT0_EEEE _ZN2v88internal8compiler10turboshaft10OperationTINS2_19ToNumberOrNumericOpEE18PrintOptionsHelperIJNS0_6Object10ConversionENS1_16LazyDeoptOnThrowEEJLm0ELm1EEEEvRNSt4__Cr13basic_ostreamIcNSA_11char_traitsIcEEEERKNSA_5tupleIJDpT_EEENSA_16integer_sequenceImJXspT0_EEEE _ZZNSt4__Cr12__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEE16__emplace_uniqueIJRKiEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIiPvEEEEbEEDpOT_ENKUlSA_SA_E_clESA_SA_ _ZNKSt4__Cr6bitsetILm8EE9to_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EES8_S8_ @@ -13816,9 +13810,6 @@ _ZNSt4__Cr7__countINS_17_ClassicAlgPolicyENS_8__bitsetILm1ELm8EEELb1EbNS_10__ide _ZN2v88internal8compiler10turboshaftlsERNSt4__Cr13basic_ostreamIcNS3_11char_traitsIcEEEENS2_27MaybeRegisterRepresentationE _ZN2v88internal8compiler10turboshaftlsERNSt4__Cr13basic_ostreamIcNS3_11char_traitsIcEEEENS2_20MemoryRepresentationE _ZN2v88internal8compiler10turboshaft8WordTypeILm32EE5RangeEjjPNS0_4ZoneE -_ZNSt4__Cr6__treeINS_12__value_typeIN2v88internal8compiler10turboshaft7OpIndexEmEENS_19__map_value_compareIS6_NS_4pairIKS6_mEENS_4lessIS6_EEEENS3_13ZoneAllocatorISB_EEE14__tree_deleterclEPNS_11__tree_nodeIS7_PvEE -_ZNSt4__Cr6__treeIN2v88internal8compiler10turboshaft7OpIndexENS_4lessIS5_EENS2_13ZoneAllocatorIS5_EEE14__tree_deleterclEPNS_11__tree_nodeIS5_PvEE -_ZN4absl19functional_internal12InvokeObjectIRZNS_18container_internal12raw_hash_setINS2_17FlatHashMapPolicyINSt4__Cr4pairIN2v88internal8compiler10turboshaft7OpIndexEiEENSA_16SnapshotTableKeyINSA_18StoreObservabilityENSA_27MaybeRedundantStoresKeyDataEEEEEJNS_13hash_internal4HashISC_EENS5_8equal_toISC_EENS8_13ZoneAllocatorINS6_IKSC_SG_EEEEEE13destroy_slotsEvEUlPKNS2_6ctrl_tEPvE_vJSU_SV_EEET0_NS0_7VoidPtrEDpNS0_8ForwardTIT1_E4typeE _ZNSt4__Cr5dequeIN2v88internal8compiler10turboshaft13SnapshotTableINS4_18StoreObservabilityENS4_27MaybeRedundantStoresKeyDataEE12SnapshotDataENS2_22RecyclingZoneAllocatorIS9_EEED2Ev _ZNSt4__Cr5dequeIN2v88internal8compiler10turboshaft18SnapshotTableEntryINS4_18StoreObservabilityENS4_27MaybeRedundantStoresKeyDataEEENS2_22RecyclingZoneAllocatorIS8_EEED2Ev _ZN2v88internal8compiler24GetBuiltinCallDescriptorENS0_7BuiltinEPNS0_4ZoneENS0_12StubCallModeEbNS_4base5FlagsINS1_8Operator8PropertyEhhEE @@ -13844,7 +13835,8 @@ _ZN2v88internal8compiler18WasmGraphAssembler32LoadExportedFunctionInstanceDataEP _ZN2v88internal8compiler18WasmGraphAssembler11FieldOffsetEPKNS0_4wasm10StructTypeEj _ZN2v88internal8compiler18WasmGraphAssembler22WasmArrayElementOffsetEPNS1_4NodeENS0_4wasm9ValueTypeE _ZN2v88internal8compiler18WasmGraphAssembler12IsDataRefMapEPNS1_4NodeE -_ZN2v88internal4wasm7AsmType18ElementSizeInBytesEv +_ZN2v88internal8compiler18WasmGraphAssembler12WasmTypeCastEPNS1_4NodeES4_NS1_19WasmTypeCheckConfigE +_ZN2v88internal8compiler18WasmGraphAssembler4NullENS0_4wasm9ValueTypeE _ZN2v88internal4wasm7AsmType8LoadTypeEv _ZN2v88internal4wasm7AsmType9StoreTypeEv _ZN2v88internal4wasm15AsmCallableType3IsAEPNS1_7AsmTypeE @@ -14298,8 +14290,6 @@ _ZN2v88internal2IC14MaybePatchCodeENS0_7BuiltinE _ZN2v88internal2IC24CopyICToMegamorphicCacheENS0_12DirectHandleINS0_4NameEEE _ZN2v88internal2IC8SetCacheENS0_12DirectHandleINS0_4NameEEERKNS0_17MaybeObjectHandleE _ZN2v88internal6LoadIC14ComputeHandlerEPNS0_14LookupIteratorE -_ZN2v88internal11KeyedLoadIC30LoadElementPolymorphicHandlersEPNS0_15MapsAndHandlersES3_NS0_19KeyedAccessLoadModeE -_ZN2v88internal11LoadHandler11LoadElementEPNS0_7IsolateENS0_12ElementsKindEbNS0_19KeyedAccessLoadModeE _ZN2v88internal11LoadHandler24TransitionAndLoadElementEPNS0_7IsolateENS0_12ElementsKindENS0_19KeyedAccessLoadModeE _ZN2v88internal12_GLOBAL__N_124GetUpdatedLoadModeForMapEPNS0_7IsolateENS0_12DirectHandleINS0_3MapEEENS0_19KeyedAccessLoadModeES7_ _ZN2v88internal11KeyedLoadIC8LoadNameENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverEEEEEENS0_12DirectHandleINS0_6ObjectEEENS2_INS0_4NameEEE @@ -14319,6 +14309,11 @@ _ZN2v88internal12StoreHandler22StoreSharedStructFieldEPNS0_7IsolateENS0_13Intern _ZN2v88internal12StoreHandler10StoreFieldEPNS0_7IsolateENS0_13InternalIndexENS0_10FieldIndexENS0_17PropertyConstnessENS0_14RepresentationE _ZN2v88internal12KeyedStoreIC18UpdateStoreElementENS0_6HandleINS0_3MapEEENS0_20KeyedAccessStoreModeES4_ _ZN2v88internal12KeyedStoreIC19StoreElementHandlerENS0_12DirectHandleINS0_3MapEEENS0_20KeyedAccessStoreModeENS0_17MaybeDirectHandleINS0_5UnionIJNS0_3SmiENS0_4CellEEEEEE +_ZN2v88internal12KeyedStoreIC31StoreElementPolymorphicHandlersEPNS0_15MapsAndHandlersENS0_20KeyedAccessStoreModeE +_ZN2v88internal21StoreInArrayLiteralIC5StoreENS0_12DirectHandleINS0_7JSArrayEEENS0_6HandleINS0_6ObjectEEENS2_IS6_EE +_ZN2v88internal19Runtime_LoadIC_MissEiPmPNS0_7IsolateE +_ZN2v88internal32Runtime_LoadIC_Miss_FromBaselineEiPmPNS0_7IsolateE +_ZN2v88internal40Runtime_PatchLoadICUninitializedBaselineEiPmPNS0_7IsolateE _ZN2v88internal40Runtime_GetStringLengthAndUpdateFeedbackEiPmPNS0_7IsolateE _ZN2v88internal29Runtime_LoadNoFeedbackIC_MissEiPmPNS0_7IsolateE _ZN2v88internal41Runtime_LoadWithReceiverNoFeedbackIC_MissEiPmPNS0_7IsolateE @@ -14374,7 +14369,6 @@ _ZN2v88internal7ICStats5BeginEv _ZN2v88internal7ICStats3EndEv _ZN2v88internal7ICStats4DumpEv _ZNK2v88internal6ICInfo19AppendToTracedValueEPNS_7tracing11TracedValueE -_ZN2v88internal27Runtime_VarargStackOverflowEiPmPNS0_7IsolateE _ZN2v88internal39Runtime_ThrowSymbolAsyncIteratorInvalidEiPmPNS0_7IsolateE _ZN2v88internal26Runtime_TerminateExecutionEiPmPNS0_7IsolateE _ZN2v88internal23Runtime_ThrowRangeErrorEiPmPNS0_7IsolateE @@ -14399,28 +14393,6 @@ _ZN2v88internal18Runtime_StackGuardEiPmPNS0_7IsolateE _ZN2v88internal36Runtime_HandleNoHeapWritesInterruptsEiPmPNS0_7IsolateE _ZN2v88internal25Runtime_StackGuardWithGapEiPmPNS0_7IsolateE _ZN2v88internal54Runtime_BytecodeBudgetInterruptWithStackCheck_IgnitionEiPmPNS0_7IsolateE -_ZN2v88internal40Runtime_BytecodeBudgetInterrupt_IgnitionEiPmPNS0_7IsolateE -_ZN2v88internal55Runtime_BytecodeBudgetInterruptWithStackCheck_SparkplugEiPmPNS0_7IsolateE -_ZN2v88internal41Runtime_BytecodeBudgetInterrupt_SparkplugEiPmPNS0_7IsolateE -_ZN2v88internal38Runtime_BytecodeBudgetInterrupt_MaglevEiPmPNS0_7IsolateE -_ZN2v88internal52Runtime_BytecodeBudgetInterruptWithStackCheck_MaglevEiPmPNS0_7IsolateE -_ZN2v88internal33Runtime_AllocateInYoungGenerationEiPmPNS0_7IsolateE -_ZN2v88internal31Runtime_AllocateInOldGenerationEiPmPNS0_7IsolateE -_ZN2v88internal28Runtime_AllocateInSharedHeapEiPmPNS0_7IsolateE -_ZN2v88internal25Runtime_AllocateByteArrayEiPmPNS0_7IsolateE -_ZN2v88internal26Runtime_ThrowIteratorErrorEiPmPNS0_7IsolateE -_ZN2v88internal27Runtime_ThrowSpreadArgErrorEiPmPNS0_7IsolateE -_ZN2v88internal30Runtime_ThrowCalledNonCallableEiPmPNS0_7IsolateE -_ZN2v88internal40Runtime_ThrowConstructedNonConstructableEiPmPNS0_7IsolateE -_ZN2v88internal42Runtime_ThrowPatternAssignmentNonCoercibleEiPmPNS0_7IsolateE -_ZN2v88internal41Runtime_ThrowConstructorReturnedNonObjectEiPmPNS0_7IsolateE -_ZN2v88internal31Runtime_CreateListFromArrayLikeEiPmPNS0_7IsolateE -_ZN2v88internal27Runtime_IncrementUseCounterEiPmPNS0_7IsolateE -_ZN2v88internal37Runtime_GetAndResetTurboProfilingDataEiPmPNS0_7IsolateE -_ZN2v88internal35Runtime_GetAndResetRuntimeCallStatsEiPmPNS0_7IsolateE -_ZN2v88internal27Runtime_OrdinaryHasInstanceEiPmPNS0_7IsolateE -_ZN2v88internal14Runtime_TypeofEiPmPNS0_7IsolateE -_ZN2v88internal28Runtime_AllowDynamicFunctionEiPmPNS0_7IsolateE _ZN2v88internal35Runtime_CreateAsyncFromSyncIteratorEiPmPNS0_7IsolateE _ZN2v88internal25Runtime_GetTemplateObjectEiPmPNS0_7IsolateE _ZN2v88internal34Runtime_ReportMessageFromMicrotaskEiPmPNS0_7IsolateE @@ -14534,6 +14506,7 @@ _ZN2v88internal18Runtime_RegExpExecEiPmPNS0_7IsolateE _ZN2v88internal33Runtime_RegExpGrowRegExpMatchInfoEiPmPNS0_7IsolateE _ZN2v88internal37Runtime_RegExpExperimentalOneshotExecEiPmPNS0_7IsolateE _ZN2v88internal26Runtime_RegExpBuildIndicesEiPmPNS0_7IsolateE +_ZN2v88internal26Runtime_RegExpExecMultipleEiPmPNS0_7IsolateE _ZN2v84base11SmallVectorIiLm2ENSt4__Cr9allocatorIiEEE4GrowEm _ZN2v84base11SmallVectorIiLm2ENSt4__Cr9allocatorIiEEE4GrowEv _ZN2v88internal6String19IsWellFormedUnicodeEPNS0_7IsolateENS0_12DirectHandleIS1_EE @@ -14547,9 +14520,6 @@ _ZN2v88internal34Runtime_SetWasmInstantiateControlsEiPmPNS0_7IsolateE _ZN2v88internal39Runtime_CountUnoptimizedWasmToJSWrapperEiPmPNS0_7IsolateE _ZN2v88internal37Runtime_HasUnoptimizedWasmToJSWrapperEiPmPNS0_7IsolateE _ZN2v88internal22Runtime_WasmTraceEnterEiPmPNS0_7IsolateE -_ZN2v88internal4wasm17return_jspi_stackEPNS0_7IsolateEPNS1_11StackMemoryE -_ZN2v88internal4wasm19return_wasmfx_stackEPNS0_7IsolateEPNS1_11StackMemoryE -_ZN2v88internal4wasm12retire_stackEPNS0_7IsolateEPNS1_11StackMemoryE _ZN2v88internal4wasm27switch_to_the_central_stackEPNS0_7IsolateEm _ZN2v88internal4wasm29switch_from_the_central_stackEPNS0_7IsolateE _ZN2v88internal4wasm34switch_to_the_central_stack_for_jsEPNS0_7IsolateEm @@ -14585,7 +14555,7 @@ _ZN2v88internal15CheckObjectTypeEmmm _ZN2v88internal24CompareOperationFeedback23GetTransitionMapAddressEv _ZN2v88internal24CompareOperationFeedback29GetFeedbackEncodeTableAddressEv _ZN2v88internal8compiler10turboshaft32ExecuteTurboshaftWasmCompilationEPNS0_4wasm14CompilationEnvERNS1_19WasmCompilationDataEPNS3_20WasmDetectedFeaturesEPNS0_21DelayedCounterUpdatesE -_ZN2v88internal4wasm16WasmWrapperCacheINS1_25StackEntryWrapperCacheKeyEE4FreeERNSt4__Cr6vectorIPNS1_8WasmCodeENS5_9allocatorIS8_EEEE +_ZN2v88internal4wasm22WasmExportWrapperCache3NewEPNS0_7IsolateEj _ZN2v88internal4wasm16WasmWrapperCacheINS1_25StackEntryWrapperCacheKeyEE11GetCompiledEPNS0_7IsolateES3_ _ZN2v88internal4wasm16WasmWrapperCacheINS1_25StackEntryWrapperCacheKeyEE20CacheCompiledWrapperEPNS0_7IsolateENS1_21WasmCompilationResultENS1_8WasmCode4KindES3_NSt4__Cr10shared_ptrINS1_17WasmWrapperHandleEEE _ZNK2v88internal4wasm16WasmWrapperCacheINS1_25StackEntryWrapperCacheKeyEE6LookupEm @@ -14637,6 +14607,7 @@ _ZN2v86bigint9Processor11ModuloLargeERNS0_8RWDigitsERNS0_6DigitsES5_ _ZN2v86bigint13ProcessorImpl21CachedMod_MakeInverseERNS0_6DigitsE _ZN2v86bigint9Processor21CachedMod_MakeInverseERNS0_6DigitsE _ZN2v86bigint13ProcessorImpl17MultiplyKaratsubaENS0_8RWDigitsENS0_6DigitsES3_ +_ZN2v86bigint13ProcessorImpl14KaratsubaStartENS0_8RWDigitsENS0_6DigitsES3_S2_j _ZN2v84base6Bignum21DivideModuloIntBignumERKS1_ _ZN2v84base6Bignum13SubtractTimesERKS1_i _ZN2v84base6Bignum7CompareERKS1_S3_ @@ -14708,7 +14679,6 @@ _ZN2v88internal17EmbedderDataArray14BodyDescriptor11IterateBodyINS0_24Concurrent _ZN2v88internal24ConcurrentMarkingVisitor10RecordSlotINS0_20CompressedObjectSlotELNS0_15RecordYoungSlotE1EEEvNS0_6TaggedINS0_10HeapObjectEEET_S7_ _ZN2v88internal3Map14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedIS1_EENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal18BodyDescriptorBase23IterateJSObjectBodyImplINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS4_INS0_10HeapObjectEEEiiPT_ -_ZN2v88internal16WasmGlobalObject14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal18WasmInstanceObject14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal15WasmTableObject14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ _ZN2v88internal4Code14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_ @@ -14841,11 +14811,7 @@ _ZN2v88internal19CppHeapPointerTable15SweepAndCompactEPNS0_30CompactibleExternal _ZZNSt4__Cr6vectorIN2v88internal14SegmentedTableINS2_24CppHeapPointerTableEntryELm536870912EE7SegmentENS_9allocatorIS6_EEE12emplace_backIJRKS6_EEERS6_DpOT_ENKUlvE0_clEv _ZNSt4__Cr6vectorIN2v88internal14SegmentedTableINS2_24CppHeapPointerTableEntryELm536870912EE7SegmentENS_9allocatorIS6_EEE20__throw_length_errorEv _ZNSt4__Cr6__treeIN2v88internal14SegmentedTableINS2_24CppHeapPointerTableEntryELm536870912EE7SegmentENS_4lessIS6_EENS_9allocatorIS6_EEE14__erase_uniqueIS6_EEmRKT_ -_v8_internal_Print_TransitionTree -_v8_internal_Print_Object_MarkBit -_v8_internal_Print_FunctionCallbackInfo -_v8_internal_Print_PropertyCallbackInfo -_ZN2v88internal7TryCastINS0_10HeapObjectENS0_6ObjectENS0_6TaggedEQ24HasTryCastImplementationIT1_T_T0_EEEbS5_IS7_EPS5_IS6_E +_ZN2v88internal22EphemeronRememberedSet23RecordEphemeronKeyWriteENS0_6TaggedINS0_18EphemeronHashTableEEEm _ZNSt4__Cr6vectorIN22_v8_internal_debugonly22StackTraceDebugDetailsENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJS2_EEEPS2_DpOT_ _ZNSt4__Cr6vectorIN22_v8_internal_debugonly22StackTraceDebugDetailsENS_9allocatorIS2_EEE20__throw_length_errorEv _ZNSt4__Cr12__destroy_atIN22_v8_internal_debugonly22StackTraceDebugDetailsEEEvPT_ @@ -14869,6 +14835,7 @@ _ZN2v88internal18ScavengerCollector22QuarantinedPageSweeper7JobTaskC2EPNS0_4Heap _ZN2v88internal18ScavengerCollector22QuarantinedPageSweeper7JobTaskC1EPNS0_4HeapEOKNSt4__Cr6vectorINS0_17PinnedObjectEntryENS6_9allocatorIS8_EEEE _ZN2v88internal18ScavengerCollector22QuarantinedPageSweeper7JobTask3RunEPNS_11JobDelegateE _ZN2v88internal18ScavengerCollector22QuarantinedPageSweeper7JobTask28CreateFillerFreeSpaceHandlerEPNS0_4HeapEmmb +_ZN2v88internal18ScavengerCollector22QuarantinedPageSweeper7JobTask29AddToFreeListFreeSpaceHandlerEPNS0_4HeapEmmb _ZN2v88internal18ScavengerCollector14CollectGarbageEv _ZN2v88internal12_GLOBAL__N_122PinObjectsConservativeEPNS0_4HeapERNS0_9ScavengerERNSt4__Cr6vectorINS0_17PinnedObjectEntryENS6_9allocatorIS8_EEEENS2_13StackScanModeE _ZN2v88internal12_GLOBAL__N_117PinObjectsPreciseEPNS0_4HeapERNS0_9ScavengerERNSt4__Cr6vectorINS0_17PinnedObjectEntryENS6_9allocatorIS8_EEEE @@ -14882,6 +14849,7 @@ _ZN2v88internal18ScavengerCollector40CompleteSweepingQuarantinedPagesIfNeededEv _ZN2v88internal9ScavengerC2EPNS0_4HeapEbPN4heap4base8WorklistIPNS0_11MutablePageELt64EEEPNS6_INS1_24ScavengedObjectListEntryELt256EEESD_PNS6_INS0_6TaggedINS0_18EphemeronHashTableEEELt128EEEPNS6_INSE_INS0_9JSWeakRefEEELt64EEEPNS6_INSE_INS0_8WeakCellEEELt64EEEb _ZN2v88internal9ScavengerC1EPNS0_4HeapEbPN4heap4base8WorklistIPNS0_11MutablePageELt64EEEPNS6_INS1_24ScavengedObjectListEntryELt256EEESD_PNS6_INS0_6TaggedINS0_18EphemeronHashTableEEELt128EEEPNS6_INSE_INS0_9JSWeakRefEEELt64EEEPNS6_INSE_INS0_8WeakCellEEELt64EEEb _ZN2v88internal9Scavenger25RememberPromotedEphemeronENS0_6TaggedINS0_18EphemeronHashTableEEEi +_ZN4heap4base8WorklistIPN2v88internal11MutablePageELt64EE5Local7PublishEv _ZN2v88internal9Scavenger25EvacuateShortcutCandidateINS0_18FullHeapObjectSlotEEEN4heap4base18SlotCallbackResultENS0_6TaggedINS0_3MapEEET_NS7_INS0_10ConsStringEEENS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEE _ZN2v88internal9Scavenger35EvacuateInPlaceInternalizableStringINS0_18FullHeapObjectSlotEEEN4heap4base18SlotCallbackResultENS0_6TaggedINS0_3MapEEET_NS7_INS0_6StringEEENS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEENS0_12ObjectFieldsE _ZN2v88internal12_GLOBAL__N_124RememberedSetEntryNeededINS0_18FullHeapObjectSlotEEEN4heap4base18SlotCallbackResultEPNS0_4HeapET_ From db98e85ce3a834c1ee76df41e5eb32cafdadfca9 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Fri, 25 Sep 2026 07:09:26 +0800 Subject: [PATCH 47/47] v8: update for changes to v8__String__WriteUtf8 https://github.com/lightpanda-io/zig-v8-fork/pull/211 --- .github/actions/install/action.yml | 2 +- .github/actions/v8-snapshot/action.yml | 2 +- Dockerfile | 2 +- build.zig.zon | 4 ++-- src/browser/js/Snapshot.zig | 2 +- src/browser/js/String.zig | 8 ++++---- src/browser/js/js.zig | 2 +- src/script/Runtime.zig | 3 ++- 8 files changed, 13 insertions(+), 12 deletions(-) diff --git a/.github/actions/install/action.yml b/.github/actions/install/action.yml index 7353adfc5..9b5d9eb05 100644 --- a/.github/actions/install/action.yml +++ b/.github/actions/install/action.yml @@ -13,7 +13,7 @@ inputs: zig-v8: description: 'zig v8 version to install' required: false - default: 'v0.5.6' + default: 'v0.5.7' v8: description: 'v8 version to install' required: false diff --git a/.github/actions/v8-snapshot/action.yml b/.github/actions/v8-snapshot/action.yml index a6492d68d..6d8e718e6 100644 --- a/.github/actions/v8-snapshot/action.yml +++ b/.github/actions/v8-snapshot/action.yml @@ -13,7 +13,7 @@ inputs: zig-v8: description: 'zig-v8 release tag the prebuilt lib came from' required: false - default: 'v0.5.6' + default: 'v0.5.7' runs: using: "composite" diff --git a/Dockerfile b/Dockerfile index 6b246470e..f62bd996c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ FROM debian:stable-slim ARG MINISIG=0.12 ARG ZIG_MINISIG=RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U ARG V8=14.9.207.35 -ARG ZIG_V8=v0.5.6 +ARG ZIG_V8=v0.5.7 ARG TARGETPLATFORM RUN apt-get update -yq && \ diff --git a/build.zig.zon b/build.zig.zon index e78035c35..9e76bd64e 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -5,8 +5,8 @@ .minimum_zig_version = "0.16.0", .dependencies = .{ .v8 = .{ - .url = "https://github.com/lightpanda-io/zig-v8-fork/archive/d3d7b41677a0015fdfa55a8b1caa4f214de6d209.tar.gz", - .hash = "v8-0.0.0-xddH624yAwC5_H_8T303uTxiSAnAu2zrxv6MHLhvLo6t", + .url = "https://github.com/lightpanda-io/zig-v8-fork/archive/ebd2fabfb001294ed43ef65286c7db17245416e9.tar.gz", + .hash = "v8-0.0.0-xddH66lEAwB-5Ec92QAp19-aZ6-oB8UnnUm-w3fBUEaX", }, // .v8 = .{ .path = "../zig-v8-fork" }, .brotli = .{ diff --git a/src/browser/js/Snapshot.zig b/src/browser/js/Snapshot.zig index 6eac3eda0..93ba82da9 100644 --- a/src/browser/js/Snapshot.zig +++ b/src/browser/js/Snapshot.zig @@ -668,7 +668,7 @@ fn illegalConstructorCallback(raw_info: ?*const v8.FunctionCallbackInfo) callcon if (v8.v8__Function__GetName(func)) |name_value| { if (v8.v8__Value__IsString(name_value)) { const str: *const v8.String = @ptrCast(name_value); - const n = v8.v8__String__WriteUtf8(str, isolate, &name_buf, name_buf.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8); + const n = v8.v8__String__WriteUtf8(str, isolate, &name_buf, name_buf.len, v8.WRITE_REPLACE_INVALID_UTF8, null); name = name_buf[0..@intCast(n)]; } } diff --git a/src/browser/js/String.zig b/src/browser/js/String.zig index 62abca82b..0018e5b63 100644 --- a/src/browser/js/String.zig +++ b/src/browser/js/String.zig @@ -65,7 +65,7 @@ fn _toSlice(self: String, comptime null_terminate: bool, allocator: Allocator) ! const l = v8.v8__String__Utf8Length(handle, isolate); const buf = try (if (comptime null_terminate) allocator.allocSentinel(u8, @intCast(l), 0) else allocator.alloc(u8, @intCast(l))); - const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8); + const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.WRITE_REPLACE_INVALID_UTF8, null); if (comptime lp.IS_DEBUG) { std.debug.assert(n == l); } @@ -87,7 +87,7 @@ pub fn toSSOWithAlloc(self: String, allocator: Allocator) !lp.String { if (l <= 12) { var content: [12]u8 = undefined; - const n = v8.v8__String__WriteUtf8(handle, isolate, &content[0], content.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8); + const n = v8.v8__String__WriteUtf8(handle, isolate, &content[0], content.len, v8.WRITE_REPLACE_INVALID_UTF8, null); if (comptime lp.IS_DEBUG) { std.debug.assert(n == l); } @@ -103,7 +103,7 @@ pub fn toSSOWithAlloc(self: String, allocator: Allocator) !lp.String { } const buf = try allocator.alloc(u8, l); - const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8); + const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.WRITE_REPLACE_INVALID_UTF8, null); if (comptime lp.IS_DEBUG) { std.debug.assert(n == l); } @@ -124,7 +124,7 @@ pub fn format(self: String, writer: *std.Io.Writer) !void { const l = v8.v8__String__Utf8Length(handle, isolate); var buf = if (l < 1024) &small else local.call_arena.alloc(u8, @intCast(l)) catch return error.WriteFailed; - const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8); + const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.WRITE_REPLACE_INVALID_UTF8, null); return writer.writeAll(buf[0..n]); } diff --git a/src/browser/js/js.zig b/src/browser/js/js.zig index 66e6b819b..5010598d6 100644 --- a/src/browser/js/js.zig +++ b/src/browser/js/js.zig @@ -598,7 +598,7 @@ pub fn writeStackTrace(isolate: *v8.Isolate, stack_handle: *const v8.StackTrace, const frame_handle = v8.v8__StackTrace__GetFrame(stack_handle, isolate, @intCast(i)).?; if (v8.v8__StackFrame__GetFunctionName(frame_handle)) |name| { var buf: [1024]u8 = undefined; - const n = v8.v8__String__WriteUtf8(name, isolate, &buf, buf.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8); + const n = v8.v8__String__WriteUtf8(name, isolate, &buf, buf.len, v8.WRITE_REPLACE_INVALID_UTF8, null); try writer.print("{s}{s}:{d}", .{ separator, buf[0..n], v8.v8__StackFrame__GetLineNumber(frame_handle) }); } else { try writer.print("{s}:{d}", .{ separator, v8.v8__StackFrame__GetLineNumber(frame_handle) }); diff --git a/src/script/Runtime.zig b/src/script/Runtime.zig index 5410bb132..8a9140e41 100644 --- a/src/script/Runtime.zig +++ b/src/script/Runtime.zig @@ -975,7 +975,8 @@ fn stringToOwned( self.env.isolate.handle, buf.ptr, buf.len, - v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8, + v8.WRITE_REPLACE_INVALID_UTF8, + null, ); return buf[0..written]; }