diff options
author | Andrew Whatson <whatson@gmail.com> | 2022-09-20 17:23:58 +1000 |
---|---|---|
committer | Daniel Llorens <lloda@sarc.name> | 2022-11-29 11:53:54 +0100 |
commit | c7fa78fc751eb336bcfafbb5ac59c460ee2c5d7a (patch) | |
tree | f0b362ab9df06185bb58a8e9dd81576f3ef6ad8d | |
parent | 02f69c1d84126c35900c5743a712b1e7d07e449d (diff) | |
download | guile-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.scm | 12 |
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 |