X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fcompiler-test-util.lisp;h=f05e3fae7cc6882e9786a9a93b621c8542186c2e;hb=f16e93459cd73b1884e3d576c95e422f8e8a000e;hp=1ed4fa6d6af3e2eac531c8320f949fcdb456fc7e;hpb=485944b1d04b8f3381a04bc6291bc2e667442e45;p=sbcl.git diff --git a/tests/compiler-test-util.lisp b/tests/compiler-test-util.lisp index 1ed4fa6..f05e3fa 100644 --- a/tests/compiler-test-util.lisp +++ b/tests/compiler-test-util.lisp @@ -14,8 +14,11 @@ (defpackage :compiler-test-util (:nicknames :ctu) (:use :cl :sb-c :sb-kernel) - (:export #:compiler-derived-type + (:export #:assert-consing + #:assert-no-consing + #:compiler-derived-type #:find-value-cell-values + #:find-code-constants #:find-named-callees)) (cl:in-package :ctu) @@ -46,3 +49,46 @@ (or (not namep) (equal name (sb-impl::fdefn-name c)))))) collect (sb-impl::fdefn-fun c)))) + +(defun find-code-constants (fun &key (type t)) + (let ((code (sb-kernel:fun-code-header (sb-kernel:%fun-fun fun)))) + (loop for i from sb-vm::code-constants-offset below (sb-kernel:get-header-data code) + for c = (sb-kernel:code-header-ref code i) + when (typep c type) + collect c))) + +(defun collect-consing-stats (thunk times) + (declare (type function thunk)) + (declare (type fixnum times)) + (let ((before (sb-ext:get-bytes-consed))) + (dotimes (i times) + (funcall thunk)) + (values before (sb-ext:get-bytes-consed)))) + +(defun check-consing (yes/no form thunk times) + (multiple-value-bind (before after) + (collect-consing-stats thunk times) + (let ((consed-bytes (- after before))) + (assert (funcall (if yes/no #'not #'identity) + ;; I do not know why we do this comparasion, + ;; the original code did, so I let it + ;; in. Perhaps to prevent losage on GC + ;; fluctuations, or something. --TCR. + (< consed-bytes times)) + () + "~@" + form yes/no times consed-bytes + (zerop consed-bytes) (float (/ consed-bytes times)))) + (values before after))) + +(defparameter +times+ 10000) + +(defmacro assert-no-consing (form &optional (times '+times+)) + `(check-consing nil ',form (lambda () ,form) ,times)) + +(defmacro assert-consing (form &optional (times '+times+)) + `(check-consing t ',form (lambda () ,form) ,times))