static void _created(voidp ctx, Z3_solver_callback cb, Z3_ast a) { var prop = (UserPropagator)GCHandle.FromIntPtr(ctx).Target; using var t = Expr.Create(prop.ctx, a); prop.Callback(() => prop.created_eh(t), cb); }
static void _diseq(voidp ctx, Z3_solver_callback cb, Z3_ast a, Z3_ast b) { var prop = (UserPropagator)GCHandle.FromIntPtr(ctx).Target; using var s = Expr.Create(prop.ctx, a); using var t = Expr.Create(prop.ctx, b); prop.Callback(() => prop.diseq_eh(s, t), cb); }
static void _fixed(voidp ctx, Z3_solver_callback cb, Z3_ast _term, Z3_ast _value) { var prop = (UserPropagator)GCHandle.FromIntPtr(ctx).Target; using var term = Expr.Create(prop.ctx, _term); using var value = Expr.Create(prop.ctx, _value); prop.Callback(() => prop.fixed_eh(term, value), cb); }
static void _decide(voidp ctx, Z3_solver_callback cb, ref Z3_ast a, ref uint idx, ref int phase) { var prop = (UserPropagator)GCHandle.FromIntPtr(ctx).Target; var t = Expr.Create(prop.ctx, a); var u = t; prop.callback = cb; prop.decide_eh(ref t, ref idx, ref phase); prop.callback = IntPtr.Zero; if (u != t) { a = t.NativeObject; } }
void Callback(Action fn, Z3_solver_callback cb) { this.callback = cb; try { fn(); } catch { // TBD: add debug log or exception handler } finally { this.callback = IntPtr.Zero; } }
static void _final(voidp ctx, Z3_solver_callback cb) { var prop = (UserPropagator)GCHandle.FromIntPtr(ctx).Target; prop.Callback(() => prop.final_eh(), cb); }
static void _pop(voidp ctx, Z3_solver_callback cb, uint num_scopes) { var prop = (UserPropagator)GCHandle.FromIntPtr(ctx).Target; prop.Callback(() => prop.Pop(num_scopes), cb); }