compiler.tree.propagation: fix bug in constraints that caused retain stack overflow

db4
Slava Pestov 2009-11-13 03:22:57 -06:00
parent 8dd8d70500
commit 720c412431
4 changed files with 17 additions and 6 deletions

View File

@ -97,7 +97,7 @@ M: #phi propagate-before ( #phi -- )
constraints get last update-constraints ;
: branch-phi-constraints ( output values booleans -- )
{
{
{
{ { t } { f } }
[

View File

@ -39,8 +39,8 @@ M: true-constraint assume*
bi ;
M: true-constraint satisfied?
value>> value-info class>>
{ [ true-class? ] [ null-class? not ] } 1&& ;
value>> value-info*
[ class>> true-class? ] [ drop f ] if ;
TUPLE: false-constraint value ;
@ -52,8 +52,8 @@ M: false-constraint assume*
bi ;
M: false-constraint satisfied?
value>> value-info class>>
{ [ false-class? ] [ null-class? not ] } 1&& ;
value>> value-info*
[ class>> false-class? ] [ drop f ] if ;
! Class constraints
TUPLE: class-constraint value class ;

View File

@ -294,8 +294,11 @@ DEFER: (value-info-union)
! Assoc stack of current value --> info mapping
SYMBOL: value-infos
: value-info* ( value -- info ? )
resolve-copy value-infos get assoc-stack [ null-info or ] [ >boolean ] bi ; inline
: value-info ( value -- info )
resolve-copy value-infos get assoc-stack null-info or ;
value-info* drop ;
: set-value-info ( info value -- )
resolve-copy value-infos get last set-at ;

View File

@ -239,6 +239,14 @@ IN: compiler.tree.propagation.tests
] final-classes
] unit-test
[ ] [
[
dup dup dup [ 100 < ] [ drop f ] if dup
[ 2drop f ] [ 2drop f ] if
[ ] [ dup [ ] [ ] if ] if
] final-info drop
] unit-test
[ V{ fixnum } ] [
[ { fixnum } declare (clone) ] final-classes
] unit-test