Commit | Line | Data |
---|---|---|
c4a209b9 AW |
1 | ;;; Continuation-passing style (CPS) intermediate language (IL) |
2 | ||
a9ec16f9 | 3 | ;; Copyright (C) 2013, 2014, 2015 Free Software Foundation, Inc. |
c4a209b9 AW |
4 | |
5 | ;;;; This library is free software; you can redistribute it and/or | |
6 | ;;;; modify it under the terms of the GNU Lesser General Public | |
7 | ;;;; License as published by the Free Software Foundation; either | |
8 | ;;;; version 3 of the License, or (at your option) any later version. | |
9 | ;;;; | |
10 | ;;;; This library is distributed in the hope that it will be useful, | |
11 | ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | ;;;; Lesser General Public License for more details. | |
14 | ;;;; | |
15 | ;;;; You should have received a copy of the GNU Lesser General Public | |
16 | ;;;; License along with this library; if not, write to the Free Software | |
17 | ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
18 | ||
19 | ;;; Commentary: | |
20 | ;;; | |
21 | ;;; A pass that prunes successors of expressions that bail out. | |
22 | ;;; | |
23 | ;;; Code: | |
24 | ||
25 | (define-module (language cps self-references) | |
26 | #:use-module (ice-9 match) | |
27 | #:use-module (language cps) | |
28 | #:export (resolve-self-references)) | |
29 | ||
30 | (define* (resolve-self-references fun #:optional (env '())) | |
31 | (define (subst var) | |
32 | (or (assq-ref env var) var)) | |
33 | ||
34 | (define (visit-cont cont) | |
35 | (rewrite-cps-cont cont | |
36 | (($ $cont label ($ $kargs names vars body)) | |
37 | (label ($kargs names vars ,(visit-term body)))) | |
8320f504 AW |
38 | (($ $cont label ($ $kfun src meta self tail clause)) |
39 | (label ($kfun src meta self ,tail | |
c4a209b9 AW |
40 | ,(and clause (visit-cont clause))))) |
41 | (($ $cont label ($ $kclause arity body alternate)) | |
42 | (label ($kclause ,arity ,(visit-cont body) | |
43 | ,(and alternate (visit-cont alternate))))) | |
44 | (_ ,cont))) | |
45 | ||
46 | (define (visit-term term) | |
47 | (rewrite-cps-term term | |
48 | (($ $letrec names vars funs body) | |
49 | ($letrec names vars (map visit-recursive-fun funs vars) | |
a0329d01 | 50 | ,(visit-term body))) |
c4a209b9 AW |
51 | (($ $letk conts body) |
52 | ($letk ,(map visit-cont conts) | |
53 | ,(visit-term body))) | |
54 | (($ $continue k src exp) | |
55 | ($continue k src ,(visit-exp exp))))) | |
56 | ||
57 | (define (visit-exp exp) | |
58 | (rewrite-cps-exp exp | |
a9ec16f9 | 59 | ((or ($ $const) ($ $prim)) ,exp) |
a0329d01 AW |
60 | (($ $fun free body) |
61 | ($fun free ,(resolve-self-references body env))) | |
c4a209b9 AW |
62 | (($ $call proc args) |
63 | ($call (subst proc) ,(map subst args))) | |
64 | (($ $callk k proc args) | |
65 | ($callk k (subst proc) ,(map subst args))) | |
66 | (($ $primcall name args) | |
67 | ($primcall name ,(map subst args))) | |
92805e21 AW |
68 | (($ $branch k exp) |
69 | ($branch k ,(visit-exp exp))) | |
c4a209b9 AW |
70 | (($ $values args) |
71 | ($values ,(map subst args))) | |
72 | (($ $prompt escape? tag handler) | |
73 | ($prompt escape? (subst tag) handler)))) | |
74 | ||
75 | (define (visit-recursive-fun fun var) | |
a0329d01 | 76 | (rewrite-cps-exp fun |
8320f504 | 77 | (($ $fun free (and cont ($ $cont _ ($ $kfun src meta self)))) |
a0329d01 | 78 | ($fun free ,(resolve-self-references cont (acons var self env)))))) |
c4a209b9 | 79 | |
a0329d01 | 80 | (visit-cont fun)) |