compiler.tree.propagation: don't constant-fold boa constructors of identity-tuple subclasses
parent
560c119cd2
commit
e6a15c0b33
|
@ -467,6 +467,12 @@ TUPLE: fold-boa-test-tuple { x read-only } { y read-only } { z read-only } ;
|
||||||
[ [ 1 2 3 fold-boa-test-tuple boa ] final-literals ]
|
[ [ 1 2 3 fold-boa-test-tuple boa ] final-literals ]
|
||||||
unit-test
|
unit-test
|
||||||
|
|
||||||
|
TUPLE: don't-fold-boa-test-tuple < identity-tuple ;
|
||||||
|
|
||||||
|
[ V{ f } ]
|
||||||
|
[ [ don't-fold-boa-test-tuple boa ] final-literals ]
|
||||||
|
unit-test
|
||||||
|
|
||||||
TUPLE: immutable-prop-test-tuple { x sequence read-only } ;
|
TUPLE: immutable-prop-test-tuple { x sequence read-only } ;
|
||||||
|
|
||||||
[ V{ T{ immutable-prop-test-tuple f "hey" } } ] [
|
[ V{ T{ immutable-prop-test-tuple f "hey" } } ] [
|
||||||
|
|
|
@ -34,17 +34,18 @@ IN: compiler.tree.propagation.slots
|
||||||
[ read-only>> [ value-info ] [ drop f ] if ] 2map
|
[ read-only>> [ value-info ] [ drop f ] if ] 2map
|
||||||
f prefix ;
|
f prefix ;
|
||||||
|
|
||||||
: (propagate-tuple-constructor) ( values class -- info )
|
: fold-<tuple-boa>? ( values class -- ? )
|
||||||
[ read-only-slots ] keep
|
[ rest-slice [ dup [ literal?>> ] when ] all? ]
|
||||||
over rest-slice [ dup [ literal?>> ] when ] all? [
|
[ identity-tuple class<= not ]
|
||||||
[ rest-slice ] dip fold-<tuple-boa>
|
bi* and ;
|
||||||
] [
|
|
||||||
<tuple-info>
|
: (propagate-<tuple-boa>) ( values class -- info )
|
||||||
] if ;
|
[ read-only-slots ] keep 2dup fold-<tuple-boa>?
|
||||||
|
[ [ rest-slice ] dip fold-<tuple-boa> ] [ <tuple-info> ] if ;
|
||||||
|
|
||||||
: propagate-<tuple-boa> ( #call -- infos )
|
: propagate-<tuple-boa> ( #call -- infos )
|
||||||
in-d>> unclip-last
|
in-d>> unclip-last
|
||||||
value-info literal>> first (propagate-tuple-constructor) 1array ;
|
value-info literal>> first (propagate-<tuple-boa>) 1array ;
|
||||||
|
|
||||||
: read-only-slot? ( n class -- ? )
|
: read-only-slot? ( n class -- ? )
|
||||||
all-slots [ offset>> = ] with find nip
|
all-slots [ offset>> = ] with find nip
|
||||||
|
|
Loading…
Reference in New Issue