1 ! Copyright (C) 2004, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel namespaces arrays sequences io words fry
4 continuations vocabs assocs dlists definitions math graphs generic
5 combinators deques search-deques macros io stack-checker call
6 stack-checker.state stack-checker.inlining combinators.short-circuit
7 compiler.errors compiler.units compiler.tree.builder
8 compiler.tree.optimizer compiler.cfg.builder compiler.cfg.optimizer
9 compiler.cfg.linearization compiler.cfg.two-operand
10 compiler.cfg.linear-scan compiler.cfg.stack-frame compiler.codegen
17 : queue-compile? ( word -- ? )
19 [ "forgotten" word-prop ]
25 : queue-compile ( word -- )
26 dup queue-compile? [ compile-queue get push-front ] [ drop ] if ;
28 : maybe-compile ( word -- )
29 dup optimized>> [ drop ] [ queue-compile ] if ;
31 SYMBOLS: +optimized+ +unoptimized+ ;
33 : ripple-up ( words -- )
34 dup "compiled-status" word-prop +unoptimized+ eq?
35 [ usage [ word? ] filter ] [ compiled-usage keys ] if
36 [ queue-compile ] each ;
38 : ripple-up? ( word status -- ? )
39 swap "compiled-status" word-prop [ = not ] keep and ;
41 : save-compiled-status ( word status -- )
42 [ dupd ripple-up? [ ripple-up ] [ drop ] if ]
43 [ "compiled-status" set-word-prop ]
47 "trace-compilation" get [ dup name>> print flush ] when
48 H{ } clone dependencies set
49 H{ } clone generic-dependencies set
50 f swap compiler-error ;
52 : ignore-error? ( word error -- ? )
53 [ [ inline? ] [ macro? ] bi or ]
54 [ compiler-error-type +warning+ eq? ] bi* and ;
56 : fail ( word error -- * )
57 [ 2dup ignore-error? [ 2drop ] [ swap compiler-error ] if ]
61 [ f swap compiled get set-at ]
62 [ +unoptimized+ save-compiled-status ]
67 : frontend ( word -- nodes )
68 [ build-tree-from-word ] [ fail ] recover optimize-tree ;
70 ! Only switch this off for debugging.
71 SYMBOL: compile-dependencies?
73 t compile-dependencies? set-global
76 [ [ code>> ] [ label>> ] bi compiled get set-at ]
77 [ compile-dependencies? get [ calls>> [ maybe-compile ] each ] [ drop ] if ]
80 : backend ( nodes word -- )
92 [ +optimized+ save-compiled-status ]
98 generic-dependencies get
103 : (compile) ( word -- )
113 : compile-loop ( deque -- )
114 [ (compile) yield-hook get call( -- ) ] slurp-deque ;
116 : decompile ( word -- )
117 f 2array 1array modify-code-heap ;
119 : compile-call ( quot -- )
120 [ dup infer define-temp ] with-compilation-unit execute ;
122 SINGLETON: optimizing-compiler
124 M: optimizing-compiler recompile ( words -- alist )
126 <hashed-dlist> compile-queue set
127 H{ } clone compiled set
128 [ queue-compile ] each
129 compile-queue get compile-loop
133 : enable-compiler ( -- )
134 optimizing-compiler compiler-impl set-global ;
136 : disable-compiler ( -- )
137 f compiler-impl set-global ;
139 : recompile-all ( -- )
140 forget-errors all-words compile ;