From df6b4f21d40c2172e93f6dd94b992f199a760e5f Mon Sep 17 00:00:00 2001 From: wlott <wlott> Date: Mon, 25 Nov 1991 12:09:36 +0000 Subject: [PATCH] Initial revision --- compiler/ltv.lisp | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 compiler/ltv.lisp diff --git a/compiler/ltv.lisp b/compiler/ltv.lisp new file mode 100644 index 000000000..e57d5923c --- /dev/null +++ b/compiler/ltv.lisp @@ -0,0 +1,60 @@ +;;; -*- Package: C; Log: C.Log -*- +;;; +;;; ********************************************************************** +;;; This code was written as part of the CMU Common Lisp project at +;;; Carnegie Mellon University, and has been placed in the public domain. +;;; If you want to use this code or any part of CMU Common Lisp, please contact +;;; Scott Fahlman or slisp-group@cs.cmu.edu. +;;; +(ext:file-comment + "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/ltv.lisp,v 1.1 1991/11/25 12:09:36 wlott Exp $") +;;; +;;; ********************************************************************** +;;; +;;; This file implements LOAD-TIME-VALUE. +;;; +;;; Written by William Lott +;;; +(in-package "C") + +(in-package "LISP") +(export 'load-time-value) + +(in-package "C") + +(defknown %load-time-value (t) t (flushable movable)) + +(def-ir1-translator load-time-value ((form &optional read-only-p) start cont) + "Arrange for FORM to be evaluated at load-time and use the value produced + as if it were a constant. If READ-ONLY-P is non-NIL, then the resultant + object is guaranteed to never be modified, so it can be put in read-only + storage." + (if (producing-fasl-file) + (multiple-value-bind + (handle type) + (compile-load-time-value (if read-only-p + form + `(make-value-cell ,form))) + (declare (ignore type)) + (ir1-convert start cont + (if read-only-p + `(%load-time-value ',handle) + `(value-cell-ref (%load-time-value ',handle))))) + (let ((value + (handler-case (eval form) + (error (condition) + (compiler-error "(during EVAL of LOAD-TIME-VALUE)~%~A" + condition))))) + (ir1-convert start cont + (if read-only-p + `',value + `(value-cell-ref ',(make-value-cell value))))))) + + +(defoptimizer (%load-time-value ir2-convert) ((handle) node block) + (assert (constant-continuation-p handle)) + (let ((cont (node-cont node)) + (tn (make-load-time-value-tn (continuation-value handle) + *universal-type*))) + (move-continuation-result node block (list tn) cont))) + -- GitLab