summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Whatson <whatson@gmail.com>2022-09-20 17:23:58 +1000
committerDaniel Llorens <lloda@sarc.name>2022-11-29 11:53:54 +0100
commitc7fa78fc751eb336bcfafbb5ac59c460ee2c5d7a (patch)
treef0b362ab9df06185bb58a8e9dd81576f3ef6ad8d
parent02f69c1d84126c35900c5743a712b1e7d07e449d (diff)
downloadguile-c7fa78fc751eb336bcfafbb5ac59c460ee2c5d7a.tar.gz
Avoid 'frame-local-ref' errors when printing backtrace.
Workaround for <https://bugs.gnu.org/57948>. * module/system/vm/frame.scm (frame-call-representation): Treat a binding as "unspecified" if its slot exceeds 'frame-num-locals'.
-rw-r--r--module/system/vm/frame.scm12
1 files changed, 10 insertions, 2 deletions
diff --git a/module/system/vm/frame.scm b/module/system/vm/frame.scm
index 3be73e29c..6b14fc62a 100644
--- a/module/system/vm/frame.scm
+++ b/module/system/vm/frame.scm
@@ -381,8 +381,16 @@
(frame-local-ref frame i 'scm))
((find-slot i bindings)
=> (lambda (binding)
- (let ((val (frame-local-ref frame (binding-slot binding)
- (binding-representation binding))))
+ (let* ((slot (binding-slot binding))
+ ;; HACK: Avoid out-of-range from frame-local-ref.
+ ;; Some frames have bindings beyond nlocals. That
+ ;; is probably a bug somewhere else, but at least
+ ;; this workaround allows them to be printed.
+ (val (if (< slot nlocals)
+ (frame-local-ref frame slot
+ (binding-representation binding))
+ ;; else #<unspecified>
+ )))
;; It could be that there's a value that isn't clobbered
;; by a call but that isn't live after a call either. In
;; that case, if GC runs during the call, the value will