diff --git a/src/browser/js/Local.zig b/src/browser/js/Local.zig index 6a68b332..4b38f3f8 100644 --- a/src/browser/js/Local.zig +++ b/src/browser/js/Local.zig @@ -115,6 +115,38 @@ pub fn exec(self: *const Local, src: []const u8, name: ?[]const u8) !js.Value { return self.compileAndRun(src, name); } +/// Compiles a function body as function. +/// +/// https://v8.github.io/api/head/classv8_1_1ScriptCompiler.html#a3a15bb5a7dfc3f998e6ac789e6b4646a +pub fn compileFunction(self: *const Local, function_body: []const u8) !js.Function { + // TODO: Make configurable. + const script_name = self.isolate.initStringHandle("anonymous"); + const script_source = self.isolate.initStringHandle(function_body); + + // Create ScriptOrigin. + var origin: v8.ScriptOrigin = undefined; + v8.v8__ScriptOrigin__CONSTRUCT(&origin, script_name); + + // Create ScriptCompilerSource. + var script_compiler_source: v8.ScriptCompilerSource = undefined; + v8.v8__ScriptCompiler__Source__CONSTRUCT2(script_source, &origin, null, &script_compiler_source); + defer v8.v8__ScriptCompiler__Source__DESTRUCT(&script_compiler_source); + + // Compile the function. + const result = v8.v8__ScriptCompiler__CompileFunction( + self.handle, + &script_compiler_source, + 0, + null, + 0, + null, + v8.kNoCompileOptions, + v8.kNoCacheNoReason, + ) orelse return error.CompilationError; + + return .{ .local = self, .handle = result }; +} + pub fn compileAndRun(self: *const Local, src: []const u8, name: ?[]const u8) !js.Value { const script_name = self.isolate.initStringHandle(name orelse "anonymous"); const script_source = self.isolate.initStringHandle(src);