mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-02-04 06:23:45 +00:00
add Value.persist
This commit is contained in:
@@ -32,6 +32,7 @@ const ScriptManager = @import("../ScriptManager.zig");
|
||||
|
||||
const Allocator = std.mem.Allocator;
|
||||
const PersistentObject = v8.Persistent(v8.Object);
|
||||
const PersistentValue = v8.Persistent(v8.Value);
|
||||
const PersistentModule = v8.Persistent(v8.Module);
|
||||
const PersistentPromise = v8.Persistent(v8.Promise);
|
||||
const PersistentFunction = v8.Persistent(v8.Function);
|
||||
@@ -85,6 +86,9 @@ identity_map: std.AutoHashMapUnmanaged(usize, PersistentObject) = .empty,
|
||||
// we now simply persist every time persist() is called.
|
||||
js_object_list: std.ArrayListUnmanaged(PersistentObject) = .empty,
|
||||
|
||||
// js_value_list tracks persisted js values.
|
||||
js_value_list: std.ArrayListUnmanaged(PersistentValue) = .empty,
|
||||
|
||||
// Various web APIs depend on having a persistent promise resolver. They
|
||||
// require for this PromiseResolver to be valid for a lifetime longer than
|
||||
// the function that resolves/rejects them.
|
||||
@@ -161,6 +165,10 @@ pub fn deinit(self: *Context) void {
|
||||
p.deinit();
|
||||
}
|
||||
|
||||
for (self.js_value_list.items) |*p| {
|
||||
p.deinit();
|
||||
}
|
||||
|
||||
for (self.persisted_promise_resolvers.items) |*p| {
|
||||
p.deinit();
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@ const v8 = js.v8;
|
||||
|
||||
const Allocator = std.mem.Allocator;
|
||||
|
||||
const PersistentValue = v8.Persistent(v8.Value);
|
||||
|
||||
const Value = @This();
|
||||
js_val: v8.Value,
|
||||
context: *js.Context,
|
||||
@@ -49,6 +51,16 @@ pub fn fromJson(ctx: *js.Context, json: []const u8) !Value {
|
||||
return Value{ .context = ctx, .js_val = value };
|
||||
}
|
||||
|
||||
pub fn persist(self: Value) !Value {
|
||||
const js_val = self.js_val;
|
||||
var context = self.context;
|
||||
|
||||
const persisted = PersistentValue.init(context.isolate, js_val);
|
||||
try context.js_value_list.append(context.arena, persisted);
|
||||
|
||||
return Value{ .context = context, .js_val = persisted.toValue() };
|
||||
}
|
||||
|
||||
pub fn toObject(self: Value) js.Object {
|
||||
return .{
|
||||
.context = self.context,
|
||||
|
||||
Reference in New Issue
Block a user