Carp/core/Debug.carp

40 lines
1.1 KiB
Plaintext

(defmodule Debug
(defdynamic sanitize-addresses []
(add-cflag "-fsanitize=address"))
(register memory-balance (Fn [] Long))
(register reset-memory-balance! (Fn [] ()))
(register log-memory-balance! (Fn [Bool] ()))
(defmacro memory-logged [form]
(list 'do
'(Debug.log-memory-balance! true)
form
'(Debug.log-memory-balance! false)))
(defmacro assert-balanced [form]
(list 'let '[balance (Debug.memory-balance)]
(list 'do
(list 'let []
form)
'(if (= balance (Debug.memory-balance))
()
(do (IO.println &(fmt "Invalid memory balance: %d" (Debug.memory-balance)))
(System.exit 1)))
())))
(defn trace [x]
(do
(IO.println &(str &x))
x))
;; TODO: Should be a macro and provide the location of the assertion.
;; Also its output looks weird because of lack of 'prn'.
(defn assert-eq [expected got]
(if (= expected got)
()
(println* "ASSERTION FAILED! Expected " expected " but got " got)))
)