: record-folding ( #call -- )
dup word>> predicate?
[ record-predicate-folding ]
- [ word>> add-depends-on-definition ]
+ [ word>> +definition+ depends-on ]
if ;
: cleanup-folding ( #call -- nodes )
: record-inlining ( #call -- )
dup method>>
[ add-method-dependency ]
- [ word>> add-depends-on-definition ] if ;
+ [ word>> +definition+ depends-on ] if ;
: cleanup-inlining ( #call -- nodes )
[ record-inlining ] [ body>> cleanup-tree ] bi ;
GENERIC: add-depends-on-class ( obj -- )
M: class add-depends-on-class
- add-depends-on-conditionally ;
+ +conditional+ depends-on ;
M: maybe add-depends-on-class
class>> add-depends-on-class ;
: propagate-predicate ( #call word -- infos )
[ in-d>> first value-info ]
[ "predicating" word-prop ] bi*
- [ nip add-depends-on-conditionally ]
+ [ nip +conditional+ depends-on ]
[ predicate-output-infos 1array ] 2bi ;
: default-output-value-infos ( #call word -- infos )
] [ 3drop ] if
] if ;
-: add-depends-on-effect ( word -- )
- +effect+ depends-on ;
-
-: add-depends-on-conditionally ( word -- )
- +conditional+ depends-on ;
-
-: add-depends-on-definition ( word -- )
- +definition+ depends-on ;
-
GENERIC: add-depends-on-c-type ( c-type -- )
M: void add-depends-on-c-type drop ;
-M: c-type-word add-depends-on-c-type add-depends-on-definition ;
+M: c-type-word add-depends-on-c-type +definition+ depends-on ;
M: array add-depends-on-c-type
- [ word? ] filter [ add-depends-on-definition ] each ;
+ [ word? ] filter [ +definition+ depends-on ] each ;
M: pointer add-depends-on-c-type
to>> add-depends-on-c-type ;
-! Generic words that the current quotation depends on
SYMBOL: generic-dependencies
: ?class-or ( class class/f -- class' )
generic-dependencies get
[ [ ?class-or ] change-at ] [ 2drop ] if* ;
-! Conditional dependencies are re-evaluated when classes change;
-! if any fail, the word is recompiled
SYMBOL: conditional-dependencies
GENERIC: satisfied? ( dependency -- ? )
TUPLE: depends-on-next-method class generic next-method ;
: add-depends-on-next-method ( class generic next-method -- )
- over add-depends-on-conditionally
+ over +conditional+ depends-on
depends-on-next-method add-conditional-dependency ;
M: depends-on-next-method satisfied?
TUPLE: depends-on-method class generic method ;
: add-depends-on-method ( class generic method -- )
- over add-depends-on-conditionally
+ over +conditional+ depends-on
depends-on-method add-conditional-dependency ;
M: depends-on-method satisfied?
TUPLE: depends-on-tuple-layout class layout ;
: add-depends-on-tuple-layout ( class layout -- )
- [ drop add-depends-on-conditionally ]
+ [ drop +conditional+ depends-on ]
[ depends-on-tuple-layout add-conditional-dependency ] 2bi ;
M: depends-on-tuple-layout satisfied?
TUPLE: depends-on-flushable word ;
: add-depends-on-flushable ( word -- )
- [ add-depends-on-conditionally ]
+ [ +conditional+ depends-on ]
[ depends-on-flushable add-conditional-dependency ] bi ;
M: depends-on-flushable satisfied?
TUPLE: depends-on-final class ;
: add-depends-on-final ( word -- )
- [ add-depends-on-conditionally ]
+ [ +conditional+ depends-on ]
[ depends-on-final add-conditional-dependency ] bi ;
M: depends-on-final satisfied?