1.0.47.18: less verbose source forms for functions from EVAL
authorNikodemus Siivola <nikodemus@random-state.net>
Fri, 8 Apr 2011 15:38:26 +0000 (15:38 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Fri, 8 Apr 2011 15:38:26 +0000 (15:38 +0000)
  Fixes lp#747485.

  When generating debug information, exclude the outer lambda
  introduced by %SIMPLE-EVAL from the source form.

NEWS
src/code/eval.lisp
src/compiler/debug-dump.lisp
version.lisp-expr

diff --git a/NEWS b/NEWS
index c524c5d..7ccf2ef 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,7 @@ changes relative to sbcl-1.0.47:
     a compile-time error. (lp#720382)
   * bug fix: forms such as (FUNCALL (FUNCTION NAME OOPS) ...) were compiled
     without complaints.
+  * bug fix: less verbose source forms for functions from EVAL. (lp#747485)
 
 changes in sbcl-1.0.47 relative to sbcl-1.0.46:
   * bug fix: fix mach port rights leaks in mach exception handling code on
index 8528a03..7f5c4f5 100644 (file)
 
 (defvar *eval-source-context* nil)
 
+(defun make-eval-lambda (expr)
+  `(named-lambda
+       ;; This name is used to communicate the original context
+       ;; for the compiler, and identifies the lambda for use of
+       ;; EVAL-LAMBDA-SOURCE-LAMBDA below.
+       (eval ,(sb!c::source-form-context *eval-source-context*)) ()
+     (declare (muffle-conditions compiler-note))
+     ;; why PROGN?  So that attempts to eval free declarations
+     ;; signal errors rather than return NIL.  -- CSR, 2007-05-01
+     (progn ,expr)))
+
+(defun eval-lambda-p (form)
+  (when (and (consp form) (eq 'named-lambda (first form)))
+    (let ((name (second form)))
+      (when (and (consp name) (eq 'eval (first name)))
+        t))))
+
+(defun eval-lambda-source-lambda (eval-lambda)
+  (if (eval-lambda-p eval-lambda)
+      (destructuring-bind (named-lambda name lambda-list decl (progn expr))
+          eval-lambda
+        (declare (ignore named-lambda name lambda-list decl progn))
+        (when (and (consp expr) (member (car expr) '(lambda named-lambda)))
+          expr))
+      eval-lambda))
+
 ;;; general case of EVAL (except in that it can't handle toplevel
 ;;; EVAL-WHEN magic properly): Delegate to #'COMPILE.
 (defun %simple-eval (expr lexenv)
   ;;
   ;; As of 1.0.21.6 we muffle compiler notes lexically here, which seems
   ;; always safe. --NS
-  (let* (;; why PROGN?  So that attempts to eval free declarations
-         ;; signal errors rather than return NIL.  -- CSR, 2007-05-01
-         (lambda `(named-lambda (eval ,(sb!c::source-form-context *eval-source-context*)) ()
-                    (declare (muffle-conditions compiler-note))
-                    (progn ,expr)))
+  (let* ((lambda (make-eval-lambda expr))
          (fun (sb!c:compile-in-lexenv nil lambda lexenv)))
     (funcall fun)))
 
index 93dc016..f2b5c31 100644 (file)
                        (file-info-positions file-info))
 
      :form (let ((direct-file-info (source-info-file-info info)))
-             (if (eq :lisp (file-info-name direct-file-info))
-                 (elt (file-info-forms direct-file-info) 0)))
+             (when (eq :lisp (file-info-name direct-file-info))
+               (let ((form (elt (file-info-forms direct-file-info) 0)))
+                 ;; The form COMPILE saves may include gunk
+                 ;; from %SIMPLE-EVAL -- this gets rid of that.
+                 (sb!impl::eval-lambda-source-lambda form))))
      :function function)))
 
 ;;; Given an arbitrary sequence, coerce it to an unsigned vector if
index b2b3147..a2ad1f8 100644 (file)
@@ -20,4 +20,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.47.17"
+"1.0.47.18"