diff options
Diffstat (limited to 'src/javascript/jsc/bindings/bindings.zig')
-rw-r--r-- | src/javascript/jsc/bindings/bindings.zig | 595 |
1 files changed, 202 insertions, 393 deletions
diff --git a/src/javascript/jsc/bindings/bindings.zig b/src/javascript/jsc/bindings/bindings.zig index c7b69a23d..c84058095 100644 --- a/src/javascript/jsc/bindings/bindings.zig +++ b/src/javascript/jsc/bindings/bindings.zig @@ -1,12 +1,9 @@ -usingnamespace @import("../../../global.zig"); - -const std = @import("std"); -const is_bindgen: bool = std.meta.globalOption("bindgen", bool) orelse false; +usingnamespace @import("./shared.zig"); +usingnamespace @import("./headers.zig"); +pub const Shimmer = @import("./shimmer.zig").Shimmer; const hasRef = std.meta.trait.hasField("ref"); -const StaticExport = @import("./static_export.zig"); -const Shimmer = @import("./shimmer.zig").Shimmer; -pub const JSObject = packed struct { +pub const JSObject = extern struct { pub const shim = Shimmer("JSC", "JSObject", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -14,13 +11,7 @@ pub const JSObject = packed struct { pub const name = "JSC::JSObject"; pub const namespace = "JSC"; - pub fn putAtIndex(this: *JSObject, globalThis: *JSGlobalObject, property_name: *PropertyName, i: u32) bool { - return cppFn("putAtIndex", .{ - this, - property_name, - i, - }); - } + pub extern "c" fn putAtIndex(this: *JSObject, globalThis: *JSGlobalObject, property_name: *PropertyName, i: u32) bool; pub fn getArrayLength(this: *JSObject) usize { return cppFn("getArrayLength", .{ @@ -43,7 +34,7 @@ pub const JSObject = packed struct { }; }; -// pub const JSMap = packed struct { +// pub const JSMap = extern struct { // pub const shim = Shimmer("JSC", "JSMap", @This()); // bytes: shim.Bytes, // const cppFn = shim.cppFn; @@ -53,53 +44,53 @@ pub const JSObject = packed struct { // pub const EntryIteratorCallback = fn (ctx: ?*c_void, container: JSValue, key: JSValue, value: JSValue) callconv(.C) bool; -// pub fn get(this: *JSMap, globalThis: *JSGlobalObject) JSValue { -// return cppFn("get", .{ this, globalThis }); +// pub fn get(this: *JSMap,globalThis: *JSGlobalObject) JSValue { +// return cppFn("get", .{ this,globalThis }); // } -// pub fn set(this: *JSMap, globalThis: *JSGlobalObject, key: JSValue, value: JSValue) bool { -// return cppFn("set", .{ this, globalThis, key, value }); +// pub fn set(this: *JSMap,globalThis: *JSGlobalObject, key: JSValue, value: JSValue) bool { +// return cppFn("set", .{ this,globalThis, key, value }); // } -// pub fn clear(this: *JSMap, globalThis: *JSGlobalObject) void { +// pub fn clear(this: *JSMap,globalThis: *JSGlobalObject) void { // return cppFn("clear", .{ // this, -// globalThis, +// globalThis, // }); // } // // This is a JSValue so that we can use the same callback for iterating over different JSCell types. -// pub fn forEach(this: JSValue, globalThis: *JSGlobalObject, ctx: ?*c_void, iterator: EntryIteratorCallback) void { +// pub fn forEach(this: JSValue,globalThis: *JSGlobalObject, ctx: ?*c_void, iterator: EntryIteratorCallback) void { // return cppFn("forEach", .{ // this, -// globalThis, +// globalThis, // ctx, // iterator, // }); // } -// // pub fn iterator(this: *JSMap, globalThis: *JSGlobalObject) *JSMapIterator {} -// pub fn delete(this: *JSMap, globalThis: *JSGlobalObject) bool { -// return cppFn("delete", .{ this, globalThis }); +// // pub fn iterator(this: *JSMap,globalThis: *JSGlobalObject) *JSMapIterator {} +// pub fn delete(this: *JSMap,globalThis: *JSGlobalObject) bool { +// return cppFn("delete", .{ this,globalThis }); // } -// pub fn has(this: *JSMap, globalThis: *JSGlobalObject) JSValue { -// return cppFn("has", .{ this, globalThis }); +// pub fn has(this: *JSMap,globalThis: *JSGlobalObject) JSValue { +// return cppFn("has", .{ this,globalThis }); // } -// pub fn size(this: *JSMap, globalThis: *JSGlobalObject) u32 { -// return cppFn("size", .{ this, globalThis }); +// pub fn size(this: *JSMap,globalThis: *JSGlobalObject) u32 { +// return cppFn("size", .{ this,globalThis }); // } -// pub fn create(globalThis: *JSGlobalObject, size_hint: u32) *JSMap { -// return cppFn("create", .{ globalThis, size_hint }); +// pub fn createglobalThis: *JSGlobalObject, size_hint: u32) *JSMap { +// return cppFn("create", .{globalThis, size_hint }); // } -// pub fn clone(this: *JSMap, globalThis: *JSGlobalObject) *JSMap { -// return cppFn("clone", .{ this, globalThis }); +// pub fn clone(this: *JSMap,globalThis: *JSGlobalObject) *JSMap { +// return cppFn("clone", .{ this,globalThis }); // } // pub const Extern = [_][]const u8{ "get", "set", "clear", "delete", "has", "create", "size", "forEach", "clone" }; // }; -pub const JSCell = packed struct { +pub const JSCell = extern struct { pub const shim = Shimmer("JSC", "JSCell", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -126,7 +117,7 @@ pub const JSCell = packed struct { pub const Extern = [_][]const u8{ "getObject", "getString", "getType" }; }; -pub const JSString = packed struct { +pub const JSString = extern struct { pub const shim = Shimmer("JSC", "JSString", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -142,9 +133,7 @@ pub const JSString = packed struct { return shim.cppFn("eql", .{ this, global, other }); } - pub fn value(this: *JSString, globalObject: *JSGlobalObject) String { - return shim.cppFn("value", .{ this, globalObject }); - } + pub extern fn value(ret_value: String, this: *JSString, globalObject: *JSGlobalObject) void; pub fn length(this: *const JSString) usize { return shim.cppFn("length", .{ @@ -178,7 +167,7 @@ pub const JSPromiseRejectionOperation = enum(u32) { Handle = 1, }; -pub const ScriptArguments = packed struct { +pub const ScriptArguments = extern struct { pub const shim = Shimmer("Inspector", "ScriptArguments", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -220,240 +209,57 @@ pub const ScriptArguments = packed struct { }; }; -const EmptyGlobalInterface = struct { - pub fn import(global: *JSGlobalObject, loader: *JSModuleLoader, specifier: *JSString, referrer: JSValue, origin: *const SourceOrigin) callconv(.C) *JSInternalPromise { - return JSInternalPromise.rejectedPromise(global, JSValue.jsUndefined()); - } - const slice = "hello.js"; - pub fn resolve(global: *JSGlobalObject, loader: *JSModuleLoader, specifier: JSValue, value: JSValue, origin: *const SourceOrigin) callconv(.C) Identifier { - return Identifier.fromSlice(global.vm(), &slice, slice.len); - } - pub fn fetch(global: *JSGlobalObject, loader: *JSModuleLoader, value1: JSValue, value2: JSValue, value3: JSValue) callconv(.C) *JSInternalPromise { - return JSInternalPromise.rejectedPromise(global, JSValue.jsUndefined()); - } - pub fn eval(global: *JSGlobalObject, loader: *JSModuleLoader, key: JSValue, moduleRecordValue: JSValue, scriptFetcher: JSValue, awaitedValue: JSValue, resumeMode: JSValue) callconv(.C) JSValue { - return JSValue.jsUndefined(); - } - pub fn promiseRejectionTracker(global: *JSGlobalObject, promise: *JSPromise, rejection: JSPromiseRejectionOperation) callconv(.C) JSValue { - return JSValue.jsUndefined(); - } - - pub fn reportUncaughtException(global: *JSGlobalObject, exception: *Exception) callconv(.C) JSValue { - return JSValue.jsUndefined(); - } - - pub fn createImportMetaProperties(global: *JSGlobalObject, loader: *JSModuleLoader, obj: JSValue, record: *JSModuleRecord, specifier: JSValue) callconv(.C) JSValue { - return JSValue.jsUndefined(); - } -}; - -pub const ZigGlobalObject = packed struct { - pub const shim = Shimmer("Zig", "GlobalObject", @This()); - bytes: shim.Bytes, - pub const Type = *c_void; - pub const name = "Zig::GlobalObject"; - pub const include = "\"ZigGlobalObject.h\""; - pub const namespace = shim.namespace; - pub const Interface: type = std.meta.globalOption("JSGlobalObject", type) orelse EmptyGlobalInterface; - - pub fn create(vm: ?*VM, console: *ZigConsoleClient) *JSGlobalObject { - return shim.cppFn("create", .{ vm, console }); - } - - pub fn import(global: *JSGlobalObject, loader: *JSModuleLoader, specifier: *JSString, referrer: JSValue, origin: *const SourceOrigin) callconv(.C) *JSInternalPromise { - // if (comptime is_bindgen) { - // unreachable; - // } - - return @call(.{ .modifier = .always_inline }, Interface.import, .{ global, loader, specifier, referrer, origin }); - } - pub fn resolve(global: *JSGlobalObject, loader: *JSModuleLoader, specifier: JSValue, value: JSValue, origin: *const SourceOrigin) callconv(.C) Identifier { - if (comptime is_bindgen) { - unreachable; +pub fn NewGlobalObject(comptime Type: type) type { + return struct { + pub fn import(global: *JSGlobalObject, loader: *JSModuleLoader, specifier: *JSString, referrer: JSValue, origin: *const SourceOrigin) callconv(.C) *JSInternalPromise { + if (comptime @hasDecl(Type, "import")) { + return @call(.{ .modifier = .always_inline }, Interface.import, .{ global, loader, specifier, referrer, origin }); + } + return JSInternalPromise.rejectedPromise(global, JSValue.jsUndefined()); } - return @call(.{ .modifier = .always_inline }, Interface.resolve, .{ global, loader, specifier, value, origin }); - } - pub fn fetch(global: *JSGlobalObject, loader: *JSModuleLoader, value1: JSValue, value2: JSValue, value3: JSValue) callconv(.C) *JSInternalPromise { - if (comptime is_bindgen) { - unreachable; + const slice: []const u8 = "hello.js"; + pub fn resolve(global: *JSGlobalObject, loader: *JSModuleLoader, specifier: JSValue, value: JSValue, origin: *const SourceOrigin) callconv(.C) Identifier { + if (comptime @hasDecl(Type, "resolve")) { + return @call(.{ .modifier = .always_inline }, Interface.resolve, .{ global, loader, specifier, value, origin }); + } + return Identifier.fromSlice(global.vm(), slice.ptr, slice.len); } - return @call(.{ .modifier = .always_inline }, Interface.fetch, .{ global, loader, value1, value2, value3 }); - } - pub fn eval(global: *JSGlobalObject, loader: *JSModuleLoader, key: JSValue, moduleRecordValue: JSValue, scriptFetcher: JSValue, awaitedValue: JSValue, resumeMode: JSValue) callconv(.C) JSValue { - if (comptime is_bindgen) { - unreachable; + pub fn fetch(global: *JSGlobalObject, loader: *JSModuleLoader, value1: JSValue, value2: JSValue, value3: JSValue) callconv(.C) *JSInternalPromise { + if (comptime @hasDecl(Type, "fetch")) { + return @call(.{ .modifier = .always_inline }, Interface.fetch, .{ global, loader, value1, value2, value3 }); + } + return JSInternalPromise.rejectedPromise(global, JSValue.jsUndefined()); } - @call(.{ .modifier = .always_inline }, Interface.eval, .{ global, loader, key, moduleRecordValue, scriptFetcher, awaitedValue, resumeMode }); - } - pub fn promiseRejectionTracker(global: *JSGlobalObject, promise: *JSPromise, rejection: JSPromiseRejectionOperation) callconv(.C) JSValue { - if (comptime is_bindgen) { - unreachable; + pub fn eval(global: *JSGlobalObject, loader: *JSModuleLoader, key: JSValue, moduleRecordValue: JSValue, scriptFetcher: JSValue, awaitedValue: JSValue, resumeMode: JSValue) callconv(.C) JSValue { + if (comptime @hasDecl(Type, "eval")) { + return @call(.{ .modifier = .always_inline }, Interface.eval, .{ global, loader, key, moduleRecordValue, scriptFetcher, awaitedValue, resumeMode }); + } + return JSValue.jsUndefined(); } - return @call(.{ .modifier = .always_inline }, Interface.promiseRejectionTracker, .{ global, promise, rejection }); - } - - pub fn reportUncaughtException(global: *JSGlobalObject, exception: *Exception) callconv(.C) JSValue { - if (comptime is_bindgen) { - unreachable; + pub fn promiseRejectionTracker(global: *JSGlobalObject, promise: *JSPromise, rejection: JSPromiseRejectionOperation) callconv(.C) JSValue { + if (comptime @hasDecl(Type, "promiseRejectionTracker")) { + return @call(.{ .modifier = .always_inline }, Interface.promiseRejectionTracker, .{ global, promise, rejection }); + } + return JSValue.jsUndefined(); } - return @call(.{ .modifier = .always_inline }, Interface.reportUncaughtException, .{ global, exception }); - } - pub fn createImportMetaProperties(global: *JSGlobalObject, loader: *JSModuleLoader, obj: JSValue, record: *JSModuleRecord, specifier: JSValue) callconv(.C) JSValue { - if (comptime is_bindgen) { - unreachable; + pub fn reportUncaughtException(global: *JSGlobalObject, exception: *Exception) callconv(.C) JSValue { + if (comptime @hasDecl(Type, "reportUncaughtException")) { + return @call(.{ .modifier = .always_inline }, Interface.reportUncaughtException, .{ global, exception }); + } + return JSValue.jsUndefined(); } - return @call(.{ .modifier = .always_inline }, Interface.createImportMetaProperties, .{ global, loader, obj, record, specifier }); - } - - pub const Export = shim.exportFunctions(.{ - .@"import" = import, - .@"resolve" = resolve, - .@"fetch" = fetch, - .@"eval" = eval, - .@"promiseRejectionTracker" = promiseRejectionTracker, - .@"reportUncaughtException" = reportUncaughtException, - .@"createImportMetaProperties" = createImportMetaProperties, - }); - - pub const Extern = [_][]const u8{"create"}; - - comptime { - @export(import, .{ .name = Export[0].symbol_name }); - @export(resolve, .{ .name = Export[1].symbol_name }); - @export(fetch, .{ .name = Export[2].symbol_name }); - @export(eval, .{ .name = Export[3].symbol_name }); - @export(promiseRejectionTracker, .{ .name = Export[4].symbol_name }); - @export(reportUncaughtException, .{ .name = Export[5].symbol_name }); - @export(createImportMetaProperties, .{ .name = Export[6].symbol_name }); - } -}; -pub const ZigConsoleClient = packed struct { - pub const shim = Shimmer("Zig", "ConsoleClient", @This()); - pub const Type = *c_void; - pub const name = "Zig::ConsoleClient"; - pub const include = "\"ZigConsoleClient.h\""; - pub const namespace = shim.namespace; - pub const Counter = struct { - // if it turns out a hash table is a better idea we'll do that later - pub const Entry = struct { - hash: u32, - count: u32, - - pub const List = std.MultiArrayList(Entry); - }; - counts: Entry.List, - allocator: *std.mem.Allocator, - }; - - pub fn messageWithTypeAndLevel( - message_type: u32, - message_level: u32, - global: *JSGlobalObject, - args: *ScriptArguments, - ) callconv(.C) void { - var i: usize = 0; - const len = args.argumentCount(); - defer args.release(); - defer Output.flush(); - var writer = Output.writer(); - while (i < len) : (i += 1) { - var str = args.argumentAt(i).toWTFString(global); - writer.writeAll(str.slice()) catch {}; + pub fn createImportMetaProperties(global: *JSGlobalObject, loader: *JSModuleLoader, obj: JSValue, record: *JSModuleRecord, specifier: JSValue) callconv(.C) JSValue { + if (comptime @hasDecl(Type, "createImportMetaProperties")) { + return @call(.{ .modifier = .always_inline }, Interface.createImportMetaProperties, .{ global, loader, obj, record, specifier }); + } + return JSValue.jsUndefined(); } - } - pub fn count(global: *JSGlobalObject, chars: [*]const u8, len: usize) callconv(.C) void {} - pub fn countReset(global: *JSGlobalObject, chars: [*]const u8, len: usize) callconv(.C) void {} - pub fn time(global: *JSGlobalObject, chars: [*]const u8, len: usize) callconv(.C) void {} - pub fn timeLog(global: *JSGlobalObject, chars: [*]const u8, len: usize, args: *ScriptArguments) callconv(.C) void {} - pub fn timeEnd(global: *JSGlobalObject, chars: [*]const u8, len: usize) callconv(.C) void {} - pub fn profile(global: *JSGlobalObject, chars: [*]const u8, len: usize) callconv(.C) void {} - pub fn profileEnd(global: *JSGlobalObject, chars: [*]const u8, len: usize) callconv(.C) void {} - pub fn takeHeapSnapshot(global: *JSGlobalObject, chars: [*]const u8, len: usize) callconv(.C) void {} - pub fn timeStamp(global: *JSGlobalObject, args: *ScriptArguments) callconv(.C) void {} - pub fn record(global: *JSGlobalObject, args: *ScriptArguments) callconv(.C) void {} - pub fn recordEnd(global: *JSGlobalObject, args: *ScriptArguments) callconv(.C) void {} - pub fn screenshot(global: *JSGlobalObject, args: *ScriptArguments) callconv(.C) void {} - - pub const Export = shim.exportFunctions(.{ - .@"messageWithTypeAndLevel" = messageWithTypeAndLevel, - .@"count" = count, - .@"countReset" = countReset, - .@"time" = time, - .@"timeLog" = timeLog, - .@"timeEnd" = timeEnd, - .@"profile" = profile, - .@"profileEnd" = profileEnd, - .@"takeHeapSnapshot" = takeHeapSnapshot, - .@"timeStamp" = timeStamp, - .@"record" = record, - .@"recordEnd" = recordEnd, - .@"screenshot" = screenshot, - }); - - comptime { - @export(messageWithTypeAndLevel, .{ - .name = Export[0].symbol_name, - }); - @export(count, .{ - .name = Export[1].symbol_name, - }); - @export(countReset, .{ - .name = Export[2].symbol_name, - }); - @export(time, .{ - .name = Export[3].symbol_name, - }); - @export(timeLog, .{ - .name = Export[4].symbol_name, - }); - @export(timeEnd, .{ - .name = Export[5].symbol_name, - }); - @export(profile, .{ - .name = Export[6].symbol_name, - }); - @export(profileEnd, .{ - .name = Export[7].symbol_name, - }); - @export(takeHeapSnapshot, .{ - .name = Export[8].symbol_name, - }); - @export(timeStamp, .{ - .name = Export[9].symbol_name, - }); - @export(record, .{ - .name = Export[10].symbol_name, - }); - @export(recordEnd, .{ - .name = Export[11].symbol_name, - }); - @export(screenshot, .{ - .name = Export[12].symbol_name, - }); - } -}; - -pub const DefaultGlobal = packed struct { - pub const shim = Shimmer("Wundle", "DefaultGlobal", @This()); - bytes: shim.Bytes, - pub const include = "\"DefaultGlobal.h\""; - pub const name = "Wundle::DefaultGlobal"; - pub const namespace = "Wundle"; - - pub fn getWrapper(this: *DefaultGlobal) *c_void { - return shim.cppFn("getWrapper", .{this}); - } - - pub fn create(this: *DefaultGlobal, wrapper_ptr: *c_void) *DefaultGlobal { - return shim.cppFn("create", .{ this, wrapper_ptr }); - } - - pub const Extern = [_][]const u8{ "getWrapper", "create" }; -}; + }; +} -pub const JSModuleLoader = packed struct { +pub const JSModuleLoader = extern struct { pub const shim = Shimmer("JSC", "JSModuleLoader", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -485,7 +291,7 @@ pub const JSModuleLoader = packed struct { } pub fn importModule(globalObject: *JSGlobalObject, key: *const Identifier) *JSInternalPromise { - return shim.cppFn("loadAndEvaluateModule", .{ + return shim.cppFn("importModule", .{ globalObject, key, }); @@ -506,12 +312,12 @@ pub const JSModuleLoader = packed struct { }); } - pub fn dependencyKeysIfEvaluated(this: *JSModuleLoader, globalObject: *JSGlobalObject, moduleRecord: *JSModuleRecord) *JSValue { - return shim.cppFn("dependencyKeysIfEvaluated", .{ this, globalObject, moduleRecord }); - } + // pub fn dependencyKeysIfEvaluated(this: *JSModuleLoader, globalObject: *JSGlobalObject, moduleRecord: *JSModuleRecord) *JSValue { + // return shim.cppFn("dependencyKeysIfEvaluated", .{ this, globalObject, moduleRecord }); + // } pub const Extern = [_][]const u8{ - "dependencyKeysIfEvaluated", + // "dependencyKeysIfEvaluated", "evaluate", "loadAndEvaluateModuleEntryPoint", "loadAndEvaluateModule", @@ -521,7 +327,7 @@ pub const JSModuleLoader = packed struct { }; }; -pub const JSModuleRecord = packed struct { +pub const JSModuleRecord = extern struct { pub const shim = Shimmer("JSC", "JSModuleRecord", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -540,7 +346,7 @@ pub const JSModuleRecord = packed struct { }; }; -pub const JSPromise = packed struct { +pub const JSPromise = extern struct { pub const shim = Shimmer("JSC", "JSPromise", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -569,26 +375,26 @@ pub const JSPromise = packed struct { } pub fn resolvedPromise(globalThis: *JSGlobalObject, value: JSValue) *JSPromise { - return cppFn("resolvedPromise", .{ .globalThis = globalThis, .value = value }); + return cppFn("resolvedPromise", .{ globalThis, value }); } pub fn rejectedPromise(globalThis: *JSGlobalObject, value: JSValue) *JSPromise { - return cppFn("rejectedPromise", .{ .globalThis = globalThis, .value = value }); + return cppFn("rejectedPromise", .{ globalThis, value }); } pub fn resolve(this: *JSPromise, globalThis: *JSGlobalObject, value: JSValue) void { - cppFn("resolve", .{ .this = this, .globalThis = globalThis, .value = value }); + cppFn("resolve", .{ this, globalThis, value }); } pub fn reject(this: *JSPromise, globalThis: *JSGlobalObject, value: JSValue) void { - cppFn("reject", .{ .this = this, .globalThis = globalThis, .value = value }); + cppFn("reject", .{ this, globalThis, value }); } pub fn rejectAsHandled(this: *JSPromise, globalThis: *JSGlobalObject, value: JSValue) void { - cppFn("rejectAsHandled", .{ .this = this, .globalThis = globalThis, .value = value }); - } - pub fn rejectException(this: *JSPromise, globalThis: *JSGlobalObject, value: *Exception) void { - cppFn("rejectException", .{ .this = this, .globalThis = globalThis, .value = value }); + cppFn("rejectAsHandled", .{ this, globalThis, value }); } + // pub fn rejectException(this: *JSPromise, globalThis: *JSGlobalObject, value: *Exception) void { + // cppFn("rejectException", .{ this, globalThis, value }); + // } pub fn rejectAsHandledException(this: *JSPromise, globalThis: *JSGlobalObject, value: *Exception) void { - cppFn("rejectAsHandledException", .{ .this = this, .globalThis = globalThis, .value = value }); + cppFn("rejectAsHandledException", .{ this, globalThis, value }); } pub const Extern = [_][]const u8{ @@ -601,12 +407,12 @@ pub const JSPromise = packed struct { "resolve", "reject", "rejectAsHandled", - "rejectException", + // "rejectException", "rejectAsHandledException", }; }; -pub const JSInternalPromise = packed struct { +pub const JSInternalPromise = extern struct { pub const shim = Shimmer("JSC", "JSInternalPromise", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -635,34 +441,34 @@ pub const JSInternalPromise = packed struct { } pub fn resolvedPromise(globalThis: *JSGlobalObject, value: JSValue) *JSInternalPromise { - return cppFn("resolvedPromise", .{ .globalThis = globalThis, .value = value }); + return cppFn("resolvedPromise", .{ globalThis, value }); } pub fn rejectedPromise(globalThis: *JSGlobalObject, value: JSValue) *JSInternalPromise { - return cppFn("rejectedPromise", .{ .globalThis = globalThis, .value = value }); + return cppFn("rejectedPromise", .{ globalThis, value }); } pub fn resolve(this: *JSInternalPromise, globalThis: *JSGlobalObject, value: JSValue) void { - cppFn("resolve", .{ .this = this, .globalThis = globalThis, .value = value }); + cppFn("resolve", .{ this, globalThis, value }); } pub fn reject(this: *JSInternalPromise, globalThis: *JSGlobalObject, value: JSValue) void { - cppFn("reject", .{ .this = this, .globalThis = globalThis, .value = value }); + cppFn("reject", .{ this, globalThis, value }); } pub fn rejectAsHandled(this: *JSInternalPromise, globalThis: *JSGlobalObject, value: JSValue) void { - cppFn("rejectAsHandled", .{ .this = this, .globalThis = globalThis, .value = value }); - } - pub fn rejectException(this: *JSInternalPromise, globalThis: *JSGlobalObject, value: *Exception) void { - cppFn("rejectException", .{ .this = this, .globalThis = globalThis, .value = value }); + cppFn("rejectAsHandled", .{ this, globalThis, value }); } + // pub fn rejectException(this: *JSInternalPromise, globalThis: *JSGlobalObject, value: *Exception) void { + // cppFn("rejectException", .{ this, globalThis, value }); + // } pub fn rejectAsHandledException(this: *JSInternalPromise, globalThis: *JSGlobalObject, value: *Exception) void { - cppFn("rejectAsHandledException", .{ .this = this, .globalThis = globalThis, .value = value }); + cppFn("rejectAsHandledException", .{ this, globalThis, value }); } pub fn then(this: *JSInternalPromise, globalThis: *JSGlobalObject, resolvefunc: ?*JSFunction, rejectfunc: ?*JSFunction) *JSInternalPromise { - return cppFn("then", .{ .this = this, .globalThis = globalThis, .resolvefunc = resolvefunc, .rejectfunc = rejectfunc }); + return cppFn("then", .{ this, globalThis, resolvefunc, rejectfunc }); } pub fn create(globalThis: *JSGlobalObject) *JSInternalPromise { - return cppFn("create", .{ .globalThis = globalThis }); + return cppFn("create", .{globalThis}); } pub const Extern = [_][]const u8{ @@ -677,7 +483,7 @@ pub const JSInternalPromise = packed struct { "resolve", "reject", "rejectAsHandled", - "rejectException", + // "rejectException", "rejectAsHandledException", }; }; @@ -689,7 +495,7 @@ pub const SourceType = enum(u8) { WebAssembly = 2, }; -pub const SourceOrigin = packed struct { +pub const SourceOrigin = extern struct { pub const shim = Shimmer("JSC", "SourceOrigin", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -706,7 +512,7 @@ pub const SourceOrigin = packed struct { }; }; -pub const SourceCode = packed struct { +pub const SourceCode = extern struct { pub const shim = Shimmer("JSC", "SourceCode", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -714,8 +520,8 @@ pub const SourceCode = packed struct { pub const name = "JSC::SourceCode"; pub const namespace = "JSC"; - pub fn fromString(source: *const String, origin: *const SourceOrigin, filename: *String, source_type: SourceType) SourceCode { - return cppFn("fromString", .{ source, origin, filename, source_type }); + pub fn fromString(result: *SourceCode, source: *const String, origin: ?*const SourceOrigin, filename: ?*String, source_type: SourceType) void { + cppFn("fromString", .{ result, source, origin, filename, source_type }); } pub const Extern = [_][]const u8{ @@ -723,7 +529,7 @@ pub const SourceCode = packed struct { }; }; -pub const JSFunction = packed struct { +pub const JSFunction = extern struct { pub const shim = Shimmer("JSC", "JSFunction", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -783,7 +589,7 @@ pub const JSFunction = packed struct { arguments_ptr: [*]JSValue, arguments_len: usize, exception: *?*Exception, - error_message: ?*const u8, + error_message: *const c_char, ) JSValue { return cppFn("callWithArgumentsAndThis", .{ function, @@ -802,7 +608,7 @@ pub const JSFunction = packed struct { arguments_ptr: [*]JSValue, arguments_len: usize, exception: *?*Exception, - error_message: ?*const u8, + error_message: *const c_char, ) JSValue { return cppFn("callWithArguments", .{ function, globalThis, arguments_ptr, arguments_len, exception, exception, error_message }); } @@ -812,7 +618,7 @@ pub const JSFunction = packed struct { globalThis: *JSGlobalObject, thisValue: JSValue, exception: *?*Exception, - error_message: ?*const u8, + error_message: *const c_char, ) JSValue { return cppFn("callWithArguments", .{ function, @@ -827,7 +633,7 @@ pub const JSFunction = packed struct { function: JSValue, globalThis: *JSGlobalObject, exception: *?*Exception, - error_message: ?*const u8, + error_message: *const c_char, ) JSValue { return cppFn("callWithoutAnyArgumentsOrThis", .{ function, globalThis, exception, exception, error_message }); } @@ -839,7 +645,7 @@ pub const JSFunction = packed struct { arguments_ptr: [*]JSValue, arguments_len: usize, exception: *?*Exception, - error_message: ?*const u8, + error_message: *const c_char, ) JSValue { return cppFn("constructWithArgumentsAndNewTarget", .{ function, @@ -858,7 +664,7 @@ pub const JSFunction = packed struct { arguments_ptr: [*]JSValue, arguments_len: usize, exception: *?*Exception, - error_message: ?*const u8, + error_message: *const c_char, ) JSValue { return cppFn("constructWithArguments", .{ function, globalThis, arguments_ptr, arguments_len, exception, exception, error_message }); } @@ -868,7 +674,7 @@ pub const JSFunction = packed struct { globalThis: *JSGlobalObject, newTarget: JSValue, exception: *?*Exception, - error_message: ?*const u8, + error_message: *const c_char, ) JSValue { return cppFn("constructWithArguments", .{ function, @@ -883,7 +689,7 @@ pub const JSFunction = packed struct { function: JSValue, globalThis: *JSGlobalObject, exception: *?*Exception, - error_message: ?*const u8, + error_message: *const c_char, ) JSValue { return cppFn("constructWithoutAnyArgumentsOrNewTarget", .{ function, globalThis, exception, exception, error_message }); } @@ -906,7 +712,7 @@ pub const JSFunction = packed struct { }; }; -pub const JSGlobalObject = packed struct { +pub const JSGlobalObject = extern struct { pub const shim = Shimmer("JSC", "JSGlobalObject", @This()); bytes: shim.Bytes, @@ -926,19 +732,19 @@ pub const JSGlobalObject = packed struct { OutOfMemoryError = 8, }; - pub fn createError(globalObject: *JSGlobalObject, error_type: ErrorType, message: *String) *JSObject { - return cppFn("createError", .{ globalObject, @enumToInt(error_type), message }); - } + // pub fn createError(globalObject: *JSGlobalObject, error_type: ErrorType, message: *String) *JSObject { + // return cppFn("createError", .{ globalObject, error_type, message }); + // } - pub fn throwError( - globalObject: *JSGlobalObject, - err: *JSObject, - ) *JSObject { - return cppFn("throwError", .{ - globalObject, - err, - }); - } + // pub fn throwError( + // globalObject: *JSGlobalObject, + // err: *JSObject, + // ) *JSObject { + // return cppFn("throwError", .{ + // globalObject, + // err, + // }); + // } const cppFn = shim.cppFn; @@ -1045,8 +851,8 @@ pub const JSGlobalObject = packed struct { "asyncGeneratorPrototype", "asyncGeneratorFunctionPrototype", "vm", - "createError", - "throwError", + // "createError", + // "throwError", }; }; @@ -1056,7 +862,7 @@ fn _JSCellStub(comptime str: []const u8) type { pub const name = "JSC::" ++ str ++ ""; }; } else { - return struct {}; + return opaque {}; } } @@ -1066,7 +872,7 @@ fn _Wundle(comptime str: []const u8) type { pub const name = "Wundle::" ++ str ++ ""; }; } else { - return struct {}; + return opaque {}; } } @@ -1076,11 +882,11 @@ fn _WTF(comptime str: []const u8) type { pub const name = "WTF::" ++ str ++ ""; }; } else { - return struct {}; + return opaque {}; } } -pub const URL = packed struct { +pub const URL = extern struct { pub const shim = Shimmer("WTF", "URL", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -1092,8 +898,8 @@ pub const URL = packed struct { return cppFn("fromString", .{ base, relative }); } - pub fn fromFileSystemPath(file_system_path: StringView) URL { - return cppFn("fromFileSystemPath", .{file_system_path}); + pub fn fromFileSystemPath(result: *URL, file_system_path: StringView) void { + cppFn("fromFileSystemPath", .{ result, file_system_path }); } pub fn isEmpty(this: *const URL) bool { @@ -1187,7 +993,7 @@ pub const URL = packed struct { pub const Extern = [_][]const u8{ "fromFileSystemPath", "fromString", "isEmpty", "isValid", "protocol", "encodedUser", "encodedPassword", "host", "path", "lastPathComponent", "query", "fragmentIdentifier", "queryWithLeadingQuestionMark", "fragmentIdentifierWithLeadingNumberSign", "stringWithoutQueryOrFragmentIdentifier", "stringWithoutFragmentIdentifier", "protocolHostAndPort", "hostAndPort", "user", "password", "fileSystemPath", "setProtocol", "setHost", "setHostAndPort", "setUser", "setPassword", "setPath", "setQuery", "truncatedForUseAsBase" }; }; -pub const String = packed struct { +pub const String = extern struct { pub const shim = Shimmer("WTF", "String", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -1195,16 +1001,20 @@ pub const String = packed struct { pub const name = "WTF::String"; pub const namespace = "WTF"; - pub fn createWithoutCopyingFromPtr(str: [*]const u8, len: usize) String { - return cppFn("createWithoutCopyingFromPtr", .{ str, len }); + pub fn createWithoutCopyingFromPtr(out: *String, str: [*c]const u8, len: usize) void { + return cppFn("createWithoutCopyingFromPtr", .{ out, str, len }); } pub fn createFromExternalString(str: ExternalStringImpl) String { - return cppFn("createFromExternalString", .{str}); + return cppFn("createFromExternalString", .{ + str, + }); } pub fn createWithoutCopying(str: []const u8) String { - return @call(.{ .modifier = .always_inline }, createWithoutCopyingFromPtr, .{ str.ptr, str.len }); + var bytes = String{ .bytes = undefined }; + @call(.{ .modifier = .always_inline }, createWithoutCopyingFromPtr, .{ &bytes, str.ptr, str.len }); + return bytes; } pub fn is8Bit(this: *String) bool { @@ -1392,8 +1202,8 @@ pub const JSValue = enum(i64) { return cppFn("asCell", .{this}); } - pub fn isCallable(this: JSValue) bool { - return cppFn("isCallable", .{this}); + pub fn isCallable(this: JSValue, vm: *VM) bool { + return cppFn("isCallable", .{ this, vm }); } // On exception, this returns the empty string. @@ -1449,16 +1259,10 @@ pub const JSValue = enum(i64) { }); } - pub fn encode(this: JSValue) u64 { - return cppFn("encode", .{ - this, - }); - } - - pub const Extern = [_][]const u8{ "toWTFString", "hasProperty", "getPropertyNames", "getDirect", "putDirect", "get", "getIfExists", "encode", "asString", "asObject", "asNumber", "isError", "jsNull", "jsUndefined", "jsTDZValue", "jsBoolean", "jsDoubleNumber", "jsNumberFromDouble", "jsNumberFromChar", "jsNumberFromU16", "jsNumberFromInt32", "jsNumberFromInt64", "jsNumberFromUint64", "isUndefined", "isNull", "isUndefinedOrNull", "isBoolean", "isAnyInt", "isUInt32AsAnyInt", "isInt32AsAnyInt", "isNumber", "isString", "isBigInt", "isHeapBigInt", "isBigInt32", "isSymbol", "isPrimitive", "isGetterSetter", "isCustomGetterSetter", "isObject", "isCell", "asCell", "toString", "toStringOrNull", "toPropertyKey", "toPropertyKeyValue", "toObject", "toString", "getPrototype", "getPropertyByPropertyName", "eqlValue", "eqlCell" }; + pub const Extern = [_][]const u8{ "toWTFString", "hasProperty", "getPropertyNames", "getDirect", "putDirect", "get", "getIfExists", "asString", "asObject", "asNumber", "isError", "jsNull", "jsUndefined", "jsTDZValue", "jsBoolean", "jsDoubleNumber", "jsNumberFromDouble", "jsNumberFromChar", "jsNumberFromU16", "jsNumberFromInt32", "jsNumberFromInt64", "jsNumberFromUint64", "isUndefined", "isNull", "isUndefinedOrNull", "isBoolean", "isAnyInt", "isUInt32AsAnyInt", "isInt32AsAnyInt", "isNumber", "isString", "isBigInt", "isHeapBigInt", "isBigInt32", "isSymbol", "isPrimitive", "isGetterSetter", "isCustomGetterSetter", "isObject", "isCell", "asCell", "toString", "toStringOrNull", "toPropertyKey", "toPropertyKeyValue", "toObject", "toString", "getPrototype", "getPropertyByPropertyName", "eqlValue", "eqlCell", "isCallable" }; }; -pub const PropertyName = packed struct { +pub const PropertyName = extern struct { pub const shim = Shimmer("JSC", "PropertyName", @This()); bytes: shim.Bytes, @@ -1491,7 +1295,7 @@ pub const PropertyName = packed struct { pub const Extern = [_][]const u8{ "eqlToPropertyName", "eqlToIdentifier", "publicName", "uid" }; }; -pub const Exception = packed struct { +pub const Exception = extern struct { pub const shim = Shimmer("JSC", "Exception", @This()); bytes: shim.Bytes, pub const Type = JSObject; @@ -1518,7 +1322,7 @@ pub const Exception = packed struct { }; }; -pub const JSLock = packed struct { +pub const JSLock = extern struct { pub const shim = Shimmer("JSC", "Exception", @This()); bytes: shim.Bytes, @@ -1538,7 +1342,7 @@ pub const JSLock = packed struct { pub const Extern = [_][]const u8{ "lock", "unlock" }; }; -pub const VM = packed struct { +pub const VM = extern struct { pub const shim = Shimmer("JSC", "VM", @This()); bytes: shim.Bytes, @@ -1604,7 +1408,7 @@ pub const VM = packed struct { pub const Extern = [_][]const u8{ "apiLock", "create", "deinit", "setExecutionForbidden", "executionForbidden", "isEntered", "throwError", "drainMicrotasks" }; }; -pub const ThrowScope = packed struct { +pub const ThrowScope = extern struct { pub const shim = Shimmer("JSC", "ThrowScope", @This()); bytes: shim.Bytes, @@ -1643,7 +1447,7 @@ pub const ThrowScope = packed struct { }; }; -pub const CatchScope = packed struct { +pub const CatchScope = extern struct { pub const shim = Shimmer("JSC", "CatchScope", @This()); bytes: shim.Bytes, @@ -1677,7 +1481,7 @@ pub const CatchScope = packed struct { }; }; -pub const CallFrame = packed struct { +pub const CallFrame = extern struct { pub const shim = Shimmer("JSC", "CallFrame", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -1731,7 +1535,7 @@ pub const CallFrame = packed struct { pub const Extern = [_][]const u8{ "argumentsCount", "uncheckedArgument", "argument", "thisValue", "newTarget", "jsCallee", "setNewTarget", "setThisValue" }; }; -// pub const WellKnownSymbols = packed struct { +// pub const WellKnownSymbols = extern struct { // pub const shim = Shimmer("JSC", "CommonIdentifiers", @This()); // @@ -1770,7 +1574,7 @@ pub const EncodedJSValue = enum(i64) { pub const namespace = "JSC"; }; -pub const Identifier = packed struct { +pub const Identifier = extern struct { pub const shim = Shimmer("JSC", "Identifier", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -1787,9 +1591,9 @@ pub const Identifier = packed struct { return cppFn("fromSlice", .{ vm, ptr, len }); } - pub fn fromUid(vm: *VM, other: *const StringImpl) Identifier { - return cppFn("fromString", .{ vm, other }); - } + // pub fn fromUid(vm: *VM, other: *const StringImpl) Identifier { + // return cppFn("fromUid", .{ vm, other }); + // } pub fn deinit(this: *const Identifier) void { return cppFn("deinit", .{this}); @@ -1839,7 +1643,7 @@ pub const Identifier = packed struct { pub const Extern = [_][]const u8{ "fromString", "fromSlice", - "fromUid", + // "fromUid", "deinit", "toString", "length", @@ -1857,7 +1661,7 @@ pub const Identifier = packed struct { const DeinitFunction = fn (ctx: *c_void, buffer: [*]u8, len: usize) callconv(.C) void; -pub const StringImpl = packed struct { +pub const StringImpl = extern struct { pub const shim = Shimmer("WTF", "StringImpl", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -1905,7 +1709,7 @@ pub const StringImpl = packed struct { }; }; -pub const ExternalStringImpl = packed struct { +pub const ExternalStringImpl = extern struct { pub const shim = Shimmer("WTF", "ExternalStringImpl", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -1948,7 +1752,39 @@ pub const ExternalStringImpl = packed struct { }; }; -pub const StringView = packed struct { +const _JSGlobalObject = _Wundle("JSGlobalObject"); +const ObjectPrototype = _JSCellStub("ObjectPrototype"); +const FunctionPrototype = _JSCellStub("FunctionPrototype"); +const ArrayPrototype = _JSCellStub("ArrayPrototype"); +const StringPrototype = _JSCellStub("StringPrototype"); +const BigIntPrototype = _JSCellStub("BigIntPrototype"); +const RegExpPrototype = _JSCellStub("RegExpPrototype"); +const IteratorPrototype = _JSCellStub("IteratorPrototype"); +const AsyncIteratorPrototype = _JSCellStub("AsyncIteratorPrototype"); +const GeneratorFunctionPrototype = _JSCellStub("GeneratorFunctionPrototype"); +const GeneratorPrototype = _JSCellStub("GeneratorPrototype"); +const AsyncFunctionPrototype = _JSCellStub("AsyncFunctionPrototype"); +const ArrayIteratorPrototype = _JSCellStub("ArrayIteratorPrototype"); +const MapIteratorPrototype = _JSCellStub("MapIteratorPrototype"); +const SetIteratorPrototype = _JSCellStub("SetIteratorPrototype"); +const JSPromisePrototype = _JSCellStub("JSPromisePrototype"); +const AsyncGeneratorPrototype = _JSCellStub("AsyncGeneratorPrototype"); +const AsyncGeneratorFunctionPrototype = _JSCellStub("AsyncGeneratorFunctionPrototype"); +pub fn SliceFn(comptime Type: type) type { + const SliceStruct = struct { + pub fn slice(this: *const Type) []const u8 { + if (this.isEmpty()) { + return ""; + } + + return this.characters8()[0..this.length()]; + } + }; + + return @TypeOf(SliceStruct.slice); +} + +pub const StringView = extern struct { pub const shim = Shimmer("WTF", "StringView", @This()); bytes: shim.Bytes, const cppFn = shim.cppFn; @@ -1957,12 +1793,14 @@ pub const StringView = packed struct { pub const name = "WTF::StringView"; pub const namespace = "WTF"; - pub fn from8Bit(ptr: [*]const u8, len: usize) StringView { - return cppFn("from8Bit", .{ ptr, len }); + pub fn from8Bit(view: *StringView, ptr: [*]const u8, len: usize) void { + return cppFn("from8Bit", .{ view, ptr, len }); } pub fn fromSlice(value: []const u8) StringView { - return from8Bit(value.ptr, value.len); + var view = std.mem.zeroes(StringView); + from8Bit(&view, value.ptr, value.len); + return view; } pub fn is8Bit(this: *const StringView) bool { @@ -2396,38 +2234,9 @@ pub const Cpp = struct { // } }; }; + +pub usingnamespace @import("exports.zig"); + pub const Callback = struct { // zig: Value, }; - -const _JSGlobalObject = _Wundle("JSGlobalObject"); -const ObjectPrototype = _JSCellStub("ObjectPrototype"); -const FunctionPrototype = _JSCellStub("FunctionPrototype"); -const ArrayPrototype = _JSCellStub("ArrayPrototype"); -const StringPrototype = _JSCellStub("StringPrototype"); -const BigIntPrototype = _JSCellStub("BigIntPrototype"); -const RegExpPrototype = _JSCellStub("RegExpPrototype"); -const IteratorPrototype = _JSCellStub("IteratorPrototype"); -const AsyncIteratorPrototype = _JSCellStub("AsyncIteratorPrototype"); -const GeneratorFunctionPrototype = _JSCellStub("GeneratorFunctionPrototype"); -const GeneratorPrototype = _JSCellStub("GeneratorPrototype"); -const AsyncFunctionPrototype = _JSCellStub("AsyncFunctionPrototype"); -const ArrayIteratorPrototype = _JSCellStub("ArrayIteratorPrototype"); -const MapIteratorPrototype = _JSCellStub("MapIteratorPrototype"); -const SetIteratorPrototype = _JSCellStub("SetIteratorPrototype"); -const JSPromisePrototype = _JSCellStub("JSPromisePrototype"); -const AsyncGeneratorPrototype = _JSCellStub("AsyncGeneratorPrototype"); -const AsyncGeneratorFunctionPrototype = _JSCellStub("AsyncGeneratorFunctionPrototype"); -pub fn SliceFn(comptime Type: type) type { - const SliceStruct = struct { - pub fn slice(this: *const Type) []const u8 { - if (this.isEmpty()) { - return ""; - } - - return this.characters8()[0..this.length()]; - } - }; - - return @TypeOf(SliceStruct.slice); -} |