mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
Letrectify links module defs with uses
* module/language/tree-il/letrectify.scm (letrectify): Inline "let" bindings inside residualized "letrec*" forms, to allow the dominator relationship to be reflected in the scope tree. Also, detect "define-module*" invocations, and add these to the mod-vars set, so that residualized "module-ensure-local-variable!" primcalls can clearly denote their module without having to use "current-module".
This commit is contained in:
parent
04e9245918
commit
532c241e38
1 changed files with 19 additions and 1 deletions
|
@ -1,6 +1,6 @@
|
|||
;;; transformation of top-level bindings into letrec*
|
||||
|
||||
;; Copyright (C) 2019-2020 Free Software Foundation, Inc.
|
||||
;; Copyright (C) 2019-2021 Free Software Foundation, Inc.
|
||||
|
||||
;;;; This library is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -252,6 +252,24 @@
|
|||
(add-statement src init (make-void src))))
|
||||
mod-vars)))))))
|
||||
|
||||
(($ <let> src names vars vals body)
|
||||
(let lp ((names names) (vars vars) (vals vals) (mod-vars mod-vars))
|
||||
(match (vector names vars vals)
|
||||
(#(() () ())
|
||||
(values (visit-expr body) mod-vars))
|
||||
(#((name . names) (var . vars) (val . vals))
|
||||
(let* ((val (visit-expr val))
|
||||
(mod-vars
|
||||
(match val
|
||||
(($ <call> _
|
||||
($ <module-ref> _ '(guile) 'define-module* #f)
|
||||
(($ <const> _ mod) . args))
|
||||
(acons mod var mod-vars))
|
||||
(_ mod-vars))))
|
||||
(let-values (((exp mod-vars) (lp names vars vals mod-vars)))
|
||||
(values (add-binding name var val exp)
|
||||
mod-vars)))))))
|
||||
|
||||
(($ <seq> src head tail)
|
||||
(let*-values (((head mod-vars) (visit-top-level head mod-vars))
|
||||
((tail mod-vars) (visit-top-level tail mod-vars)))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue