Skip to content

Commit 2937694

Browse files
committed
Check bindframe index of previous levels at compile-time
1 parent 42f73d6 commit 2937694

File tree

1 file changed

+23
-17
lines changed

1 file changed

+23
-17
lines changed

lisp/comp/comp.l

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -346,14 +346,17 @@
346346
(setq (fdef . bindframe) t)))
347347

348348
;; compile-time check to see if we are not missing any frame references
349-
(when (and (not avant-mode) (= (- closure-level (fdef . level)) 1)
349+
(when (and (not avant-mode) (> closure-level (fdef . level))
350350
(fdef . bindframe))
351-
(unless (find (fdef . bindframe) current-fframes)
352-
(send self :error "unbound fletframe detected when loading function ~S: ~A"
353-
(fdef . name) (fdef . bindframe)))
354-
(unless (< (send self :flet-bindframe fdef) current-csize)
355-
(send self :error "invalid fletframe index detected when loading function ~S: ~A"
356-
(fdef . name) (fdef . cbindframe))))
351+
(let* ((c-index (- closure-level (fdef . level)))
352+
(c-fframes (car (nthcdr (1- c-index) current-fframes)))
353+
(c-csize (car (nthcdr (1- c-index) current-csize))))
354+
(unless (find (fdef . bindframe) c-fframes)
355+
(send self :error "unbound fletframe detected when loading function ~S: ~A"
356+
(fdef . name) (fdef . bindframe)))
357+
(unless (< (send self :flet-bindframe fdef) c-csize)
358+
(send self :error "invalid fletframe index detected when loading function ~S: ~A"
359+
(fdef . name) (fdef . cbindframe)))))
357360
fdef)
358361
(cond ((fboundp fn)
359362
(setq fdef (symbol-function fn))
@@ -566,14 +569,17 @@
566569
(unless (pushvar . bindframe) (setq (pushvar . bindframe) t))))
567570
(check-cframe (&optional (pushvar var))
568571
;; compile-time check to see if we are not missing any frame references
569-
(when (and (not avant-mode) (= (- closure-level (var . level)) 1)
572+
(when (and (not avant-mode) (> closure-level (var . level))
570573
(numberp (pushvar . bindframe)))
571-
(unless (find (pushvar . bindframe) current-cframes)
572-
(send self :error ";; unbound bindframe detected when loading variable ~S: ~A"
573-
(var . name) (pushvar . bindframe)))
574-
(unless (< (send self :var-bindframe pushvar) current-csize)
575-
(send self :error ";; invalid bindframe index detected when loading variable ~S: ~A"
576-
(var . name) (send self :var-bindframe pushvar))))))
574+
(let* ((c-index (- closure-level (var . level)))
575+
(c-cframes (car (nthcdr (1- c-index) current-cframes)))
576+
(c-csize (car (nthcdr (1- c-index) current-csize))))
577+
(unless (find (pushvar . bindframe) c-cframes)
578+
(send self :error ";; unbound bindframe detected when loading variable ~S: ~A"
579+
(var . name) (pushvar . bindframe)))
580+
(unless (< (send self :var-bindframe pushvar) c-csize)
581+
(send self :error ";; invalid bindframe index detected when loading variable ~S: ~A"
582+
(var . name) (send self :var-bindframe pushvar)))))))
577583
(case (var . binding)
578584
;; special variables are accessed through :load-global, so we don't need
579585
;; to add or manage them in bind frames
@@ -1724,9 +1730,9 @@
17241730
(cframes (fourth aclosure))
17251731
(fframes (fifth aclosure))
17261732
(cbind (append cframes fframes)))
1727-
(setq (newcomp . current-cframes) cframes)
1728-
(setq (newcomp . current-fframes) fframes)
1729-
(setq (newcomp . current-csize) (length cbind))
1733+
(setq (newcomp . current-cframes) (cons cframes (newcomp . current-cframes)))
1734+
(setq (newcomp . current-fframes) (cons fframes (newcomp . current-fframes)))
1735+
(setq (newcomp . current-csize) (cons (length cbind) (newcomp . current-csize)))
17301736
;; recalculate function cbindings
17311737
(setq (newcomp . flets) (copy-object (newcomp . flets)))
17321738
(dolist (fdef (newcomp . flets))

0 commit comments

Comments
 (0)