]> gitweb.factorcode.org Git - factor.git/blobdiff - core/compiler/units/units.factor
core: trim using lists with lint.vocabs tool
[factor.git] / core / compiler / units / units.factor
index ea39e822398ab8c7f585ed8cd2bbcc10f140f807..90223e19eabd497dd99f750ab87cab0f5f7c1716 100644 (file)
@@ -1,13 +1,13 @@
 ! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs classes classes.private
-classes.tuple classes.tuple.private continuations definitions
-generic hash-sets init kernel kernel.private math namespaces
-sequences sets source-files.errors vocabs words ;
-FROM: namespaces => set ;
-FROM: sets => members ;
+classes.tuple.private continuations definitions generic
+hash-sets kernel kernel.private math namespaces sequences
+sets source-files.errors vocabs words ;
 IN: compiler.units
 
+PRIMITIVE: modify-code-heap ( alist update-existing? reset-pics? -- )
+
 SYMBOL: old-definitions
 SYMBOL: new-definitions
 
@@ -33,12 +33,13 @@ PRIVATE>
     old-definitions get [ delete ] with each ;
 
 : remember-class ( class loc -- )
-    [ dup new-definitions get first in? [ dup throw-redefine-error ] when ] dip
-    new-definitions get second (remember-definition) ;
+    new-definitions get first2
+    [ dupd in? [ dup throw-redefine-error ] when ]
+    [ (remember-definition) ] bi-curry* bi* ;
 
 : forward-reference? ( word -- ? )
     dup old-definitions get [ in? ] with any? [
-        new-definitions get [ in? ] with any? not
+        new-definitions get [ in? ] with none?
     ] [ drop f ] if ;
 
 SYMBOL: compiler-impl
@@ -48,13 +49,13 @@ HOOK: update-call-sites compiler-impl ( class generic -- words )
 : changed-call-sites ( class generic -- )
     update-call-sites [ changed-definition ] each ;
 
-M: generic update-generic ( class generic -- )
+M: generic update-generic
     [ changed-call-sites ]
     [ remake-generic drop ]
     [ changed-conditionally drop ]
     2tri ;
 
-M: sequence update-methods ( class seq -- )
+M: sequence update-methods
     implementors [ update-generic ] with each ;
 
 HOOK: recompile compiler-impl ( words -- alist )
@@ -66,15 +67,18 @@ HOOK: process-forgotten-words compiler-impl ( words -- )
 : compile ( words -- )
     recompile t f modify-code-heap ;
 
+: filter-word-defs ( defset -- words )
+    members [ word? ] filter ;
+
 ! Non-optimizing compiler
 M: f update-call-sites
     2drop { } ;
 
 M: f to-recompile
-    changed-definitions get members [ word? ] filter ;
+    changed-definitions get filter-word-defs ;
 
 M: f recompile
-    [ dup def>> ] { } map>assoc ;
+    [ def>> ] zip-with ;
 
 M: f process-forgotten-words drop ;
 
@@ -87,12 +91,12 @@ SYMBOL: definition-observers
 
 GENERIC: definitions-changed ( set obj -- )
 
-[ V{ } clone definition-observers set-global ]
-"compiler.units" add-startup-hook
+STARTUP-HOOK: [
+    V{ } clone definition-observers set-global
 
-! This goes here because vocabs cannot depend on init
-[ V{ } clone vocab-observers set-global ]
-"vocabs" add-startup-hook
+    ! This goes here because vocabs cannot depend on init
+    V{ } clone vocab-observers set-global
+]
 
 : add-definition-observer ( obj -- )
     definition-observers get push ;
@@ -116,8 +120,7 @@ M: object always-bump-effect-counter? drop f ;
 <PRIVATE
 
 : changed-vocabs ( set -- vocabs )
-    members [ word? ] filter
-    [ vocabulary>> dup [ lookup-vocab ] when ] map ;
+    filter-word-defs [ vocabulary>> dup [ lookup-vocab ] when ] map ;
 
 : updated-definitions ( -- set )
     HS{ } clone
@@ -128,8 +131,8 @@ M: object always-bump-effect-counter? drop f ;
     maybe-changed get union!
     dup changed-vocabs over adjoin-all ;
 
-: process-forgotten-definitions ( -- )
-    forgotten-definitions get members
+: process-forgotten-definitions ( forgotten-definitions -- )
+    members
     [ [ word? ] filter process-forgotten-words ]
     [ [ delete-definition-errors ] each ]
     bi ;
@@ -137,8 +140,9 @@ M: object always-bump-effect-counter? drop f ;
 : bump-effect-counter? ( -- ? )
     changed-effects get members
     maybe-changed get members
-    changed-definitions get members [ always-bump-effect-counter? ] filter
-    3array combine new-words get [ in? not ] curry any? ;
+    changed-definitions get members
+    [ always-bump-effect-counter? ] filter
+    3array union-all new-words get [ in? not ] curry any? ;
 
 : bump-effect-counter ( -- )
     bump-effect-counter? [
@@ -147,8 +151,8 @@ M: object always-bump-effect-counter? drop f ;
     ] when ;
 
 : notify-observers ( -- )
-    updated-definitions dup null?
-    [ drop ] [ notify-definition-observers notify-error-observers ] if ;
+    updated-definitions notify-definition-observers
+    notify-error-observers ;
 
 : update-existing? ( defs -- ? )
     new-words get [ in? not ] curry any? ;
@@ -161,8 +165,8 @@ M: object always-bump-effect-counter? drop f ;
         remake-generics
         to-recompile [
             recompile
-            update-tuples
-            process-forgotten-definitions
+            outdated-tuples get update-tuples
+            forgotten-definitions get process-forgotten-definitions
         ] keep update-existing? reset-pics? modify-code-heap
         bump-effect-counter
         notify-observers
@@ -175,7 +179,7 @@ M: nesting-observer definitions-changed
 
 : add-nesting-observer ( -- )
     new-words get nesting-observer boa
-    [ nesting-observer set ] [ add-definition-observer ] bi ;
+    [ nesting-observer namespaces:set ] [ add-definition-observer ] bi ;
 
 : remove-nesting-observer ( -- )
     nesting-observer get remove-definition-observer ;
@@ -183,24 +187,24 @@ M: nesting-observer definitions-changed
 PRIVATE>
 
 : with-nested-compilation-unit ( quot -- )
-    [
-        HS{ } clone changed-definitions set
-        HS{ } clone maybe-changed set
-        HS{ } clone changed-effects set
-        HS{ } clone outdated-generics set
-        H{ } clone outdated-tuples set
-        HS{ } clone new-words set
+    H{ } clone
+    HS{ } clone changed-definitions pick set-at
+    HS{ } clone maybe-changed pick set-at
+    HS{ } clone changed-effects pick set-at
+    HS{ } clone outdated-generics pick set-at
+    H{ } clone outdated-tuples pick set-at
+    HS{ } clone new-words pick set-at [
         add-nesting-observer
         [
             remove-nesting-observer
             finish-compilation-unit
-        ] [ ] cleanup
-    ] with-scope ; inline
+        ] finally
+    ] with-variables ; inline
 
 : with-compilation-unit ( quot -- )
-    [
-        <definitions> new-definitions set
-        <definitions> old-definitions set
-        HS{ } clone forgotten-definitions set
+    H{ } clone
+    <definitions> new-definitions pick set-at
+    <definitions> old-definitions pick set-at
+    HS{ } clone forgotten-definitions pick set-at [
         with-nested-compilation-unit
-    ] with-scope ; inline
+    ] with-variables ; inline