Propagate slot types of literals

db4
Slava Pestov 2008-09-01 18:25:21 -05:00
parent 3b24b52673
commit 669e0f8f0a
3 changed files with 47 additions and 9 deletions

View File

@ -59,10 +59,38 @@ slots ;
: <value-info> ( -- info ) \ value-info new ; : <value-info> ( -- info ) \ value-info new ;
: read-only-slots ( values class -- slots )
#! Delegation.
all-slots rest-slice
[ read-only>> [ drop f ] unless ] 2map
{ f f } prepend ;
DEFER: <literal-info>
: init-literal-info ( info -- info )
#! Delegation.
dup literal>> class >>class
dup literal>> dup real? [ [a,a] >>interval ] [
[ [-inf,inf] >>interval ] dip
{
{ [ dup complex? ] [
[ real-part <literal-info> ]
[ imaginary-part <literal-info> ] bi
2array >>slots
] }
{ [ dup tuple? ] [
[
tuple-slots rest-slice
[ <literal-info> ] map
] [ class ] bi read-only-slots >>slots
] }
[ drop ]
} cond
] if ; inline
: init-value-info ( info -- info ) : init-value-info ( info -- info )
dup literal?>> [ dup literal?>> [
dup literal>> class >>class init-literal-info
dup literal>> dup real? [ [a,a] ] [ drop [-inf,inf] ] if >>interval
] [ ] [
dup [ class>> null-class? ] [ interval>> empty-interval eq? ] bi or [ dup [ class>> null-class? ] [ interval>> empty-interval eq? ] bi or [
null >>class null >>class
@ -73,7 +101,7 @@ slots ;
dup [ class>> ] [ interval>> ] bi interval>literal dup [ class>> ] [ interval>> ] bi interval>literal
[ >>literal ] [ >>literal? ] bi* [ >>literal ] [ >>literal? ] bi*
] if ] if
] if ; ] if ; inline
: <class/interval-info> ( class interval -- info ) : <class/interval-info> ( class interval -- info )
<value-info> <value-info>

View File

@ -411,6 +411,14 @@ TUPLE: mixed-mutable-immutable { x integer } { y sequence read-only } ;
] final-classes ] final-classes
] unit-test ] unit-test
[ V{ integer array } ] [
[
[ 2drop T{ mixed-mutable-immutable f 3 { } } ]
[ { array } declare mixed-mutable-immutable boa ] if
[ x>> ] [ y>> ] bi
] final-classes
] unit-test
! Recursive propagation ! Recursive propagation
: recursive-test-1 ( a -- b ) recursive-test-1 ; inline recursive : recursive-test-1 ( a -- b ) recursive-test-1 ; inline recursive
@ -573,6 +581,14 @@ MIXIN: empty-mixin
[ V{ fixnum } ] [ [ [ bignum-shift drop ] keep ] final-classes ] unit-test [ V{ fixnum } ] [ [ [ bignum-shift drop ] keep ] final-classes ] unit-test
[ V{ float } ] [
[
[ { float float } declare <complex> ]
[ 2drop C{ 0.0 0.0 } ]
if real-part
] final-classes
] unit-test
! [ V{ string } ] [ ! [ V{ string } ] [
! [ dup string? t xor [ "A" throw ] [ ] if ] final-classes ! [ dup string? t xor [ "A" throw ] [ ] if ] final-classes
! ] unit-test ! ] unit-test

View File

@ -31,12 +31,6 @@ UNION: fixed-length-sequence array byte-array string ;
: tuple-constructor? ( word -- ? ) : tuple-constructor? ( word -- ? )
{ <tuple-boa> <complex> } memq? ; { <tuple-boa> <complex> } memq? ;
: read-only-slots ( values class -- slots )
#! Delegation.
all-slots rest-slice
[ read-only>> [ drop f ] unless ] 2map
{ f f } prepend ;
: fold-<tuple-boa> ( values class -- info ) : fold-<tuple-boa> ( values class -- info )
[ , f , [ literal>> ] map % ] { } make >tuple [ , f , [ literal>> ] map % ] { } make >tuple
<literal-info> ; <literal-info> ;