78 lines
2.4 KiB
Factor
78 lines
2.4 KiB
Factor
! Copyright (C) 2008 Slava Pestov.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: fry assocs arrays byte-arrays strings accessors sequences
|
|
kernel slots classes.algebra classes.tuple classes.tuple.private
|
|
words math math.private combinators sequences.private namespaces
|
|
slots.private classes compiler.tree.propagation.info ;
|
|
IN: compiler.tree.propagation.slots
|
|
|
|
! Propagation of immutable slots and array lengths
|
|
|
|
! Revisit this code when delegation is removed and when complex
|
|
! numbers become tuples.
|
|
|
|
UNION: fixed-length-sequence array byte-array string ;
|
|
|
|
: sequence-constructor? ( word -- ? )
|
|
{ <array> <byte-array> (byte-array) <string> } memq? ;
|
|
|
|
: constructor-output-class ( word -- class )
|
|
{
|
|
{ <array> array }
|
|
{ <byte-array> byte-array }
|
|
{ (byte-array) byte-array }
|
|
{ <string> string }
|
|
} at ;
|
|
|
|
: propagate-sequence-constructor ( #call word -- infos )
|
|
[ in-d>> first <sequence-info> ]
|
|
[ constructor-output-class <class-info> ]
|
|
bi* value-info-intersect 1array ;
|
|
|
|
: tuple-constructor? ( word -- ? )
|
|
{ <tuple-boa> <complex> } memq? ;
|
|
|
|
: fold-<tuple-boa> ( values class -- info )
|
|
[ [ literal>> ] map ] dip prefix >tuple
|
|
<literal-info> ;
|
|
|
|
: (propagate-tuple-constructor) ( values class -- info )
|
|
[ [ value-info ] map ] dip [ read-only-slots ] keep
|
|
over rest-slice [ dup [ literal?>> ] when ] all? [
|
|
[ rest-slice ] dip fold-<tuple-boa>
|
|
] [
|
|
<tuple-info>
|
|
] if ;
|
|
|
|
: propagate-<tuple-boa> ( #call -- info )
|
|
in-d>> unclip-last
|
|
value-info literal>> first (propagate-tuple-constructor) ;
|
|
|
|
: propagate-<complex> ( #call -- info )
|
|
in-d>> [ value-info ] map complex <tuple-info> ;
|
|
|
|
: propagate-tuple-constructor ( #call word -- infos )
|
|
{
|
|
{ \ <tuple-boa> [ propagate-<tuple-boa> ] }
|
|
{ \ <complex> [ propagate-<complex> ] }
|
|
} case 1array ;
|
|
|
|
: read-only-slot? ( n class -- ? )
|
|
all-slots [ offset>> = ] with find nip
|
|
dup [ read-only>> ] when ;
|
|
|
|
: literal-info-slot ( slot object -- info/f )
|
|
2dup class read-only-slot?
|
|
[ swap slot <literal-info> ] [ 2drop f ] if ;
|
|
|
|
: length-accessor? ( slot info -- ? )
|
|
[ 1 = ] [ length>> ] bi* and ;
|
|
|
|
: value-info-slot ( slot info -- info' )
|
|
{
|
|
{ [ over 0 = ] [ 2drop fixnum <class-info> ] }
|
|
{ [ 2dup length-accessor? ] [ nip length>> ] }
|
|
{ [ dup literal?>> ] [ literal>> literal-info-slot ] }
|
|
[ [ 1- ] [ slots>> ] bi* ?nth ]
|
|
} cond [ object-info ] unless* ;
|