bug#57948: [PATCH] Avoid 'frame-local-ref' errors when printing backtrace.

Andrew Whatson <[email protected]>
Newsgroups gmane.lisp.guile.bugs
Message-ID <CAPE069deSOMm8ZoDRd_opj46Rn_0UX3T0uhRUw0xL71QPQsWWg__16179.3233289913$1673414732$gmane$org@mail.gmail.com>
Ludovic Courtès <[email protected]> wrote:
>
> It would be great if you could add a simple test case though, so that
> the bug doesn’t eventually come back to haunt us.

I've finally tracked this one down, a patch with a unit test for this
bug is attached.

Cheers,
Andrew
test-frame-local-ref-error.patch (text/x-patch, 2.1 KB)
commit 164bdce6acf53796cb96ef1930a89c6caf84bc39
Author: Andrew Whatson <[email protected]>
Date:   Wed Jan 11 14:04:32 2023 +1000

    Test for 'frame-local-ref' errors when printing backtrace.
    
    This test reproduces the error from <https://bugs.gnu.org/56493>, and
    passes with the workaround which was merged in commit
    c7fa78fc751eb336bcfafbb5ac59c460ee2c5d7a.
    
    * test-suite/tests/eval.test ("avoid frame-local-ref out of range"): New
    test.

diff --git a/test-suite/tests/eval.test b/test-suite/tests/eval.test
index 9d20812f2..316153385 100644
--- a/test-suite/tests/eval.test
+++ b/test-suite/tests/eval.test
@@ -22,6 +22,7 @@
   :use-module ((system vm vm) :select (call-with-stack-overflow-handler))
   :use-module ((system vm frame) :select (frame-call-representation))
   :use-module (ice-9 documentation)
+  :use-module (ice-9 exceptions)
   :use-module (ice-9 local-eval))
 
 
@@ -387,7 +388,27 @@
       (and (eq? (car (frame-call-representation (car frames)))
                 'make-stack)
            (eq? (car (frame-call-representation (car (last-pair frames))))
-                'with-exception-handler)))))
+                'with-exception-handler))))
+
+  (pass-if "avoid frame-local-ref out of range"
+    (with-exception-handler
+        (lambda (ex)
+          ;; If frame-call-representation fails, we'll catch that
+          ;; instead of the expected "Wrong type to apply" error.
+          (string-prefix? "Wrong type to apply" (exception-message ex)))
+      (lambda ()
+        (with-exception-handler
+            (lambda (ex)
+              (let* ((stack (make-stack #t))
+                     (frames (stack->frames stack)))
+                (for-each frame-call-representation frames))
+              (raise-exception ex))
+          (lambda ()
+            ;; This throws a "Wrong type to apply" error, creating a
+            ;; frame with an incorrect number of local slots as
+            ;; described in bug <https://bugs.gnu.org/56493>.
+            (primitive-eval '(define foo (#t))))))
+      #:unwind? #t)))
 
 ;;;
 ;;; letrec init evaluation
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.