Skip to content

Commit 0d64a3d

Browse files
authored
Merge pull request #126 from lightpanda-io/snapshots_v3
Snapshots v3
2 parents e047d2a + 9e1a1e1 commit 0d64a3d

File tree

3 files changed

+141
-0
lines changed

3 files changed

+141
-0
lines changed

src/binding.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,14 @@ void v8__Isolate__EnqueueMicrotaskFunc(v8::Isolate* self, const v8::Function* fu
396396
self->EnqueueMicrotask(ptr_to_local(function));
397397
}
398398

399+
const v8::Data* v8__Isolate__GetDataFromSnapshotOnce(v8::Isolate *self, size_t idx) {
400+
v8::MaybeLocal<v8::Data> maybe = self->GetDataFromSnapshotOnce<v8::Data>(idx);
401+
if (maybe.IsEmpty()) {
402+
return nullptr;
403+
}
404+
return local_to_ptr(maybe.ToLocalChecked());
405+
}
406+
399407
size_t v8__HeapStatistics__SIZEOF() {
400408
return sizeof(v8::HeapStatistics);
401409
}
@@ -491,6 +499,14 @@ v8::Context* v8__Context__New(
491499
);
492500
}
493501

502+
v8::Context* v8__Context__FromSnapshot(v8::Isolate* isolate, size_t index) {
503+
v8::MaybeLocal<v8::Context> maybe = v8::Context::FromSnapshot(isolate, index);
504+
if (maybe.IsEmpty()) {
505+
return nullptr;
506+
}
507+
return local_to_ptr(maybe.ToLocalChecked());
508+
}
509+
494510
void v8__Context__Enter(const v8::Context& context) { ptr_to_local(&context)->Enter(); }
495511

496512
void v8__Context__Exit(const v8::Context& context) { ptr_to_local(&context)->Exit(); }
@@ -521,6 +537,14 @@ int v8__Context__DebugContextId(const v8::Context& self) {
521537
return v8::debug::GetContextId(ptr_to_local(&self));
522538
}
523539

540+
const v8::Data* v8__Context__GetDataFromSnapshotOnce(v8::Context *self, size_t idx) {
541+
v8::MaybeLocal<v8::Data> maybe = self->GetDataFromSnapshotOnce<v8::Data>(idx);
542+
if (maybe.IsEmpty()) {
543+
return nullptr;
544+
}
545+
return local_to_ptr(maybe.ToLocalChecked());
546+
}
547+
524548
// ScriptOrigin
525549

526550
void v8__ScriptOrigin__CONSTRUCT(
@@ -2258,3 +2282,44 @@ void v8_inspector__Client__consoleAPIMessage(
22582282
}
22592283

22602284
} // extern "C"
2285+
2286+
// SnapshotCreator
2287+
extern "C" {
2288+
2289+
v8::SnapshotCreator* v8__SnapshotCreator__CREATE(const v8::Isolate::CreateParams& params) {
2290+
return new v8::SnapshotCreator(params);
2291+
}
2292+
2293+
v8::Isolate* v8__SnapshotCreator__getIsolate(v8::SnapshotCreator* self) {
2294+
return self->GetIsolate();
2295+
}
2296+
2297+
size_t v8__SnapshotCreator__AddData(v8::SnapshotCreator* self, const v8::Data* data) {
2298+
return self->AddData(ptr_to_local(data));
2299+
}
2300+
2301+
size_t v8__SnapshotCreator__AddData2(v8::SnapshotCreator* self, const v8::Context* ctx, const v8::Data* data) {
2302+
return self->AddData(ptr_to_local(ctx), ptr_to_local(data));
2303+
}
2304+
2305+
void v8__SnapshotCreator__setDefaultContext(
2306+
v8::SnapshotCreator* self,
2307+
const v8::Context& ctx) {
2308+
return self->SetDefaultContext(ptr_to_local(&ctx));
2309+
}
2310+
2311+
v8::StartupData v8__SnapshotCreator__createBlob(
2312+
v8::SnapshotCreator *self,
2313+
v8::SnapshotCreator::FunctionCodeHandling function_code_handling) {
2314+
return self->CreateBlob(function_code_handling);
2315+
}
2316+
2317+
void v8__SnapshotCreator__DESTRUCT(v8::SnapshotCreator* self) {
2318+
delete self;
2319+
}
2320+
2321+
bool v8__StartupData__IsValid(v8::StartupData self) {
2322+
return self.IsValid();
2323+
}
2324+
2325+
} // extern "C"

