@@ -103,7 +103,9 @@ pub fn init(browser: *Browser, page: *Page) ScriptManager {
103103}
104104
105105pub fn deinit (self : * ScriptManager ) void {
106+ // necesasry to free any buffers scripts may be rerferencing
106107 self .reset ();
108+
107109 self .buffer_pool .deinit ();
108110 self .script_pool .deinit ();
109111 self .imported_modules .deinit (self .allocator );
@@ -227,6 +229,10 @@ pub fn addFromElement(self: *ScriptManager, element: *parser.Element, comptime c
227229 },
228230 };
229231
232+ const list = self .scriptList (script );
233+ list .append (& script .node );
234+ errdefer list .remove (& script .node );
235+
230236 if (remote_url ) | url | {
231237 var headers = try self .client .newHeaders ();
232238 try page .requestCookie (.{}).headersForRequest (page .arena , url , & headers );
@@ -251,8 +257,6 @@ pub fn addFromElement(self: *ScriptManager, element: *parser.Element, comptime c
251257 .stack = page .js .stackTrace () catch "???" ,
252258 });
253259 }
254-
255- self .scriptList (script ).append (& script .node );
256260}
257261
258262fn scriptList (self : * ScriptManager , script : * const Script ) * std.DoublyLinkedList {
@@ -447,8 +451,10 @@ fn evaluate(self: *ScriptManager) void {
447451 if (script .complete == false ) {
448452 return ;
449453 }
450- defer script .deinit (true );
451- defer _ = self .normal_scripts .popFirst ();
454+ defer {
455+ _ = self .normal_scripts .popFirst ();
456+ script .deinit (true );
457+ }
452458 script .eval (page );
453459 }
454460
@@ -468,8 +474,10 @@ fn evaluate(self: *ScriptManager) void {
468474 if (script .complete == false ) {
469475 return ;
470476 }
471- defer script .deinit (true );
472- defer _ = self .defer_scripts .popFirst ();
477+ defer {
478+ _ = self .defer_scripts .popFirst ();
479+ script .deinit (true );
480+ }
473481 script .eval (page );
474482 }
475483
@@ -640,8 +648,14 @@ const Script = struct {
640648 fn errorCallback (ctx : * anyopaque , err : anyerror ) void {
641649 const self : * Script = @ptrCast (@alignCast (ctx ));
642650 log .warn (.http , "script fetch error" , .{ .req = self .url , .err = err });
651+
643652 const manager = self .manager ;
644653 manager .scriptList (self ).remove (& self .node );
654+ if (manager .shutdown ) {
655+ self .deinit (true );
656+ return ;
657+ }
658+
645659 if (self .mode == .import ) {
646660 const entry = self .manager .imported_modules .getPtr (self .url ).? ;
647661 entry .* = error .Failed ;
0 commit comments