X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fcompiler-test-util.lisp;h=352db70625909a192a53ca3c4ebb383345ddd47e;hb=31f68584d0732dc0d17f379773e5f87f1e5a78ad;hp=f05e3fae7cc6882e9786a9a93b621c8542186c2e;hpb=f4136bbceaf150420789b6e803a5acdbb136a08d;p=sbcl.git diff --git a/tests/compiler-test-util.lisp b/tests/compiler-test-util.lisp index f05e3fa..352db70 100644 --- a/tests/compiler-test-util.lisp +++ b/tests/compiler-test-util.lisp @@ -17,14 +17,16 @@ (:export #:assert-consing #:assert-no-consing #:compiler-derived-type + #:count-full-calls #:find-value-cell-values #:find-code-constants - #:find-named-callees)) + #:find-named-callees + #:file-compile)) (cl:in-package :ctu) (unless (fboundp 'compiler-derived-type) - (defknown compiler-derived-type (t) (values t t) (movable flushable unsafe)) + (defknown compiler-derived-type (t) (values t t) (flushable)) (deftransform compiler-derived-type ((x) * * :node node) (sb-c::delay-ir1-transform node :optimize) `(values ',(type-specifier (sb-c::lvar-type x)) t)) @@ -92,3 +94,33 @@ (defmacro assert-consing (form &optional (times '+times+)) `(check-consing t ',form (lambda () ,form) ,times)) + +(defun file-compile (toplevel-forms &key load) + (let* ((lisp (merge-pathnames "file-compile-tmp.lisp")) + (fasl (compile-file-pathname lisp))) + (unwind-protect + (progn + (with-open-file (f lisp :direction :output) + (if (stringp toplevel-forms) + (write-line toplevel-forms f) + (dolist (form toplevel-forms) + (prin1 form f)))) + (multiple-value-bind (fasl warn fail) (compile-file lisp) + (when load + (load fasl)) + (values warn fail))) + (ignore-errors (delete-file lisp)) + (ignore-errors (delete-file fasl))))) + +;; Pretty horrible, but does the job +(defun count-full-calls (name function) + (let ((code (with-output-to-string (s) + (disassemble function :stream s))) + (n 0)) + (with-input-from-string (s code) + (loop for line = (read-line s nil nil) + while line + when (and (search name line) + (search "#