USING: accessors alien arrays byte-arrays classes.algebra classes.struct compiler.tree.propagation.copy compiler.tree.propagation.info io.encodings.utf8 kernel literals math math.intervals namespaces sequences sequences.private tools.test ; IN: compiler.tree.propagation.info.tests { f } [ 0.0 -0.0 eql? ] unit-test ! value-info-intersect { t t } [ 0 10 [a,b] 5 20 [a,b] value-info-intersect [ class>> real class= ] [ interval>> 5 10 [a,b] = ] bi ] unit-test { float 10.0 t } [ 10.0 10.0 value-info-intersect [ class>> ] [ >literal< ] bi ] unit-test { null } [ 10 10.0 value-info-intersect class>> ] unit-test { fixnum 10 t } [ 10 10 value-info-union [ class>> ] [ >literal< ] bi ] unit-test { 3.0 t } [ 3 3 [a,b] float value-info-intersect >literal< ] unit-test { 3 t } [ 2 3 (a,b] fixnum value-info-intersect >literal< ] unit-test { T{ value-info-state f null empty-interval f f } } [ fixnum -10 0 [a,b] fixnum 19 29 [a,b] value-info-intersect ] unit-test TUPLE: test-tuple { x read-only } ; { t } [ f f 3 3array test-tuple dup object-info value-info-intersect = ] unit-test { t t } [ f fixnum 0 40 [a,b] value-info-union \ f class-not value-info-intersect [ class>> fixnum class= ] [ interval>> 0 40 [a,b] = ] bi ] unit-test ! refine-value-info { $[ fixnum array-capacity-interval ] } [ H{ { 1234 1234 } } copies set { H{ { 1234 $[ fixnum ] } } } value-infos set integer array-capacity-interval 1234 refine-value-info 1234 value-info ] unit-test ! value-info-union { 3 t } [ 3 null-info value-info-union >literal< ] unit-test { } [ { } value-infos-union drop ] unit-test ! interval>literal { 10 t } [ fixnum 10 10 [a,b] interval>literal ] unit-test STRUCT: self { s self* } ; TUPLE: tup1 foo ; TUPLE: tup2 < tup1 bar ; : make-slotted-info ( slot-classes class -- info ) [ [ dup [ ] when ] map ] dip ; ! slots<= { t t f } [ null-info null-info slots<= { byte-array } self make-slotted-info self slots<= self { byte-array } self make-slotted-info slots<= ] unit-test ! value-info<= ! ------------ ! Comparing classes { t t } [ byte-array c-ptr [ ] bi@ value-info<= alien c-ptr [ ] bi@ value-info<= ] unit-test ! Literals vs. classes { t f } [ 20 fixnum value-info<= fixnum 20 value-info<= ] unit-test ! Nulls vs. literals { t f } [ null-info 3 value-info<= 3 null-info value-info<= ] unit-test ! Fulls vs. literal { t } [ 10 f value-info<= ] unit-test ! Same class, different slots { t t f } [ { byte-array } self make-slotted-info { c-ptr } self make-slotted-info value-info<= { byte-array byte-array } self make-slotted-info { } self make-slotted-info value-info<= { } self make-slotted-info { byte-array byte-array } self make-slotted-info value-info<= ] unit-test ! Slots with literals { f } [ 10 1array array 20 1array array value-info<= ] unit-test ! Slots, but different classes { t } [ null-info { f c-ptr } self make-slotted-info value-info<= ] unit-test ! Null vs. null vs. full { t t f } [ null-info null-info value-info<= null-info f value-info<= f null-info value-info<= ] unit-test ! Same class, intervals { t f } [ fixnum 20 30 [a,b] fixnum 0 100 [a,b] value-info<= fixnum 0 100 [a,b] fixnum 20 30 [a,b] value-info<= ] unit-test ! Different classes, intervals { t f f } [ fixnum 20 30 [a,b] real 0 100 [a,b] value-info<= real 5 10 [a,b] integer 0 20 [a,b] value-info<= integer 0 20 [a,b] real 5 10 [a,b] value-info<= ] unit-test ! Mutable literals { f f } [ [ "foo" ] [ "foo" ] value-info<= "hey" "hey" value-info<= ] unit-test ! Tuples { t f } [ tup2 tup1 value-info<= tup1 tup2 value-info<= ] unit-test ! { utf8 } [ utf8 class>> ] unit-test ! init-interval { T{ value-info-state { class array-capacity } { interval $[ array-capacity-interval ] } } } [ -100 100 [a,b] >>interval array-capacity >>class init-interval ] unit-test ! wrap-interval ${ full-interval empty-interval fixnum-interval array-capacity-interval array-capacity-interval -100 100 [a,b] } [ full-interval integer wrap-interval empty-interval integer wrap-interval full-interval fixnum wrap-interval fixnum-interval array-capacity wrap-interval -100 100 [a,b] array-capacity wrap-interval -100 100 [a,b] integer wrap-interval ] unit-test