@@ -22,6 +22,7 @@ const builtin = @import("builtin");
2222const Allocator = std .mem .Allocator ;
2323
2424const Dump = @import ("dump.zig" );
25+ const State = @import ("State.zig" );
2526const Env = @import ("env.zig" ).Env ;
2627const Mime = @import ("mime.zig" ).Mime ;
2728const DataURI = @import ("datauri.zig" ).DataURI ;
@@ -95,6 +96,8 @@ pub const Page = struct {
9596 // indicates intention to navigate to another page on the next loop execution.
9697 delayed_navigation : bool = false ,
9798
99+ state_pool : * std .heap .MemoryPool (State ),
100+
98101 pub fn init (self : * Page , arena : Allocator , session : * Session ) ! void {
99102 const browser = session .browser ;
100103 self .* = .{
@@ -106,6 +109,7 @@ pub const Page = struct {
106109 .call_arena = undefined ,
107110 .loop = browser .app .loop ,
108111 .renderer = Renderer .init (arena ),
112+ .state_pool = & browser .state_pool ,
109113 .cookie_jar = & session .cookie_jar ,
110114 .microtask_node = .{ .func = microtaskCallback },
111115 .window_clicked_event_node = .{ .func = windowClicked },
@@ -597,21 +601,21 @@ pub const Page = struct {
597601 _ = try self .loop .timeout (0 , & navi .navigate_node );
598602 }
599603
600- pub fn getOrCreateNodeWrapper (self : * Page , comptime T : type , node : * parser.Node ) ! * T {
601- if (self .getNodeWrapper ( T , node )) | wrap | {
604+ pub fn getOrCreateNodeState (self : * Page , node : * parser.Node ) ! * State {
605+ if (self .getNodeState ( node )) | wrap | {
602606 return wrap ;
603607 }
604608
605- const wrap = try self .arena .create (T );
606- wrap .* = T {};
609+ const state = try self .state_pool .create ();
610+ state .* = . {};
607611
608- parser .nodeSetEmbedderData (node , wrap );
609- return wrap ;
612+ parser .nodeSetEmbedderData (node , state );
613+ return state ;
610614 }
611615
612- pub fn getNodeWrapper (_ : * const Page , comptime T : type , node : * parser.Node ) ? * T {
613- if (parser .nodeGetEmbedderData (node )) | wrap | {
614- return @alignCast (@ptrCast (wrap ));
616+ pub fn getNodeState (_ : * const Page , node : * parser.Node ) ? * State {
617+ if (parser .nodeGetEmbedderData (node )) | state | {
618+ return @alignCast (@ptrCast (state ));
615619 }
616620 return null ;
617621 }
@@ -743,8 +747,7 @@ const Script = struct {
743747 // attached to it. But this seems quite unlikely and it does help
744748 // optimize loading scripts, of which there can be hundreds for a
745749 // page.
746- const State = @import ("state/HTMLElement.zig" );
747- if (page .getNodeWrapper (State , @ptrCast (e ))) | se | {
750+ if (page .getNodeState (@ptrCast (e ))) | se | {
748751 if (se .onload ) | function | {
749752 onload = .{ .function = function };
750753 }
0 commit comments