| 
									
										
										
										
											2010-01-22 06:39:56 -05:00
										 |  |  | ! Copyright (C) 2004, 2010 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2016-04-13 17:29:24 -04:00
										 |  |  | USING: accessors assocs classes classes.algebra combinators | 
					
						
							| 
									
										
										
										
											2014-12-13 19:10:21 -05:00
										 |  |  | combinators.short-circuit compiler.cfg compiler.cfg.builder | 
					
						
							| 
									
										
										
										
											2014-12-13 21:44:35 -05:00
										 |  |  | compiler.cfg.builder.alien compiler.cfg.finalization | 
					
						
							|  |  |  | compiler.cfg.optimizer compiler.codegen compiler.crossref | 
					
						
							|  |  |  | compiler.errors compiler.tree.builder compiler.tree.optimizer | 
					
						
							|  |  |  | compiler.units compiler.utilities continuations definitions fry | 
					
						
							|  |  |  | generic generic.single io kernel macros make namespaces | 
					
						
							|  |  |  | sequences sets stack-checker.dependencies stack-checker.errors | 
					
						
							| 
									
										
										
										
											2014-12-13 19:10:21 -05:00
										 |  |  | stack-checker.inlining vocabs.loader words ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: compiler | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-07 17:17:55 -04:00
										 |  |  | SYMBOL: compiled | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-25 20:41:27 -04:00
										 |  |  | : compile? ( word -- ? )
 | 
					
						
							| 
									
										
										
										
											2015-09-08 19:15:10 -04:00
										 |  |  |     ! Don't attempt to compile certain words. | 
					
						
							| 
									
										
										
										
											2008-10-07 17:17:55 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-02-24 00:55:16 -05:00
										 |  |  |         [ "forgotten" word-prop ] | 
					
						
							|  |  |  |         [ inlined-block? ] | 
					
						
							|  |  |  |     } 1|| not ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-27 21:36:05 -04:00
										 |  |  | : compiler-message ( string -- )
 | 
					
						
							| 
									
										
										
										
											2011-10-13 20:21:59 -04:00
										 |  |  |     "trace-compilation" get [ [ print flush ] with-global ] [ drop ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-09-27 21:36:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-07 17:17:55 -04:00
										 |  |  | : start ( word -- )
 | 
					
						
							| 
									
										
										
										
											2009-09-27 21:36:05 -04:00
										 |  |  |     dup name>> compiler-message | 
					
						
							| 
									
										
										
										
											2010-01-29 03:40:09 -05:00
										 |  |  |     init-dependencies | 
					
						
							| 
									
										
										
										
											2009-04-23 23:17:25 -04:00
										 |  |  |     clear-compiler-error ;
 | 
					
						
							| 
									
										
										
										
											2008-01-01 14:54:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-25 20:41:27 -04:00
										 |  |  | GENERIC: no-compile? ( word -- ? )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-01 02:08:24 -05:00
										 |  |  | M: method no-compile? "method-generic" word-prop no-compile? ;
 | 
					
						
							| 
									
										
										
										
											2009-04-25 20:41:27 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: predicate-engine-word no-compile? "owner-generic" word-prop no-compile? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 04:27:25 -04:00
										 |  |  | M: word no-compile? | 
					
						
							| 
									
										
										
										
											2009-11-09 01:17:24 -05:00
										 |  |  |     { [ macro? ] [ "special" word-prop ] [ "no-compile" word-prop ] } 1|| ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: combinator? ( word -- ? )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-01 02:08:24 -05:00
										 |  |  | M: method combinator? "method-generic" word-prop combinator? ;
 | 
					
						
							| 
									
										
										
										
											2009-11-09 01:17:24 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: predicate-engine-word combinator? "owner-generic" word-prop combinator? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: word combinator? inline? ;
 | 
					
						
							| 
									
										
										
										
											2009-10-23 04:27:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-12 18:30:41 -04:00
										 |  |  | : ignore-error? ( word error -- ? )
 | 
					
						
							| 
									
										
										
										
											2015-09-08 19:15:10 -04:00
										 |  |  |     ! Ignore some errors on inline combinators, macros, and special | 
					
						
							|  |  |  |     ! words such as 'call'. | 
					
						
							| 
									
										
										
										
											2009-11-09 01:17:24 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         [ drop no-compile? ] | 
					
						
							|  |  |  |         [ [ combinator? ] [ unknown-macro-input? ] bi* and ] | 
					
						
							|  |  |  |     } 2|| ;
 | 
					
						
							| 
									
										
										
										
											2009-03-12 18:30:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-21 23:33:04 -04:00
										 |  |  | : finish ( word -- )
 | 
					
						
							| 
									
										
										
										
											2015-09-08 19:15:10 -04:00
										 |  |  |     ! Recompile callers if the word's stack effect changed, then | 
					
						
							|  |  |  |     ! save the word's dependencies so that if they change, the | 
					
						
							|  |  |  |     ! word can get recompiled too. | 
					
						
							| 
									
										
										
										
											2009-04-17 00:14:11 -04:00
										 |  |  |     [ compiled-unxref ] | 
					
						
							| 
									
										
										
										
											2009-04-21 23:33:04 -04:00
										 |  |  |     [ | 
					
						
							|  |  |  |         dup crossref? [ | 
					
						
							| 
									
										
										
										
											2010-01-29 03:40:09 -05:00
										 |  |  |             [ dependencies get generic-dependencies get compiled-xref ] | 
					
						
							| 
									
										
										
										
											2010-01-29 16:58:00 -05:00
										 |  |  |             [ conditional-dependencies get set-dependency-checks ] | 
					
						
							| 
									
										
										
										
											2010-01-29 03:40:09 -05:00
										 |  |  |             bi
 | 
					
						
							| 
									
										
										
										
											2009-04-21 23:33:04 -04:00
										 |  |  |         ] [ drop ] if
 | 
					
						
							| 
									
										
										
										
											2010-02-03 07:09:57 -05:00
										 |  |  |     ] bi ;
 | 
					
						
							| 
									
										
										
										
											2009-04-21 23:33:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : deoptimize-with ( word def -- * )
 | 
					
						
							| 
									
										
										
										
											2015-09-08 19:15:10 -04:00
										 |  |  |     ! If the word failed to infer, compile it with the | 
					
						
							|  |  |  |     ! non-optimizing compiler. | 
					
						
							| 
									
										
										
										
											2009-04-21 23:33:04 -04:00
										 |  |  |     swap [ finish ] [ compiled get set-at ] bi return ;
 | 
					
						
							| 
									
										
										
										
											2008-10-07 17:17:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 23:05:41 -04:00
										 |  |  | : not-compiled-def ( word error -- def )
 | 
					
						
							|  |  |  |     '[ _ _ not-compiled ] [ ] like ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-01 03:32:42 -04:00
										 |  |  | : deoptimize* ( word -- * )
 | 
					
						
							|  |  |  |     dup def>> deoptimize-with ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-29 20:39:04 -04:00
										 |  |  | : ignore-error ( word error -- * )
 | 
					
						
							| 
									
										
										
										
											2009-06-01 03:32:42 -04:00
										 |  |  |     drop [ clear-compiler-error ] [ deoptimize* ] bi ;
 | 
					
						
							| 
									
										
										
										
											2009-04-29 20:39:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : remember-error ( word error -- * )
 | 
					
						
							| 
									
										
										
										
											2012-06-21 03:19:45 -04:00
										 |  |  |     [ swap <compiler-error> save-compiler-error ] | 
					
						
							| 
									
										
										
										
											2009-04-29 20:39:04 -04:00
										 |  |  |     [ [ drop ] [ not-compiled-def ] 2bi deoptimize-with ] | 
					
						
							|  |  |  |     2bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-21 23:33:04 -04:00
										 |  |  | : deoptimize ( word error -- * )
 | 
					
						
							| 
									
										
										
										
											2015-09-08 19:15:10 -04:00
										 |  |  |     ! If the error is ignorable, compile the word with the | 
					
						
							|  |  |  |     ! non-optimizing compiler, using its definition. Otherwise, | 
					
						
							|  |  |  |     ! if the compiler error is not ignorable, use a dummy | 
					
						
							|  |  |  |     ! definition from 'not-compiled-def' which throws an error. | 
					
						
							| 
									
										
										
										
											2009-04-29 20:39:04 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         { [ dup inference-error? not ] [ rethrow ] } | 
					
						
							|  |  |  |         { [ 2dup ignore-error? ] [ ignore-error ] } | 
					
						
							|  |  |  |         [ remember-error ] | 
					
						
							|  |  |  |     } cond ;
 | 
					
						
							| 
									
										
										
										
											2009-04-17 00:14:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-25 20:41:27 -04:00
										 |  |  | : optimize? ( word -- ? )
 | 
					
						
							| 
									
										
										
										
											2010-01-19 02:00:33 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         [ single-generic? ] | 
					
						
							|  |  |  |         [ primitive? ] | 
					
						
							|  |  |  |     } 1|| not ;
 | 
					
						
							| 
									
										
										
										
											2009-05-05 10:12:32 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : contains-breakpoints? ( -- ? )
 | 
					
						
							|  |  |  |     dependencies get keys [ "break?" word-prop ] any? ;
 | 
					
						
							| 
									
										
										
										
											2009-04-25 20:41:27 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-01 03:32:42 -04:00
										 |  |  | : frontend ( word -- tree )
 | 
					
						
							| 
									
										
										
										
											2015-09-08 19:15:10 -04:00
										 |  |  |     ! If the word contains breakpoints, don't optimize it, since | 
					
						
							|  |  |  |     ! the walker does not support this. | 
					
						
							| 
									
										
										
										
											2009-05-05 10:12:32 -04:00
										 |  |  |     dup optimize? [ | 
					
						
							|  |  |  |         [ [ build-tree ] [ deoptimize ] recover optimize-tree ] keep
 | 
					
						
							| 
									
										
										
										
											2009-06-01 03:32:42 -04:00
										 |  |  |         contains-breakpoints? [ nip deoptimize* ] [ drop ] if
 | 
					
						
							|  |  |  |     ] [ deoptimize* ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-01-01 14:54:14 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-01 03:32:42 -04:00
										 |  |  | : backend ( tree word -- )
 | 
					
						
							| 
									
										
										
										
											2008-10-07 17:17:55 -04:00
										 |  |  |     build-cfg [ | 
					
						
							| 
									
										
										
										
											2010-05-02 18:48:41 -04:00
										 |  |  |         [ | 
					
						
							| 
									
										
										
										
											2014-12-11 15:48:43 -05:00
										 |  |  |             [ optimize-cfg ] | 
					
						
							|  |  |  |             [ finalize-cfg ] | 
					
						
							|  |  |  |             [ [ generate ] [ label>> ] bi compiled get set-at ] | 
					
						
							|  |  |  |             tri
 | 
					
						
							| 
									
										
										
										
											2010-05-02 18:48:41 -04:00
										 |  |  |         ] with-cfg | 
					
						
							| 
									
										
										
										
											2008-10-07 17:17:55 -04:00
										 |  |  |     ] each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-21 23:33:04 -04:00
										 |  |  | : compile-word ( word -- )
 | 
					
						
							| 
									
										
										
										
											2015-09-08 19:15:10 -04:00
										 |  |  |     ! We return early if the word has breakpoints or if it | 
					
						
							|  |  |  |     ! failed to infer. | 
					
						
							| 
									
										
										
										
											2008-08-15 00:35:19 -04:00
										 |  |  |     '[ | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:40 -04:00
										 |  |  |         _ { | 
					
						
							| 
									
										
										
										
											2008-10-07 17:17:55 -04:00
										 |  |  |             [ start ] | 
					
						
							|  |  |  |             [ frontend ] | 
					
						
							|  |  |  |             [ backend ] | 
					
						
							|  |  |  |             [ finish ] | 
					
						
							| 
									
										
										
										
											2008-05-07 08:49:36 -04:00
										 |  |  |         } cleave
 | 
					
						
							| 
									
										
										
										
											2008-08-15 00:35:19 -04:00
										 |  |  |     ] with-return ;
 | 
					
						
							| 
									
										
										
										
											2007-12-24 21:41:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-13 20:39:32 -04:00
										 |  |  | SINGLETON: optimizing-compiler | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-20 10:23:20 -05:00
										 |  |  | M: optimizing-compiler update-call-sites ( class generic -- words )
 | 
					
						
							| 
									
										
										
										
											2015-09-08 19:15:10 -04:00
										 |  |  |     ! Words containing call sites with inferred type 'class' | 
					
						
							|  |  |  |     ! which inlined a method on 'generic' | 
					
						
							| 
									
										
										
										
											2013-03-10 19:12:40 -04:00
										 |  |  |     generic-call-sites-of keys swap '[ | 
					
						
							| 
									
										
										
										
											2016-04-13 17:29:24 -04:00
										 |  |  |         _ 2dup [ classoid? ] both?
 | 
					
						
							| 
									
										
										
										
											2010-01-31 23:20:08 -05:00
										 |  |  |         [ classes-intersect? ] [ 2drop f ] if
 | 
					
						
							| 
									
										
										
										
											2013-03-10 19:12:40 -04:00
										 |  |  |     ] filter ;
 | 
					
						
							| 
									
										
										
										
											2010-01-20 10:23:20 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-13 20:39:32 -04:00
										 |  |  | M: optimizing-compiler recompile ( words -- alist )
 | 
					
						
							| 
									
										
										
										
											2010-02-03 07:36:52 -05:00
										 |  |  |     H{ } clone compiled [ | 
					
						
							|  |  |  |         [ compile? ] filter
 | 
					
						
							|  |  |  |         [ compile-word yield-hook get call( -- ) ] each
 | 
					
						
							| 
									
										
										
										
											2008-11-12 01:10:50 -05:00
										 |  |  |         compiled get >alist
 | 
					
						
							| 
									
										
										
										
											2010-02-03 07:36:52 -05:00
										 |  |  |     ] with-variable
 | 
					
						
							| 
									
										
										
										
											2009-09-27 21:36:05 -04:00
										 |  |  |     "--- compile done" compiler-message ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-08 07:08:04 -05:00
										 |  |  | M: optimizing-compiler to-recompile ( -- words )
 | 
					
						
							| 
									
										
										
										
											2010-02-03 07:09:57 -05:00
										 |  |  |     [ | 
					
						
							| 
									
										
										
										
											2013-03-10 19:12:40 -04:00
										 |  |  |         changed-effects get new-words get diff | 
					
						
							|  |  |  |         outdated-effect-usages % | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         changed-definitions get new-words get diff | 
					
						
							|  |  |  |         outdated-definition-usages % | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         maybe-changed get new-words get diff | 
					
						
							|  |  |  |         outdated-conditional-usages % | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         changed-definitions get members [ word? ] filter dup zip , | 
					
						
							| 
									
										
										
										
											2011-12-05 17:26:14 -05:00
										 |  |  |     ] { } make assoc-combine keys ;
 | 
					
						
							| 
									
										
										
										
											2009-11-08 07:08:04 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: optimizing-compiler process-forgotten-words | 
					
						
							|  |  |  |     [ delete-compiled-xref ] each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-01 06:52:05 -04:00
										 |  |  | : with-optimizer ( quot -- )
 | 
					
						
							|  |  |  |     [ optimizing-compiler compiler-impl ] dip with-variable ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : enable-optimizer ( -- )
 | 
					
						
							| 
									
										
										
										
											2009-03-13 20:39:32 -04:00
										 |  |  |     optimizing-compiler compiler-impl set-global ;
 | 
					
						
							| 
									
										
										
										
											2008-04-02 22:27:49 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-01 06:52:05 -04:00
										 |  |  | : disable-optimizer ( -- )
 | 
					
						
							| 
									
										
										
										
											2009-03-13 20:39:32 -04:00
										 |  |  |     f compiler-impl set-global ;
 | 
					
						
							| 
									
										
										
										
											2011-04-10 22:00:43 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | { "threads" "compiler" } "compiler.threads" require-when |