:: split-code ( class generic -- quot/f )
class generic method :> my-method
my-method [ class generic bad-splitting ] unless
+ class generic my-method depends-on-method-is
generic dispatch# (picker) :> picker
[
picker call class instance?
:: split-method-call ( class generic -- quot/f )
class generic subclass-with-only-method [
- class generic depends-on-single-method
- generic split-code
+ [ class generic depends-on-single-method ]
+ [ generic split-code ] bi
] [ f ] if* ;
: inlining-standard-method ( #call word -- class/f method/f )
hashtables classes assocs locals specialized-arrays system
sorting math.libm math.floats.private math.integers.private
math.intervals quotations effects alien alien.data sets
-strings.private classes.tuple ;
+strings.private classes.tuple eval ;
FROM: math => float ;
SPECIALIZED-ARRAY: double
SPECIALIZED-ARRAY: void*
[ f ] [ [ { integer } declare >fixnum ] { >fixnum } inlined? ] unit-test
[ f ] [ [ { word } declare parent-word ] { parent-word } inlined? ] unit-test
+
+! Make sure guarded method inlining installs the right dependencies
+
+[ ] [
+ "IN: compiler.tree.propagation.tests
+ USING: kernel.private accessors ;
+ TUPLE: foo bar ;
+ UNION: ?foo foo POSTPONE: f ;
+ : baz ( ?foo -- bar ) { ?foo } declare bar>> ;" eval( -- )
+] unit-test
+
+[ 3 ] [ "USE: kernel IN: compiler.tree.propagation.tests 3 foo boa baz" eval( -- x ) ] unit-test
+
+[ ] [ "IN: compiler.tree.propagation.tests TUPLE: foo baz bar ;" eval( -- ) ] unit-test
+
+[ 3 ] [ "USE: kernel IN: compiler.tree.propagation.tests 2 3 foo boa baz" eval( -- x ) ] unit-test
M: depends-on-final satisfied?
class>> { [ class? ] [ final-class? ] } 1&& ;
-TUPLE: depends-on-single-method class generic ;
+TUPLE: depends-on-single-method method-class object-class generic ;
-: depends-on-single-method ( class generic -- )
- [ nip depends-on-conditionally ]
- [ \ depends-on-single-method add-conditional-dependency ] 2bi ;
+: depends-on-single-method ( method-class object-class generic -- )
+ [ nip [ depends-on-conditionally ] bi@ ]
+ [ \ depends-on-single-method add-conditional-dependency ] 3bi ;
:: subclass-with-only-method ( class generic -- subclass/f )
generic method-classes [ f ] [
] if-empty ;
M: depends-on-single-method satisfied?
- [ class>> ] [ generic>> ] bi subclass-with-only-method >boolean ;
+ [ method-class>> ] [ object-class>> ] [ generic>> ] tri
+ subclass-with-only-method = ;
+
+TUPLE: depends-on-method-is class generic method ;
+
+: depends-on-method-is ( class generic method -- )
+ [ [ depends-on-conditionally ] tri@ ]
+ [ \ depends-on-method-is add-conditional-dependency ] 3bi ;
+
+M: depends-on-method-is satisfied?
+ [ class>> ] [ generic>> method ] [ method>> ] tri = ;
: init-dependencies ( -- )
H{ } clone dependencies set