diff options
Diffstat (limited to 'src/javascript/jsc/javascript.zig')
-rw-r--r-- | src/javascript/jsc/javascript.zig | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/src/javascript/jsc/javascript.zig b/src/javascript/jsc/javascript.zig index 88132aa77..709201a68 100644 --- a/src/javascript/jsc/javascript.zig +++ b/src/javascript/jsc/javascript.zig @@ -84,10 +84,18 @@ const Config = @import("./config.zig"); const URL = @import("../../url.zig").URL; const Transpiler = @import("./api/transpiler.zig"); const Bun = JSC.API.Bun; + +pub const GlobalConstructors = [_]type{ + WebCore.Blob.Constructor, + WebCore.TextDecoder.Constructor, + WebCore.TextEncoder.Constructor, + Request.Constructor, + Response.Constructor, + Headers.Constructor, + JSC.Cloudflare.HTMLRewriter.Constructor, +}; + pub const GlobalClasses = [_]type{ - Request.Class, - Response.Class, - Headers.Class, EventListenerMixin.addEventListener(VirtualMachine), BuildError.Class, ResolveError.Class, @@ -99,12 +107,6 @@ pub const GlobalClasses = [_]type{ WebCore.Crypto.Class, WebCore.Crypto.Prototype, - WebCore.TextEncoder.Constructor.Class, - WebCore.TextDecoder.Constructor.Class, - - JSC.Cloudflare.HTMLRewriter.Class, - WebCore.Blob.Class, - // The last item in this array becomes "process.env" Bun.EnvironmentVariables.Class, }; @@ -432,6 +434,7 @@ pub const SavedSourceMap = struct { pub const VirtualMachine = struct { global: *JSGlobalObject, allocator: std.mem.Allocator, + has_loaded_constructors: bool = false, node_modules: ?*NodeModuleBundle = null, bundler: Bundler, watcher: ?*http.Watcher = null, @@ -463,6 +466,7 @@ pub const VirtualMachine = struct { is_from_devserver: bool = false, has_enabled_macro_mode: bool = false, argv: []const []const u8 = &[_][]const u8{"bun"}, + global_api_constructors: [GlobalConstructors.len]JSC.JSValue = undefined, origin_timer: std.time.Timer = undefined, active_tasks: usize = 0, @@ -655,6 +659,25 @@ pub const VirtualMachine = struct { return classes; } + pub fn getAPIConstructors(globalObject: *JSGlobalObject) []const JSC.JSValue { + if (is_bindgen) + return &[_]JSC.JSValue{}; + if (!VirtualMachine.vm.has_loaded_constructors) { + VirtualMachine.vm.global = globalObject; + VirtualMachine.vm.has_loaded_constructors = true; + } + + inline for (GlobalConstructors) |Class, i| { + var ref = Class.constructor(globalObject.ref()).?; + JSC.C.JSValueProtect(globalObject.ref(), ref); + JSC.VirtualMachine.vm.global_api_constructors[i] = JSC.JSValue.fromRef( + ref, + ); + } + + return &JSC.VirtualMachine.vm.global_api_constructors; + } + pub fn init( allocator: std.mem.Allocator, _args: Api.TransformOptions, |