src/binding.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,9 @@ const char* v8__V8__GetVersion();
205205
// Microtask
206206
typedef enum MicrotasksPolicy { kExplicit, kScoped, kAuto } MicrotasksPolicy;
207207

208+
// Snapshot
209+
typedef enum FunctionCodeHandling { kClear, kKeep } FunctionCodeHandling;
210+
208211
// Isolate
209212
Isolate* v8__Isolate__New(CreateParams* params);
210213
void v8__Isolate__Enter(Isolate* isolate);
@@ -269,6 +272,7 @@ void v8__Isolate__SetData(Isolate* self, int idx, void* val);
269272
typedef void (*MicrotaskCallback)(void* data);
270273
void v8__Isolate__EnqueueMicrotask(Isolate* self, MicrotaskCallback callback, void* data);
271274
void v8__Isolate__EnqueueMicrotaskFunc(Isolate* self, const Function* function);
275+
const Data* v8__Isolate__GetDataFromSnapshotOnce(const Isolate *self, size_t idx);
272276

273277
typedef struct StartupData {
274278
const char* data;
@@ -410,6 +414,7 @@ bool v8__StackFrame__IsUserJavaScript(const StackFrame* self);
410414
typedef struct Context Context;
411415
typedef struct ObjectTemplate ObjectTemplate;
412416
Context* v8__Context__New(Isolate* isolate, const ObjectTemplate* global_tmpl, const Value* global_obj);
417+
Context* v8__Context__FromSnapshot(Isolate*, size_t);
413418
void v8__Context__Enter(const Context* context);
414419
void v8__Context__Exit(const Context* context);
415420
Isolate* v8__Context__GetIsolate(const Context* context);
@@ -422,6 +427,7 @@ void v8__Context__SetEmbedderData(
422427
int idx,
423428
const Value* val);
424429
int v8__Context__DebugContextId(const Context* self);
430+
const Data* v8__Context__GetDataFromSnapshotOnce(const Context *self, size_t idx);
425431

426432
// Boolean
427433
const Boolean* v8__Boolean__New(
@@ -1267,3 +1273,15 @@ void v8_inspector__RemoteObject__setPreview(RemoteObject* self, ObjectPreview* p
12671273
bool v8_inspector__RemoteObject__hasCustomPreview(RemoteObject* self);
12681274
const CustomPreview* v8_inspector__RemoteObject__getCustomPreview(RemoteObject* self);
12691275
void v8_inspector__RemoteObject__setCustomPreview(RemoteObject* self, CustomPreview* customPreview);
1276+
1277+
// SnapshotCreator
1278+
typedef struct SnapshotCreator SnapshotCreator;
1279+
1280+
SnapshotCreator* v8__SnapshotCreator__CREATE(const CreateParams*);
1281+
Isolate* v8__SnapshotCreator__getIsolate(SnapshotCreator*);
1282+
void v8__SnapshotCreator__setDefaultContext(SnapshotCreator*, const Context*);
1283+
size_t v8__SnapshotCreator__AddData(SnapshotCreator*, const Data* data);
1284+
size_t v8__SnapshotCreator__AddData2(SnapshotCreator*, const Context* ctx, const Data* data);
1285+
StartupData v8__SnapshotCreator__createBlob(SnapshotCreator*, FunctionCodeHandling);
1286+
void v8__SnapshotCreator__DESTRUCT(SnapshotCreator*);
1287+
bool v8__StartupData__IsValid(StartupData);

src/v8.zig

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ pub const MicrotasksPolicy = struct {
5252
pub const kAuto = c.kAuto;
5353
};
5454

55+
pub const FunctionCodeHandling = struct {
56+
pub const kClear = c.kClear;
57+
pub const kKeep = c.kKeep;
58+
};
59+
5560
// Currently, user callback functions passed into FunctionTemplate will need to have this declared as a param and then
5661
// converted to FunctionCallbackInfo to get a nicer interface.
5762
pub const C_FunctionCallbackInfo = c.FunctionCallbackInfo;
@@ -508,6 +513,10 @@ pub const Isolate = struct {
508513
pub fn enqueueMicrotaskFunc(self: Self, function: Function) void {
509514
c.v8__Isolate__EnqueueMicrotaskFunc(self.handle, function.handle);
510515
}
516+
517+
pub fn getDataFromSnapshotOnce(self: Self, idx: usize) ?*const c.Data {
518+
return c.v8__Isolate__GetDataFromSnapshotOnce(self.handle, idx);
519+
}
511520
};
512521

513522
pub const HandleScope = struct {
@@ -558,6 +567,11 @@ pub const Context = struct {
558567
};
559568
}
560569

570+
pub fn fromSnapshot(isolate: Isolate, index: usize) ?Self {
571+
const handle = c.v8__Context__FromSnapshot(isolate.handle, index) orelse return null;
572+
return .{.handle = handle};
573+
}
574+
561575
/// [V8]
562576
/// Enter this context. After entering a context, all code compiled
563577
/// and run is compiled and run in this context. If another context
@@ -601,6 +615,10 @@ pub const Context = struct {
601615
pub fn debugContextId(self: Self) i32 {
602616
return c.v8__Context__DebugContextId(self.handle);
603617
}
618+
619+
pub fn getDataFromSnapshotOnce(self: Self, idx: usize) ?*const c.Data {
620+
return c.v8__Context__GetDataFromSnapshotOnce(self.handle, idx);
621+
}
604622
};
605623

606624
pub const PropertyCallbackInfo = struct {
@@ -3217,3 +3235,43 @@ pub export fn zigAlloc(self: *anyopaque, bytes: usize) callconv(.c) ?[*]u8 {
32173235
const allocated_bytes = allocator.alloc(u8, bytes) catch return null;
32183236
return allocated_bytes.ptr;
32193237
}
3238+
3239+
pub const StartupData = c.StartupData;
3240+
3241+
pub const SnapshotCreator = struct {
3242+
handle: *c.SnapshotCreator = undefined,
3243+
3244+
pub fn init(self: *SnapshotCreator, params: *const c.CreateParams) void {
3245+
self.handle = c.v8__SnapshotCreator__CREATE(params).?;
3246+
}
3247+
3248+
pub fn getIsolate(self: *SnapshotCreator) Isolate {
3249+
return .{
3250+
.handle = c.v8__SnapshotCreator__getIsolate(self.handle).?,
3251+
};
3252+
}
3253+
3254+
pub fn setDefaultContext(self: *SnapshotCreator, context: Context) void {
3255+
c.v8__SnapshotCreator__setDefaultContext(self.handle, context.handle);
3256+
}
3257+
3258+
pub fn addData(self: *SnapshotCreator, data: *const c.Data) usize {
3259+
return c.v8__SnapshotCreator__AddData(self.handle, data);
3260+
}
3261+
3262+
pub fn addDataWithContext(self: *SnapshotCreator, ctx: Context, data: *const c.Data) usize {
3263+
return c.v8__SnapshotCreator__AddData2(self.handle, ctx.handle, data);
3264+
}
3265+
3266+
pub fn createBlob(self: *SnapshotCreator, function_code_handling: c_uint) StartupData {
3267+
return c.v8__SnapshotCreator__createBlob(self.handle, function_code_handling);
3268+
}
3269+
3270+
pub fn deinit(self: *SnapshotCreator) void {
3271+
c.v8__SnapshotCreator__DESTRUCT(self.handle);
3272+
}
3273+
3274+
pub fn startupDataIsValid(data: StartupData) bool {
3275+
return c.v8__StartupData__IsValid(data);
3276+
}
3277+
};

0 commit comments

Comments
 (0)