mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +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*
|
;;; 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
|
;;;; This library is free software; you can redistribute it and/or
|
||||||
;;;; modify it under the terms of the GNU Lesser General Public
|
;;;; modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -252,6 +252,24 @@
|
||||||
(add-statement src init (make-void src))))
|
(add-statement src init (make-void src))))
|
||||||
mod-vars)))))))
|
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)
|
(($ <seq> src head tail)
|
||||||
(let*-values (((head mod-vars) (visit-top-level head mod-vars))
|
(let*-values (((head mod-vars) (visit-top-level head mod-vars))
|
||||||
((tail mod-vars) (visit-top-level tail mod-vars)))
|
((tail mod-vars) (visit-top-level tail mod-vars)))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue