Debugging helper functions #
Equations
- dbgTraceVal a = dbgTrace (toString a) fun (x : Unit) => a
Instances For
Print stack trace to stderr before evaluating given closure. Currently supported on Linux only.
Equations
- dbgStackTrace f = f ()
Instances For
Equations
- panicWithPos modName line col msg = panic (mkPanicMessage modName line col msg)
Instances For
Equations
- panicWithPosWithDecl modName declName line col msg = panic (mkPanicMessageWithDecl modName declName line col msg)
Instances For
Returns the address at which an object is allocated.
This function is unsafe because it can distinguish between definitionally equal values.
Returns true if a is an exclusive object.
An object is exclusive if it is single-threaded and its reference counter is 1. This function is unsafe because it can distinguish between definitionally equal values.
Equations
- withPtrAddrUnsafe a k h = k (ptrAddrUnsafe a)
Instances For
Compares two objects for pointer equality.
Two objects are pointer-equal if, at runtime, they are allocated at exactly the same address. This function is unsafe because it can distinguish between definitionally equal values.
Equations
- ptrEq a b = (ptrAddrUnsafe a == ptrAddrUnsafe b)
Instances For
Compares two lists of objects for element-wise pointer equality. Returns true if both lists are
the same length and the objects at the corresponding indices of each list are pointer-equal.
Two objects are pointer-equal if, at runtime, they are allocated at exactly the same address. This function is unsafe because it can distinguish between definitionally equal values.
Equations
Instances For
Returns true if a and b are represented by the same pointer at runtime, or k () otherwise.
If k is a function that performs an equality check on a and b, then this operation can be
used to short-circuit the equality check for pointer-equal input.
This cannot be wrapped into a safe operation with logical value k () because that would be
unsound if α includes computationally irrelevant data like types. Consider the example
α := Prop, a := True, b := False, k := fun _ => false. In this case, a = b → k () = true
is true, but a and b have the same runtime representation of an erased type, so ptrEq a b is
true and this function returns true, even though k () is false.
Users who require a safe version of this function whose logical model is equal to k () must
manually check that for their type pointer-equality implies logical equality and then create a
specialized version of this function using implemented_by:
namespace MyType
@[inline]
unsafe def withPtrEqUnsafe (a b : MyType) (k : Unit → Bool) (h : a = b → k () = true) : Bool :=
_root_.withPtrEqUnsafe a b k h
-- Safety: `MyType` contains no non-subsingleton erased data
@[implemented_by withPtrEqUnsafe]
def withPtrEq (a b : MyType) (k : Unit → Bool) (_h : a = b → k () = true) : Bool :=
k ()
end MyType
Instances For
Build a DecidableEq instance that short-circuits using withPtrEq where possible.
Since the general-purpose withPtrEqUnsafe is unsafe, users need to provide their own withPtrEq
function; see the comment on withPtrEqUnsafe.
Equations
- withPtrEqDecEq withPtrEq hw a b k = { decide := withPtrEq a b (fun (x : Unit) => toBoolUsing (k ())) ⋯, reflects_decide := ⋯ }
Instances For
Equations
- withPtrAddr a k h = k 0