From 5e4e4dcbc61d99202e708be13d525bee6725a780 Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Thu, 25 Dec 2025 12:07:32 +0100 Subject: [PATCH] split Value.fromJson into Value.persist --- src/browser/fetch/Request.zig | 3 ++- src/browser/fetch/Response.zig | 3 ++- src/browser/js/js.zig | 11 ++++++++--- src/browser/xhr/xhr.zig | 8 +++++++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/browser/fetch/Request.zig b/src/browser/fetch/Request.zig index e22d9f77..6e09a5e3 100644 --- a/src/browser/fetch/Request.zig +++ b/src/browser/fetch/Request.zig @@ -258,8 +258,9 @@ pub fn _json(self: *Response, page: *Page) !js.Promise { log.info(.browser, "invalid json", .{ .err = e, .source = "Request" }); return error.SyntaxError; }; + const pvalue = try value.persist(page.js); - return page.js.resolvePromise(value); + return page.js.resolvePromise(pvalue); } return page.js.resolvePromise(null); } diff --git a/src/browser/fetch/Response.zig b/src/browser/fetch/Response.zig index dc83071c..4932b45e 100644 --- a/src/browser/fetch/Response.zig +++ b/src/browser/fetch/Response.zig @@ -183,8 +183,9 @@ pub fn _json(self: *Response, page: *Page) !js.Promise { log.info(.browser, "invalid json", .{ .err = e, .source = "Response" }); return error.SyntaxError; }; + const pvalue = try value.persist(page.js); - return page.js.resolvePromise(value); + return page.js.resolvePromise(pvalue); } return page.js.resolvePromise(null); } diff --git a/src/browser/js/js.zig b/src/browser/js/js.zig index a6af906f..5a35b100 100644 --- a/src/browser/js/js.zig +++ b/src/browser/js/js.zig @@ -161,11 +161,16 @@ pub const Value = struct { pub fn fromJson(ctx: *Context, json: []const u8) !Value { const json_string = v8.String.initUtf8(ctx.isolate, json); const value = try v8.Json.parse(ctx.v8_context, json_string); + return Value{ .context = ctx, .value = value }; + } - const persisted = PersistentValue.init(ctx.isolate, value); - try ctx.js_value_list.append(ctx.arena, persisted); + pub fn persist(self: Value, context: *Context) !Value { + const js_value = self.value; - return Value{ .context = ctx, .value = persisted.toValue() }; + const persisted = PersistentValue.init(context.isolate, js_value); + try context.js_value_list.append(context.arena, persisted); + + return Value{ .context = context, .value = persisted.toValue() }; } }; diff --git a/src/browser/xhr/xhr.zig b/src/browser/xhr/xhr.zig index 588c103e..2207a897 100644 --- a/src/browser/xhr/xhr.zig +++ b/src/browser/xhr/xhr.zig @@ -701,7 +701,13 @@ pub const XMLHttpRequest = struct { return; }; - self.response_obj = .{ .JSON = value }; + const pvalue = value.persist(page.js) catch |e| { + log.warn(.http, "persist v8 json value", .{ .err = e, .url = self.url, .source = "xhr" }); + self.response_obj = .{ .Failure = {} }; + return; + }; + + self.response_obj = .{ .JSON = pvalue }; } pub fn get_responseText(self: *XMLHttpRequest) ![]const u8 {