diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-05-07 06:35:09 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-05-07 06:35:09 -0700 |
commit | d740e46ff35500b3f39420161348a4ed20b8da5c (patch) | |
tree | da7e1363b9fb2f694748fd83aede581cb9e9e8f5 | |
parent | 774942668337c2dc103157d28824cb4122af515f (diff) | |
download | txr-d740e46ff35500b3f39420161348a4ed20b8da5c.tar.gz txr-d740e46ff35500b3f39420161348a4ed20b8da5c.tar.bz2 txr-d740e46ff35500b3f39420161348a4ed20b8da5c.zip |
compiler: warn on misleading references in load-time.
If code does something like this, we produce a warning:
(let ((var 42))
(load-time (+ var 3)))
A load-time form occurs in an empty lexical environment,
so this code appears right but actually cannot work;
the appearance is a mere trompe d'oeil.
* share/txr/stdlib/compiler.tl (misleading-ref-check): New
function.
(compiler comp-load-time-lit): Apply misleading-ref-check.
-rw-r--r-- | share/txr/stdlib/compiler.tl | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index 8af7384f..d734fccf 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -1146,6 +1146,14 @@ (end ,bfrag.oreg)) bfrag.fvars bfrag.ffuns))))) +(defun misleading-ref-check (frag env form) + (each ((v frag.fvars)) + (when env.(lookup-var v) + (compile-warning form "cannot refer to lexical variable ~s" v))) + (each ((f frag.ffuns)) + (when env.(lookup-fun f) + (compile-warning form "cannot refer to lexical function ~s" f)))) + (defmeth compiler comp-load-time-lit (me oreg env form) (mac-param-bind form (op loaded-p exp) form (if loaded-p @@ -1159,6 +1167,7 @@ (mov ,dreg ,exp.oreg)) exp.fvars exp.ffuns)))) + (misleading-ref-check exp env form) me.(free-treg oreg) (push lt-frag me.lt-frags) (new (frag dreg nil))))))) |