From e53ceb62ec337772b306d76ef05d4ce2050e6b28 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Sat, 15 Nov 2025 16:36:15 -0800 Subject: [PATCH] zig: fix missing uses of bun.callmod_inline (#24738) results in better strack traces in debug mode --- src/bun.js/api/BunObject.zig | 6 ++-- src/bun.js/api/ffi.zig | 2 +- .../event_loop/AnyTaskWithExtraContext.zig | 2 +- src/bun.js/jsc/host_fn.zig | 4 +-- src/bun.js/webcore/BakeResponse.zig | 2 +- src/codegen/generate-classes.ts | 32 +++++++++---------- src/codegen/generate-js2native.ts | 2 +- src/deps/uws/App.zig | 4 +-- src/deps/uws/Response.zig | 4 +-- src/js_printer.zig | 4 +-- src/router.zig | 4 +-- src/string/immutable/unicode.zig | 10 +----- 12 files changed, 33 insertions(+), 43 deletions(-) diff --git a/src/bun.js/api/BunObject.zig b/src/bun.js/api/BunObject.zig index f522c106c3..8eb64a3126 100644 --- a/src/bun.js/api/BunObject.zig +++ b/src/bun.js/api/BunObject.zig @@ -755,11 +755,9 @@ pub fn sleepSync(globalObject: *jsc.JSGlobalObject, callframe: *jsc.CallFrame) b return .js_undefined; } -pub fn gc(vm: *jsc.VirtualMachine, sync: bool) usize { - return vm.garbageCollect(sync); -} +pub const gc = Bun__gc; export fn Bun__gc(vm: *jsc.VirtualMachine, sync: bool) callconv(.c) usize { - return @call(.always_inline, gc, .{ vm, sync }); + return vm.garbageCollect(sync); } pub fn shrink(globalObject: *jsc.JSGlobalObject, _: *jsc.CallFrame) bun.JSError!jsc.JSValue { diff --git a/src/bun.js/api/ffi.zig b/src/bun.js/api/ffi.zig index 18f647124f..4b99ba8b5a 100644 --- a/src/bun.js/api/ffi.zig +++ b/src/bun.js/api/ffi.zig @@ -34,7 +34,7 @@ fn dangerouslyRunWithoutJitProtections(R: type, func: anytype, args: anytype) R const has_protection = (Environment.isAarch64 and Environment.isMac); if (comptime has_protection) pthread_jit_write_protect_np(@intFromBool(false)); defer if (comptime has_protection) pthread_jit_write_protect_np(@intFromBool(true)); - return @call(.always_inline, func, args); + return @call(bun.callmod_inline, func, args); } const Offsets = extern struct { diff --git a/src/bun.js/event_loop/AnyTaskWithExtraContext.zig b/src/bun.js/event_loop/AnyTaskWithExtraContext.zig index 42cc957ca6..acbd8e6ba0 100644 --- a/src/bun.js/event_loop/AnyTaskWithExtraContext.zig +++ b/src/bun.js/event_loop/AnyTaskWithExtraContext.zig @@ -54,7 +54,7 @@ pub fn New(comptime Type: type, comptime ContextType: type, comptime Callback: a pub fn wrap(this: ?*anyopaque, extra: ?*anyopaque) void { @call( - .always_inline, + bun.callmod_inline, Callback, .{ @as(*Type, @ptrCast(@alignCast(this.?))), diff --git a/src/bun.js/jsc/host_fn.zig b/src/bun.js/jsc/host_fn.zig index 1d001bd826..1cc4d1b904 100644 --- a/src/bun.js/jsc/host_fn.zig +++ b/src/bun.js/jsc/host_fn.zig @@ -696,7 +696,7 @@ pub fn wrapInstanceMethod( } } - return @call(.always_inline, @field(Container, name), args); + return @call(bun.callmod_inline, @field(Container, name), args); } }.method; } @@ -838,7 +838,7 @@ pub fn wrapStaticMethod( defer iter.deinit(); - return @call(.always_inline, @field(Container, name), args); + return @call(bun.callmod_inline, @field(Container, name), args); } }.method; } diff --git a/src/bun.js/webcore/BakeResponse.zig b/src/bun.js/webcore/BakeResponse.zig index 020769ac99..c3f4cffb9b 100644 --- a/src/bun.js/webcore/BakeResponse.zig +++ b/src/bun.js/webcore/BakeResponse.zig @@ -70,7 +70,7 @@ pub fn constructRedirect( } pub export fn BakeResponseClass__constructRender(globalObject: *jsc.JSGlobalObject, callFrame: *jsc.CallFrame) callconv(jsc.conv) jsc.JSValue { - return @call(.always_inline, jsc.toJSHostFn(constructRender), .{ globalObject, callFrame }); + return @call(bun.callmod_inline, jsc.toJSHostFn(constructRender), .{ globalObject, callFrame }); } /// This function is only available on JSBakeResponse diff --git a/src/codegen/generate-classes.ts b/src/codegen/generate-classes.ts index 1c18c4738c..eac4f1e8cf 100644 --- a/src/codegen/generate-classes.ts +++ b/src/codegen/generate-classes.ts @@ -2171,7 +2171,7 @@ const JavaScriptCoreBindings = struct { output += ` pub fn ${classSymbolName(typeName, "finalize")}(thisValue: *${typeName}) callconv(jsc.conv) void { if (comptime Environment.enable_logs) log_zig_finalize("${typeName}", thisValue); - @call(.always_inline, ${typeName}.finalize, .{thisValue}); + @call(bun.callmod_inline, ${typeName}.finalize, .{thisValue}); } `; } @@ -2214,7 +2214,7 @@ const JavaScriptCoreBindings = struct { output += ` pub fn ${classSymbolName(typeName, "call")}(globalObject: *jsc.JSGlobalObject, callFrame: *jsc.CallFrame) callconv(jsc.conv) jsc.JSValue { if (comptime Environment.enable_logs) log_zig_call("${typeName}", callFrame); - return @call(.always_inline, jsc.toJSHostFn(${typeName}.call), .{globalObject, callFrame}); + return @call(bun.callmod_inline, jsc.toJSHostFn(${typeName}.call), .{globalObject, callFrame}); } `; } @@ -2224,7 +2224,7 @@ const JavaScriptCoreBindings = struct { output += ` pub fn ${classSymbolName(typeName, "getInternalProperties")}(thisValue: *${typeName}, globalObject: *jsc.JSGlobalObject, thisValue: jsc.JSValue) callconv(jsc.conv) jsc.JSValue { if (comptime Environment.enable_logs) log_zig_get_internal_properties("${typeName}"); - return @call(.always_inline, ${typeName}.getInternalProperties, .{thisValue, globalObject, thisValue}); + return @call(bun.callmod_inline, ${typeName}.getInternalProperties, .{thisValue, globalObject, thisValue}); } `; } @@ -2240,9 +2240,9 @@ const JavaScriptCoreBindings = struct { if (comptime Environment.enable_logs) log_zig_getter("${typeName}", "${name}"); return switch (@typeInfo(@typeInfo(@TypeOf(${typeName}.${getter})).@"fn".return_type.?)) { .error_union => { - return @call(.always_inline, jsc.toJSHostCall, .{globalObject, @src(), ${typeName}.${getter}, .{this, ${thisValue ? "thisValue," : ""} globalObject}}); + return @call(bun.callmod_inline, jsc.toJSHostCall, .{globalObject, @src(), ${typeName}.${getter}, .{this, ${thisValue ? "thisValue," : ""} globalObject}}); }, - else => @call(.always_inline, ${typeName}.${getter}, .{this, ${thisValue ? "thisValue," : ""} globalObject}), + else => @call(bun.callmod_inline, ${typeName}.${getter}, .{this, ${thisValue ? "thisValue," : ""} globalObject}), }; } `; @@ -2257,10 +2257,10 @@ const JavaScriptCoreBindings = struct { if (error_union.payload != void) { @compileError("Setter return type must be JSError!void or void"); } - return @call(.always_inline, jsc.host_fn.toJSHostSetterValue, .{globalObject, @call(.always_inline, ${typeName}.${setter}, .{this, ${thisValue ? "thisValue," : ""} globalObject, value})}); + return @call(bun.callmod_inline, jsc.host_fn.toJSHostSetterValue, .{globalObject, @call(bun.callmod_inline, ${typeName}.${setter}, .{this, ${thisValue ? "thisValue," : ""} globalObject, value})}); }, .void => { - @call(.always_inline, ${typeName}.${setter}, .{this, ${thisValue ? "thisValue," : ""} globalObject, value}); + @call(bun.callmod_inline, ${typeName}.${setter}, .{this, ${thisValue ? "thisValue," : ""} globalObject, value}); return true; }, else => @compileError("Setter return type must be JSError!void or void"), @@ -2284,7 +2284,7 @@ const JavaScriptCoreBindings = struct { output += ` pub fn ${names.fn}(thisValue: *${typeName}, globalObject: *jsc.JSGlobalObject, callFrame: *jsc.CallFrame${proto[name].passThis ? ", js_this_value: jsc.JSValue" : ""}) callconv(jsc.conv) jsc.JSValue { if (comptime Environment.enable_logs) log_zig_method("${typeName}", "${name}", callFrame); - return @call(.always_inline, jsc.toJSHostCall, .{globalObject, @src(), ${typeName}.${fn}, .{thisValue, globalObject, callFrame${proto[name].passThis ? ", js_this_value" : ""}}}); + return @call(bun.callmod_inline, jsc.toJSHostCall, .{globalObject, @src(), ${typeName}.${fn}, .{thisValue, globalObject, callFrame${proto[name].passThis ? ", js_this_value" : ""}}}); } `; } @@ -2302,10 +2302,10 @@ const JavaScriptCoreBindings = struct { if (comptime Environment.enable_logs) log_zig_class_getter("${typeName}", "${name}"); return switch (@typeInfo(@typeInfo(@TypeOf(${typeName}.${getter})).@"fn".return_type.?)) { .error_union => { - return @call(.always_inline, jsc.toJSHostCall, .{globalObject, @src(), ${typeName}.${getter}, .{globalObject, ${thisValue ? "thisValue," : ""} propertyName}}); + return @call(bun.callmod_inline, jsc.toJSHostCall, .{globalObject, @src(), ${typeName}.${getter}, .{globalObject, ${thisValue ? "thisValue," : ""} propertyName}}); }, else => { - return @call(.always_inline, ${typeName}.${getter}, .{globalObject, ${thisValue ? "thisValue," : ""} propertyName}); + return @call(bun.callmod_inline, ${typeName}.${getter}, .{globalObject, ${thisValue ? "thisValue," : ""} propertyName}); }, }; } @@ -2316,7 +2316,7 @@ const JavaScriptCoreBindings = struct { output += ` pub fn ${names.setter}(globalObject: *jsc.JSGlobalObject, thisValue: jsc.JSValue, target: jsc.JSValue) callconv(jsc.conv) bool { if (comptime Environment.enable_logs) log_zig_class_setter("${typeName}", "${name}", target); - return @call(.always_inline, ${typeName}.${setter || accessor.setter}, .{thisValue, globalObject, target}); + return @call(bun.callmod_inline, ${typeName}.${setter || accessor.setter}, .{thisValue, globalObject, target}); } `; } @@ -2330,7 +2330,7 @@ const JavaScriptCoreBindings = struct { .map(ZigDOMJITArgTypeDefinition) .join(", ")}) callconv(jsc.conv) jsc.JSValue { if (comptime Environment.enable_logs) log_zig_class_domjit("${typeName}", "${name}"); - return @call(.always_inline, ${typeName}.${DOMJITName(fn)}, .{thisValue, globalObject, ${args.map((_, i) => `arg${i}`).join(", ")}}); + return @call(bun.callmod_inline, ${typeName}.${DOMJITName(fn)}, .{thisValue, globalObject, ${args.map((_, i) => `arg${i}`).join(", ")}}); } `; } @@ -2338,7 +2338,7 @@ const JavaScriptCoreBindings = struct { output += ` pub fn ${names.fn}(globalObject: *jsc.JSGlobalObject, callFrame: *jsc.CallFrame) callconv(jsc.conv) jsc.JSValue { if (comptime Environment.enable_logs) log_zig_class_method("${typeName}", "${name}", callFrame); - return @call(.always_inline, jsc.toJSHostFn(${typeName}.${fn}), .{globalObject, callFrame}); + return @call(bun.callmod_inline, jsc.toJSHostFn(${typeName}.${fn}), .{globalObject, callFrame}); } `; } @@ -2350,7 +2350,7 @@ const JavaScriptCoreBindings = struct { output += ` pub fn ${symbolName(typeName, "onStructuredCloneSerialize")}(thisValue: *${typeName}, globalObject: *jsc.JSGlobalObject, ctx: *anyopaque, writeBytes: WriteBytesFn) callconv(jsc.conv) void { if (comptime Environment.enable_logs) log_zig_structured_clone_serialize("${typeName}"); - @call(.always_inline, ${typeName}.onStructuredCloneSerialize, .{thisValue, globalObject, ctx, writeBytes}); + @call(bun.callmod_inline, ${typeName}.onStructuredCloneSerialize, .{thisValue, globalObject, ctx, writeBytes}); } `; @@ -2359,7 +2359,7 @@ const JavaScriptCoreBindings = struct { output += ` pub fn ${exports.get("structuredClone_transferable")}(thisValue: *${typeName}, globalObject: *jsc.JSGlobalObject, ctx: *anyopaque, write: WriteBytesFn) callconv(jsc.conv) void { if (comptime Environment.enable_logs) log_zig_structured_clone_transfer("${typeName}"); - @call(.always_inline, ${typeName}.onStructuredCloneTransfer, .{thisValue, globalObject, ctx, write}); + @call(bun.callmod_inline, ${typeName}.onStructuredCloneTransfer, .{thisValue, globalObject, ctx, write}); } `; } @@ -2369,7 +2369,7 @@ const JavaScriptCoreBindings = struct { output += ` pub fn ${symbolName(typeName, "onStructuredCloneDeserialize")}(globalObject: *jsc.JSGlobalObject, ptr: *[*]u8, end: [*]u8) callconv(jsc.conv) jsc.JSValue { if (comptime Environment.enable_logs) log_zig_structured_clone_deserialize("${typeName}"); - return @call(.always_inline, jsc.toJSHostCall, .{ globalObject, @src(), ${typeName}.onStructuredCloneDeserialize, .{globalObject, ptr, end} }); + return @call(bun.callmod_inline, jsc.toJSHostCall, .{ globalObject, @src(), ${typeName}.onStructuredCloneDeserialize, .{globalObject, ptr, end} }); } `; } else { diff --git a/src/codegen/generate-js2native.ts b/src/codegen/generate-js2native.ts index f8f8e82449..7c40ef1d7a 100644 --- a/src/codegen/generate-js2native.ts +++ b/src/codegen/generate-js2native.ts @@ -228,7 +228,7 @@ export function getJS2NativeZig(gs2NativeZigPath: string) { filename: x.filename, })}(global: *jsc.JSGlobalObject, call_frame: *jsc.CallFrame) callconv(jsc.conv) jsc.JSValue {`, ` const function = @import(${JSON.stringify(path.relative(path.dirname(gs2NativeZigPath), x.filename))});`, - ` return @call(.always_inline, jsc.toJSHostFn(function.${x.symbol_target}), .{global, call_frame});`, + ` return @call(bun.callmod_inline, jsc.toJSHostFn(function.${x.symbol_target}), .{global, call_frame});`, "}", ]), "comptime {", diff --git a/src/deps/uws/App.zig b/src/deps/uws/App.zig index 6e7e496cb4..2b0236e51c 100644 --- a/src/deps/uws/App.zig +++ b/src/deps/uws/App.zig @@ -85,7 +85,7 @@ pub fn NewApp(comptime ssl: bool) type { pub fn handle(res: *uws.uws_res, req: *Request, user_data: ?*anyopaque) callconv(.c) void { if (comptime UserDataType == void) { return @call( - .always_inline, + bun.callmod_inline, handler, .{ {}, @@ -95,7 +95,7 @@ pub fn NewApp(comptime ssl: bool) type { ); } else { return @call( - .always_inline, + bun.callmod_inline, handler, .{ @as(UserDataType, @ptrCast(@alignCast(user_data.?))), diff --git a/src/deps/uws/Response.zig b/src/deps/uws/Response.zig index dee0976a9b..0a1ce7f901 100644 --- a/src/deps/uws/Response.zig +++ b/src/deps/uws/Response.zig @@ -264,7 +264,7 @@ pub fn NewResponse(ssl_flag: i32) type { const Args = *@TypeOf(args_tuple); pub fn handle(user_data: ?*anyopaque) callconv(.c) void { const args: Args = @ptrCast(@alignCast(user_data.?)); - @call(.always_inline, handler_fn, args.*); + @call(bun.callmod_inline, handler_fn, args.*); } }; @@ -436,7 +436,7 @@ pub const AnyResponse = union(enum) { switch (this) { inline .SSL, .TCP => |resp, ssl| resp.onData(UserDataType, struct { pub fn onDataCallback(user_data: UserDataType, _: *uws.NewApp(ssl == .SSL).Response, data: []const u8, last: bool) void { - @call(.always_inline, handler, .{ user_data, data, last }); + @call(bun.callmod_inline, handler, .{ user_data, data, last }); } }.onDataCallback, optional_data), } diff --git a/src/js_printer.zig b/src/js_printer.zig index 284fe0f80f..c1733e4606 100644 --- a/src/js_printer.zig +++ b/src/js_printer.zig @@ -831,14 +831,14 @@ fn NewPrinter( fn fmt(p: *Printer, comptime str: string, args: anytype) !void { const len = @call( - .always_inline, + bun.callmod_inline, std.fmt.count, .{ str, args }, ); var ptr = try p.writer.reserve(len); const written = @call( - .always_inline, + bun.callmod_inline, std.fmt.bufPrint, .{ ptr[0..len], str, args }, ) catch unreachable; diff --git a/src/router.zig b/src/router.zig index 2bea8ac7a6..875d7da9be 100644 --- a/src/router.zig +++ b/src/router.zig @@ -601,7 +601,7 @@ pub const Route = struct { .eq => switch (a.kind) { // static + dynamic are sorted alphabetically .static, .dynamic => @call( - .always_inline, + bun.callmod_inline, sortByNameString, .{ ctx, @@ -612,7 +612,7 @@ pub const Route = struct { // catch all and optional catch all must appear below dynamic .catch_all, .optional_catch_all => switch (std.math.order(a.param_count, b.param_count)) { .eq => @call( - .always_inline, + bun.callmod_inline, sortByNameString, .{ ctx, diff --git a/src/string/immutable/unicode.zig b/src/string/immutable/unicode.zig index 865f7be7df..6e704a6098 100644 --- a/src/string/immutable/unicode.zig +++ b/src/string/immutable/unicode.zig @@ -1885,15 +1885,7 @@ pub fn encodeUTF8Comptime(comptime cp: u32) []const u8 { // This is a clone of golang's "utf8.EncodeRune" that has been modified to encode using // WTF-8 instead. See https://simonsapin.github.io/wtf-8/ for more info. pub fn encodeWTF8Rune(p: *[4]u8, r: i32) u3_fast { - return @call( - .always_inline, - encodeWTF8RuneT, - .{ - p, - u32, - @as(u32, @intCast(r)), - }, - ); + return encodeWTF8RuneT(p, u32, @intCast(r)); } pub fn encodeWTF8RuneT(p: *[4]u8, comptime R: type, r: R) u3_fast {