[movitz-cvs] CVS movitz

ffjeld ffjeld at common-lisp.net
Fri Mar 16 18:03:09 UTC 2007


Update of /project/movitz/cvsroot/movitz
In directory clnet:/tmp/cvs-serv18485

Modified Files:
	compiler.lisp 
Log Message:
The compiler used to fail upon lending of constant bindings. Fixed.


--- /project/movitz/cvsroot/movitz/compiler.lisp	2007/03/16 17:47:27	1.183
+++ /project/movitz/cvsroot/movitz/compiler.lisp	2007/03/16 18:03:09	1.184
@@ -8,7 +8,7 @@
 ;;;; Created at:    Wed Oct 25 12:30:49 2000
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: compiler.lisp,v 1.183 2007/03/16 17:47:27 ffjeld Exp $
+;;;; $Id: compiler.lisp,v 1.184 2007/03/16 18:03:09 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -620,43 +620,45 @@
   (check-type toplevel-funobj movitz-funobj)
   (let ((function-binding-usage ()))
     (labels ((process-binding (funobj binding usages)
-	       (if (not (eq funobj (binding-funobj binding)))
-		   (let ((borrowing-binding
-			  (or (find binding (borrowed-bindings funobj)
-				    :key #'borrowed-binding-target)
-			      (car (push (movitz-env-add-binding (funobj-env funobj)
-								 (make-instance 'borrowed-binding
-								   :name (binding-name binding)
-								   :target-binding binding))
-					 (borrowed-bindings funobj))))))
-		     ;; We don't want to borrow a forwarding-binding..
-		     (when (typep (borrowed-binding-target borrowing-binding)
-				  'forwarding-binding)
-		       (change-class (borrowed-binding-target borrowing-binding)
-				     'located-binding))
+	       (cond
+                 ((typep binding 'constant-object-binding))
+                 ((not (eq funobj (binding-funobj binding)))
+                  (let ((borrowing-binding
+                         (or (find binding (borrowed-bindings funobj)
+                              :key #'borrowed-binding-target)
+                             (car (push (movitz-env-add-binding (funobj-env funobj)
+                                                                (make-instance 'borrowed-binding
+                                                                 :name (binding-name binding)
+                                                                 :target-binding binding))
+                                        (borrowed-bindings funobj))))))
+                    ;; We don't want to borrow a forwarding-binding..
+                    (when (typep (borrowed-binding-target borrowing-binding)
+                                 'forwarding-binding)
+                      (change-class (borrowed-binding-target borrowing-binding)
+                                    'located-binding))
 ;;;		     (warn "binding ~S of ~S is not local to ~S, replacing with ~S of ~S."
 ;;;			   binding (binding-env binding) funobj
 ;;;			   borrowing-binding (binding-env borrowing-binding))
 ;;;		     (pushnew borrowing-binding 
 ;;;			      (getf (binding-lended-p binding) :lended-to))
-		     (dolist (usage usages)
-		       (pushnew usage (borrowed-binding-usage borrowing-binding)))
-		     borrowing-binding)
-		 ;; Binding is local to this funobj
-		 (typecase binding
-		   (forwarding-binding
-		    (process-binding funobj (forwarding-binding-target binding) usages)
-		    #+ignore
-		    (setf (forwarding-binding-target binding)
-		      (process-binding funobj (forwarding-binding-target binding) usages)))
-		   (function-binding
-		    (dolist (usage usages)
-		      (pushnew usage
-			       (getf (sub-function-binding-usage (function-binding-parent binding))
-				     binding))
-		      (pushnew usage (getf function-binding-usage binding)))
-		    binding)
-		   (t binding))))
+                    (dolist (usage usages)
+                      (pushnew usage (borrowed-binding-usage borrowing-binding)))
+                    borrowing-binding))
+                 (t ; Binding is local to this funobj
+                  (typecase binding
+                    (forwarding-binding
+                     (process-binding funobj (forwarding-binding-target binding) usages)
+                     #+ignore
+                     (setf (forwarding-binding-target binding)
+                           (process-binding funobj (forwarding-binding-target binding) usages)))
+                    (function-binding
+                     (dolist (usage usages)
+                       (pushnew usage
+                                (getf (sub-function-binding-usage (function-binding-parent binding))
+                                      binding))
+                       (pushnew usage (getf function-binding-usage binding)))
+                     binding)
+                    (t binding)))))
 	     (resolve-sub-funobj (funobj sub-funobj)
 	       (dolist (binding-we-lend (borrowed-bindings (resolve-funobj-borrowing sub-funobj)))
 		 #+ignore
@@ -6405,16 +6407,16 @@
 
 (defun ensure-local-binding (binding funobj)
   "When referencing binding in funobj, ensure we have the binding local to funobj."
-  (if (not (typep binding 'binding))
-      binding
-    (let ((target-binding (binding-target binding)))
-      (cond
-       ((eq funobj (binding-funobj target-binding))
-	binding)
-       (t (or (find target-binding (borrowed-bindings funobj)
-		    :key (lambda (binding)
-			   (borrowed-binding-target binding)))
-	      (error "Can't install non-local binding ~W." binding)))))))
+  (if (typep binding '(or (not binding) constant-object-binding))
+      binding ; Never mind if "binding" isn't a binding, or is a constant-binding.
+      (let ((target-binding (binding-target binding)))
+        (cond
+          ((eq funobj (binding-funobj target-binding))
+           binding)
+          (t (or (find target-binding (borrowed-bindings funobj)
+                  :key (lambda (binding)
+                         (borrowed-binding-target binding)))
+                 (error "Can't install non-local binding ~W." binding)))))))
 
 (defun binding-store-subtypep (binding type-specifier)
   "Is type-specifier a supertype of all values ever stored to binding?




More information about the Movitz-cvs mailing list