Tweak Finalizer callbacks

1 - Finalizer callbacks are now give a *Page parameter. Various types no longer
    need to maintain a reference to *Page just to finalize

2 - EventManager now handles v8_handoff == false cleanup. This is largely
    because of the above change, which would require every:

```
defer if (!event._v8_handoff) event.deinit(false);
```

to be turned into:

```
defer if (!event._v8_handoff) event.deinit(false, page);
```

But the caller might not have a page. Besides this, it makes most uses of Event
simpler. But, in some cases, it could leave a window where the event doesn't
reach the EventManager to be properly managed (though, we have no such cases
as of now).
This commit is contained in:
Karl Seguin
2026-02-22 20:35:05 +08:00
parent eb9b706ebc
commit 028b728760
44 changed files with 136 additions and 205 deletions

View File

@@ -45,7 +45,7 @@ pub const InitOpts = Request.InitOpts;
pub fn init(input: Input, options: ?InitOpts, page: *Page) !js.Promise {
const request = try Request.init(input, options, page);
const response = try Response.init(null, .{ .status = 0 }, page);
errdefer response.deinit(true);
errdefer response.deinit(true, page);
const resolver = page.js.local.?.createPromiseResolver();
@@ -184,7 +184,7 @@ fn httpErrorCallback(ctx: *anyopaque, err: anyerror) void {
// clear this. (defer since `self is in the response's arena).
defer if (self._owns_response) {
response.deinit(err == error.Abort);
response.deinit(err == error.Abort, self._page);
self._owns_response = false;
};
@@ -205,7 +205,7 @@ fn httpShutdownCallback(ctx: *anyopaque) void {
if (self._owns_response) {
var response = self._response;
response._transfer = null;
response.deinit(true);
response.deinit(true, self._page);
// Do not access `self` after this point: the Fetch struct was
// allocated from response._arena which has been released.
}