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