From a97c69c58226a1847ff1ad65e8f92d1341a69845 Mon Sep 17 00:00:00 2001 From: clockwork-labs-bot Date: Mon, 13 Apr 2026 18:32:21 -0400 Subject: [PATCH 1/4] feat: Improve module backtraces for C# and C++ bindings Mirror the backtrace improvements from PR #577 (Rust/TS) to the C# and C++ module bindings so that stack traces captured by the host show actual reducer/procedure/view function names instead of anonymous wrappers. C# changes: - Add [MethodImpl(NoInlining)] to all generated Invoke() methods in reducer, procedure, and view dispatcher classes. This prevents the JIT/AOT from inlining these frames away, ensuring they appear as named WASM functions in wasmtime-captured backtraces. - Add Log.Error() in the reducer error handler for consistency with procedures and views, which already log full exceptions. C++ changes: - Add __attribute__((noinline)) to user function definitions in all macro variants: SPACETIMEDB_REDUCER, SPACETIMEDB_REDUCER_NAMED, SPACETIMEDB_INIT, SPACETIMEDB_CLIENT_CONNECTED, SPACETIMEDB_CLIENT_DISCONNECTED, SPACETIMEDB_VIEW, SPACETIMEDB_VIEW_NAMED, SPACETIMEDB_PROCEDURE, and SPACETIMEDB_PROCEDURE_NAMED. This ensures the actual user function name appears as a distinct frame in WASM backtraces rather than being optimized into the surrounding lambda wrappers. Co-Authored-By: Claude Opus 4.6 --- .../include/spacetimedb/procedure_macros.h | 5 +- .../include/spacetimedb/reducer_macros.h | 11 ++-- .../include/spacetimedb/view_macros.h | 5 +- .../diag/snapshots/Module#FFI.verified.cs | 60 +++++++++++++++++++ .../snapshots/Module#FFI.verified.cs | 9 +++ .../server/snapshots/Module#FFI.verified.cs | 27 +++++++++ crates/bindings-csharp/Codegen/Module.cs | 3 + .../Runtime/Internal/Module.cs | 1 + 8 files changed, 112 insertions(+), 9 deletions(-) diff --git a/crates/bindings-cpp/include/spacetimedb/procedure_macros.h b/crates/bindings-cpp/include/spacetimedb/procedure_macros.h index 5c6728a9f5f..4ec02222f90 100644 --- a/crates/bindings-cpp/include/spacetimedb/procedure_macros.h +++ b/crates/bindings-cpp/include/spacetimedb/procedure_macros.h @@ -105,7 +105,8 @@ struct is_valid_procedure_return_type : std::integral_constant::value, \ @@ -120,4 +121,4 @@ struct is_valid_procedure_return_type : std::integral_constant> \ /* TODO: When parameters are supported, function definition becomes: */ \ /* return_type view_name(ctx_param, __VA_ARGS__) */ \ - return_type view_name(ctx_param) + /* noinline ensures this function appears as a named frame in backtraces */ \ + __attribute__((noinline)) return_type view_name(ctx_param) #define SPACETIMEDB_VIEW_NAMED(return_type, view_name, canonical_name, access_enum, ctx_param) \ static_assert(access_enum == SpacetimeDB::Internal::TableAccess::Public, \ @@ -130,4 +131,4 @@ struct is_valid_view_return_type> #view_name, view_name, is_public, param_names); \ SpacetimeDB::Module::RegisterExplicitFunctionName(#view_name, canonical_name); \ } \ - return_type view_name(ctx_param) + __attribute__((noinline)) return_type view_name(ctx_param) diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs index 3ce055b4bc7..64dc1675dc1 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs @@ -2050,6 +2050,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar >().GetAlgebraicType(registrar) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -2100,6 +2103,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -2144,6 +2150,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -2186,6 +2195,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -2228,6 +2240,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -2268,6 +2283,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ReturnType: new Player.BSATN().GetAlgebraicType(registrar) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -2309,6 +2327,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -2354,6 +2375,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -2399,6 +2423,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx @@ -2444,6 +2471,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx @@ -2489,6 +2519,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx @@ -2536,6 +2569,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar >().GetAlgebraicType(registrar) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx @@ -2981,6 +3017,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.__ReducerWithReservedPrefix((SpacetimeDB.ReducerContext)ctx); @@ -3004,6 +3043,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { TestScheduleIssues.DummyScheduledReducer( @@ -3028,6 +3070,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.OnReducerWithReservedPrefix((SpacetimeDB.ReducerContext)ctx); @@ -3049,6 +3094,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => SpacetimeDB.Internal.Lifecycle.Init; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestDuplicateReducerKind1((SpacetimeDB.ReducerContext)ctx); @@ -3070,6 +3118,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => SpacetimeDB.Internal.Lifecycle.Init; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestDuplicateReducerKind2((SpacetimeDB.ReducerContext)ctx); @@ -3091,6 +3142,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestDuplicateReducerName((SpacetimeDB.ReducerContext)ctx); @@ -3112,6 +3166,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestReducerReturnType((SpacetimeDB.ReducerContext)ctx); @@ -3133,6 +3190,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { throw new System.InvalidOperationException(); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs index a9774bfc69e..936f934fd53 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs @@ -367,6 +367,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -477,6 +480,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.DemoReducer((SpacetimeDB.ReducerContext)ctx, valueRW.Read(reader)); @@ -495,6 +501,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar Visibility: SpacetimeDB.Internal.FunctionVisibility.ClientCallable ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) { Reducers.DemoProcedure((SpacetimeDB.ProcedureContext)ctx); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs index 4632875e05f..dc77525a2ac 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs @@ -1722,6 +1722,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -1764,6 +1767,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar >().GetAlgebraicType(registrar) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx @@ -1811,6 +1817,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar >().GetAlgebraicType(registrar) ); + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public byte[] Invoke( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx @@ -2286,6 +2295,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => SpacetimeDB.Internal.Lifecycle.Init; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Timers.Init((SpacetimeDB.ReducerContext)ctx); @@ -2309,6 +2321,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.InsertData((SpacetimeDB.ReducerContext)ctx, dataRW.Read(reader)); @@ -2332,6 +2347,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Test.NestingNamespaces.AndClasses.InsertData2( @@ -2358,6 +2376,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { MultiTableRow.InsertMultiData((SpacetimeDB.ReducerContext)ctx, dataRW.Read(reader)); @@ -2381,6 +2402,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.ScheduleImmediate((SpacetimeDB.ReducerContext)ctx, dataRW.Read(reader)); @@ -2404,6 +2428,9 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.NoInlining + )] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Timers.SendScheduledMessage((SpacetimeDB.ReducerContext)ctx, argRW.Read(reader)); diff --git a/crates/bindings-csharp/Codegen/Module.cs b/crates/bindings-csharp/Codegen/Module.cs index e778b6d69cc..fb7b1b77975 100644 --- a/crates/bindings-csharp/Codegen/Module.cs +++ b/crates/bindings-csharp/Codegen/Module.cs @@ -1386,6 +1386,7 @@ sealed class {{{Name}}}ViewDispatcher : {{{interfaceName}}} { public SpacetimeDB.Internal.RawViewDefV10 {{{makeViewDefMethod}}}(SpacetimeDB.BSATN.ITypeRegistrar registrar) => {{{GenerateViewDef(index)}}} + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] public byte[] Invoke( System.IO.BinaryReader reader, {{{interfaceContext}}} ctx @@ -1491,6 +1492,7 @@ class {{Identifier}}: SpacetimeDB.Internal.IReducer { _ => "null" }}}; + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { {{invocation}}; } @@ -1713,6 +1715,7 @@ class {{{Identifier}}} : SpacetimeDB.Internal.IProcedure { Visibility: SpacetimeDB.Internal.FunctionVisibility.ClientCallable ); + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] public byte[] Invoke(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) { {{{paramReads}}}{{{invokeBody}}} } diff --git a/crates/bindings-csharp/Runtime/Internal/Module.cs b/crates/bindings-csharp/Runtime/Internal/Module.cs index 8dcf6cebb4e..145179829c1 100644 --- a/crates/bindings-csharp/Runtime/Internal/Module.cs +++ b/crates/bindings-csharp/Runtime/Internal/Module.cs @@ -469,6 +469,7 @@ BytesSink error } catch (Exception e) { + Log.Error($"Error while invoking reducer: {e}"); var error_str = e.Message ?? e.GetType().FullName; var error_bytes = System.Text.Encoding.UTF8.GetBytes(error_str); error.Write(error_bytes); From 680e8c8dd3d3d21421e1601bfbef46c2c2b77e0e Mon Sep 17 00:00:00 2001 From: clockwork-labs-bot Date: Mon, 13 Apr 2026 19:44:19 -0400 Subject: [PATCH 2/4] refactor: generalize short-backtrace markers --- crates/bindings/src/rt.rs | 10 +++++----- crates/core/src/host/wasmtime/wasm_instance_env.rs | 10 ++++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/crates/bindings/src/rt.rs b/crates/bindings/src/rt.rs index f64b46f7ec4..08330070887 100644 --- a/crates/bindings/src/rt.rs +++ b/crates/bindings/src/rt.rs @@ -628,7 +628,7 @@ macro_rules! impl_reducer_procedure_view { #[inline(always)] fn invoke(&self, ctx: &ReducerContext, args: ($($T,)*)) -> Result<(), Box> { let ($($T,)*) = args; - __rust_begin_short_backtrace(|| self(ctx, $($T),*).into_result()) + __spacetimedb_begin_short_backtrace(|| self(ctx, $($T),*).into_result()) } } @@ -642,7 +642,7 @@ macro_rules! impl_reducer_procedure_view { #[inline(always)] fn invoke(&self, ctx: &mut ProcedureContext, args: ($($T,)*)) -> Ret { let ($($T,)*) = args; - __rust_begin_short_backtrace(|| self(ctx, $($T),*)) + __spacetimedb_begin_short_backtrace(|| self(ctx, $($T),*)) } } @@ -658,7 +658,7 @@ macro_rules! impl_reducer_procedure_view { #[inline(always)] fn invoke(&self, ctx: &ViewContext, args: ($($T,)*)) -> Retn { let ($($T,)*) = args; - __rust_begin_short_backtrace(|| self(ctx, $($T),*)) + __spacetimedb_begin_short_backtrace(|| self(ctx, $($T),*)) } } @@ -674,7 +674,7 @@ macro_rules! impl_reducer_procedure_view { #[inline(always)] fn invoke(&self, ctx: &AnonymousViewContext, args: ($($T,)*)) -> Retn { let ($($T,)*) = args; - __rust_begin_short_backtrace(|| self(ctx, $($T),*)) + __spacetimedb_begin_short_backtrace(|| self(ctx, $($T),*)) } } }; @@ -1339,7 +1339,7 @@ pub trait ExplicitNames { // Used to tidy up the backtrace in `crates/core/src/host/wasmtime/wasmtime_instance_env.rs` #[inline(never)] -pub(crate) fn __rust_begin_short_backtrace(f: F) -> T +pub(crate) fn __spacetimedb_begin_short_backtrace(f: F) -> T where F: FnOnce() -> T, { diff --git a/crates/core/src/host/wasmtime/wasm_instance_env.rs b/crates/core/src/host/wasmtime/wasm_instance_env.rs index 00f42f34ae8..c05a11cba69 100644 --- a/crates/core/src/host/wasmtime/wasm_instance_env.rs +++ b/crates/core/src/host/wasmtime/wasm_instance_env.rs @@ -1980,8 +1980,14 @@ impl BacktraceProvider for wasmtime::StoreContext<'_, T> { impl ModuleBacktrace for wasmtime::WasmBacktrace { fn frames(&self) -> Box> + '_> { - let is_end_short_backtrace = |func_name: &str| func_name.contains("__rust_end_short_backtrace"); - let is_begin_short_backtrace = |func_name: &str| func_name.contains("__rust_begin_short_backtrace"); + let is_end_short_backtrace = |func_name: &str| { + func_name.contains("__spacetimedb_end_short_backtrace") + || func_name.contains("__rust_end_short_backtrace") + }; + let is_begin_short_backtrace = |func_name: &str| { + func_name.contains("__spacetimedb_begin_short_backtrace") + || func_name.contains("__rust_begin_short_backtrace") + }; let frames = self.frames(); From 0440976270d5a85b0cb761623415aba9a239757c Mon Sep 17 00:00:00 2001 From: clockwork-labs-bot Date: Mon, 13 Apr 2026 19:44:39 -0400 Subject: [PATCH 3/4] feat: add short-backtrace markers for C# and C++ --- .../internal/runtime_registration.h | 15 +++ .../spacetimedb/internal/v10_builder.h | 36 +++-- .../diag/snapshots/Module#FFI.verified.cs | 124 +++++++++++++++--- .../snapshots/Module#FFI.verified.cs | 17 ++- .../server/snapshots/Module#FFI.verified.cs | 51 +++++-- crates/bindings-csharp/Codegen/Module.cs | 17 ++- 6 files changed, 215 insertions(+), 45 deletions(-) diff --git a/crates/bindings-cpp/include/spacetimedb/internal/runtime_registration.h b/crates/bindings-cpp/include/spacetimedb/internal/runtime_registration.h index 4d84cb975d4..66d827616ff 100644 --- a/crates/bindings-cpp/include/spacetimedb/internal/runtime_registration.h +++ b/crates/bindings-cpp/include/spacetimedb/internal/runtime_registration.h @@ -1,9 +1,12 @@ #ifndef SPACETIMEDB_RUNTIME_REGISTRATION_H #define SPACETIMEDB_RUNTIME_REGISTRATION_H +#include #include #include #include +#include +#include #include #include "../abi/opaque_types.h" #include "autogen/Lifecycle.g.h" @@ -33,6 +36,18 @@ std::vector ConsumeBytes(BytesSource source); void SetMultiplePrimaryKeyError(const std::string& table_name); void SetConstraintRegistrationError(const std::string& code, const std::string& details); +template +__attribute__((noinline)) decltype(auto) __spacetimedb_begin_short_backtrace(F&& f) { + if constexpr (std::is_void_v>) { + std::forward(f)(); + std::atomic_signal_fence(std::memory_order_seq_cst); + } else { + decltype(auto) result = std::forward(f)(); + std::atomic_signal_fence(std::memory_order_seq_cst); + return result; + } +} + } // namespace Internal } // namespace SpacetimeDB diff --git a/crates/bindings-cpp/include/spacetimedb/internal/v10_builder.h b/crates/bindings-cpp/include/spacetimedb/internal/v10_builder.h index 9de0f0a2312..7cbecc097e7 100644 --- a/crates/bindings-cpp/include/spacetimedb/internal/v10_builder.h +++ b/crates/bindings-cpp/include/spacetimedb/internal/v10_builder.h @@ -337,7 +337,9 @@ class V10Builder { std::function handler; if constexpr (traits::arity == 1) { handler = [func](ReducerContext& ctx, BytesSource) { - auto result = func(ctx); + auto result = __spacetimedb_begin_short_backtrace([&] { + return func(ctx); + }); if (result.is_err()) { ::SpacetimeDB::fail_reducer(result.error()); } @@ -349,7 +351,9 @@ class V10Builder { bsatn::Reader reader(bytes.data(), bytes.size()); auto args = std::make_tuple(bsatn::deserialize>(reader)...); std::apply([&ctx_inner, fn](auto&&... unpacked) { - auto result = fn(ctx_inner, std::forward(unpacked)...); + auto result = __spacetimedb_begin_short_backtrace([&] { + return fn(ctx_inner, std::forward(unpacked)...); + }); if (result.is_err()) { ::SpacetimeDB::fail_reducer(result.error()); } @@ -406,7 +410,9 @@ class V10Builder { std::function handler; if constexpr (traits::arity == 1) { handler = [func](ReducerContext& ctx, BytesSource) { - auto result = func(ctx); + auto result = __spacetimedb_begin_short_backtrace([&] { + return func(ctx); + }); if (result.is_err()) { ::SpacetimeDB::fail_reducer(result.error()); } @@ -418,7 +424,9 @@ class V10Builder { bsatn::Reader reader(bytes.data(), bytes.size()); auto args = std::make_tuple(bsatn::deserialize>(reader)...); std::apply([&ctx_inner, fn](auto&&... unpacked) { - auto result = fn(ctx_inner, std::forward(unpacked)...); + auto result = __spacetimedb_begin_short_backtrace([&] { + return fn(ctx_inner, std::forward(unpacked)...); + }); if (result.is_err()) { ::SpacetimeDB::fail_reducer(result.error()); } @@ -461,7 +469,9 @@ class V10Builder { std::function(ViewContext&, BytesSource)> handler = [func](ViewContext& ctx, BytesSource args_source) -> std::vector { (void)args_source; - auto result = func(ctx); + auto result = __spacetimedb_begin_short_backtrace([&] { + return func(ctx); + }); auto result_vec = view_result_to_vec(std::move(result)); IterBuf buf = IterBuf::take(); { @@ -475,7 +485,9 @@ class V10Builder { std::function(AnonymousViewContext&, BytesSource)> handler = [func](AnonymousViewContext& ctx, BytesSource args_source) -> std::vector { (void)args_source; - auto result = func(ctx); + auto result = __spacetimedb_begin_short_backtrace([&] { + return func(ctx); + }); auto result_vec = view_result_to_vec(std::move(result)); IterBuf buf = IterBuf::take(); { @@ -525,7 +537,9 @@ class V10Builder { std::function(ProcedureContext&, BytesSource)> handler; if constexpr (traits::arity == 1) { handler = [func](ProcedureContext& ctx, BytesSource) -> std::vector { - auto result = func(ctx); + auto result = __spacetimedb_begin_short_backtrace([&] { + return func(ctx); + }); IterBuf buf = IterBuf::take(); { bsatn::Writer writer(buf.get()); @@ -539,9 +553,11 @@ class V10Builder { return [](std::index_sequence, Func fn, ProcedureContext& ctx_inner, const std::vector& bytes) -> std::vector { bsatn::Reader reader(bytes.data(), bytes.size()); auto args = std::make_tuple(bsatn::deserialize>(reader)...); - auto result = std::apply([&ctx_inner, fn](auto&&... unpacked) { - return fn(ctx_inner, std::forward(unpacked)...); - }, args); + auto result = __spacetimedb_begin_short_backtrace([&] { + return std::apply([&ctx_inner, fn](auto&&... unpacked) { + return fn(ctx_inner, std::forward(unpacked)...); + }, args); + }); IterBuf buf = IterBuf::take(); { bsatn::Writer writer(buf.get()); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs index 64dc1675dc1..2cbe19e808c 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs @@ -2050,10 +2050,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar >().GetAlgebraicType(registrar) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -2103,10 +2108,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -2150,10 +2160,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -2195,10 +2210,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -2240,10 +2260,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -2283,10 +2308,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ReturnType: new Player.BSATN().GetAlgebraicType(registrar) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -2327,10 +2357,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -2375,10 +2410,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -2423,10 +2463,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IAnonymousViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx ) @@ -2471,10 +2516,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IAnonymousViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx ) @@ -2519,10 +2569,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IAnonymousViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx ) @@ -2569,10 +2624,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar >().GetAlgebraicType(registrar) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IAnonymousViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx ) @@ -3017,10 +3077,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.__ReducerWithReservedPrefix((SpacetimeDB.ReducerContext)ctx); } @@ -3043,10 +3106,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { TestScheduleIssues.DummyScheduledReducer( (SpacetimeDB.ReducerContext)ctx, @@ -3070,10 +3136,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.OnReducerWithReservedPrefix((SpacetimeDB.ReducerContext)ctx); } @@ -3094,10 +3163,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => SpacetimeDB.Internal.Lifecycle.Init; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestDuplicateReducerKind1((SpacetimeDB.ReducerContext)ctx); } @@ -3118,10 +3190,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => SpacetimeDB.Internal.Lifecycle.Init; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestDuplicateReducerKind2((SpacetimeDB.ReducerContext)ctx); } @@ -3142,10 +3217,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestDuplicateReducerName((SpacetimeDB.ReducerContext)ctx); } @@ -3166,10 +3244,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.TestReducerReturnType((SpacetimeDB.ReducerContext)ctx); } @@ -3190,10 +3271,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { throw new System.InvalidOperationException(); } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs index 936f934fd53..3f7a744bf32 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs @@ -367,10 +367,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -480,10 +485,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.DemoReducer((SpacetimeDB.ReducerContext)ctx, valueRW.Read(reader)); } @@ -501,10 +509,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar Visibility: SpacetimeDB.Internal.FunctionVisibility.ClientCallable ); + public byte[] Invoke(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) + private static byte[] __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) { Reducers.DemoProcedure((SpacetimeDB.ProcedureContext)ctx); return System.Array.Empty(); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs index dc77525a2ac..24ab61d6a44 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs @@ -1722,10 +1722,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar ) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -1767,10 +1772,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar >().GetAlgebraicType(registrar) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IViewContext ctx ) @@ -1817,10 +1827,15 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar >().GetAlgebraicType(registrar) ); + public byte[] Invoke( + System.IO.BinaryReader reader, + global::SpacetimeDB.Internal.IAnonymousViewContext ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public byte[] Invoke( + private static byte[] __spacetimedb_begin_short_backtrace( System.IO.BinaryReader reader, global::SpacetimeDB.Internal.IAnonymousViewContext ctx ) @@ -2295,10 +2310,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => SpacetimeDB.Internal.Lifecycle.Init; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Timers.Init((SpacetimeDB.ReducerContext)ctx); } @@ -2321,10 +2339,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.InsertData((SpacetimeDB.ReducerContext)ctx, dataRW.Read(reader)); } @@ -2347,10 +2368,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Test.NestingNamespaces.AndClasses.InsertData2( (SpacetimeDB.ReducerContext)ctx, @@ -2376,10 +2400,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { MultiTableRow.InsertMultiData((SpacetimeDB.ReducerContext)ctx, dataRW.Read(reader)); } @@ -2402,10 +2429,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Reducers.ScheduleImmediate((SpacetimeDB.ReducerContext)ctx, dataRW.Read(reader)); } @@ -2428,10 +2458,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar public SpacetimeDB.Internal.Lifecycle? Lifecycle => null; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl( System.Runtime.CompilerServices.MethodImplOptions.NoInlining )] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { Timers.SendScheduledMessage((SpacetimeDB.ReducerContext)ctx, argRW.Read(reader)); } diff --git a/crates/bindings-csharp/Codegen/Module.cs b/crates/bindings-csharp/Codegen/Module.cs index fb7b1b77975..415d403e9a0 100644 --- a/crates/bindings-csharp/Codegen/Module.cs +++ b/crates/bindings-csharp/Codegen/Module.cs @@ -1386,10 +1386,15 @@ sealed class {{{Name}}}ViewDispatcher : {{{interfaceName}}} { public SpacetimeDB.Internal.RawViewDefV10 {{{makeViewDefMethod}}}(SpacetimeDB.BSATN.ITypeRegistrar registrar) => {{{GenerateViewDef(index)}}} - [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] public byte[] Invoke( System.IO.BinaryReader reader, {{{interfaceContext}}} ctx + ) => __spacetimedb_begin_short_backtrace(reader, ctx); + + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] + private static byte[] __spacetimedb_begin_short_backtrace( + System.IO.BinaryReader reader, + {{{interfaceContext}}} ctx ) { try { {{{paramReads}}} @@ -1492,8 +1497,11 @@ class {{Identifier}}: SpacetimeDB.Internal.IReducer { _ => "null" }}}; + public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - public void Invoke(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { + private static void __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IReducerContext ctx) { {{invocation}}; } } @@ -1715,8 +1723,11 @@ class {{{Identifier}}} : SpacetimeDB.Internal.IProcedure { Visibility: SpacetimeDB.Internal.FunctionVisibility.ClientCallable ); + public byte[] Invoke(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) => + __spacetimedb_begin_short_backtrace(reader, ctx); + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - public byte[] Invoke(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) { + private static byte[] __spacetimedb_begin_short_backtrace(BinaryReader reader, SpacetimeDB.Internal.IProcedureContext ctx) { {{{paramReads}}}{{{invokeBody}}} } } From 10b3348d7c088061acceb848f77aafa83e1fefd5 Mon Sep 17 00:00:00 2001 From: clockwork-labs-bot Date: Mon, 13 Apr 2026 19:53:24 -0400 Subject: [PATCH 4/4] style: format backtrace marker matchers --- crates/core/src/host/wasmtime/wasm_instance_env.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/core/src/host/wasmtime/wasm_instance_env.rs b/crates/core/src/host/wasmtime/wasm_instance_env.rs index c05a11cba69..3b1838257f2 100644 --- a/crates/core/src/host/wasmtime/wasm_instance_env.rs +++ b/crates/core/src/host/wasmtime/wasm_instance_env.rs @@ -1981,8 +1981,7 @@ impl BacktraceProvider for wasmtime::StoreContext<'_, T> { impl ModuleBacktrace for wasmtime::WasmBacktrace { fn frames(&self) -> Box> + '_> { let is_end_short_backtrace = |func_name: &str| { - func_name.contains("__spacetimedb_end_short_backtrace") - || func_name.contains("__rust_end_short_backtrace") + func_name.contains("__spacetimedb_end_short_backtrace") || func_name.contains("__rust_end_short_backtrace") }; let is_begin_short_backtrace = |func_name: &str| { func_name.contains("__spacetimedb_begin_short_backtrace")