Fold class predicates applied to literals
							parent
							
								
									2e48915f9c
								
							
						
					
					
						commit
						f539406ee1
					
				|  | @ -8,7 +8,7 @@ math.functions math.private strings layouts | ||||||
| compiler.tree.propagation.info compiler.tree.def-use | compiler.tree.propagation.info compiler.tree.def-use | ||||||
| compiler.tree.debugger compiler.tree.checker | compiler.tree.debugger compiler.tree.checker | ||||||
| slots.private words hashtables classes assocs locals | slots.private words hashtables classes assocs locals | ||||||
| float-arrays ; | float-arrays system ; | ||||||
| IN: compiler.tree.propagation.tests | IN: compiler.tree.propagation.tests | ||||||
| 
 | 
 | ||||||
| \ propagate must-infer | \ propagate must-infer | ||||||
|  | @ -590,6 +590,8 @@ MIXIN: empty-mixin | ||||||
| 
 | 
 | ||||||
| [ V{ float-array } ] [ [| | F{ } ] final-classes ] unit-test | [ V{ float-array } ] [ [| | F{ } ] final-classes ] unit-test | ||||||
| 
 | 
 | ||||||
|  | [ V{ t } ] [ [ netbsd unix? ] final-literals ] 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 | ||||||
|  |  | ||||||
|  | @ -76,13 +76,25 @@ M: #declare propagate-before | ||||||
| : fold-call ( #call word -- ) | : fold-call ( #call word -- ) | ||||||
|     [ (fold-call) ] [ drop out-d>> ] 2bi set-value-infos ; |     [ (fold-call) ] [ drop out-d>> ] 2bi set-value-infos ; | ||||||
| 
 | 
 | ||||||
| : predicate-output-infos ( info class -- info ) | : predicate-output-infos/literal ( info class -- info ) | ||||||
|  |     [ literal>> ] dip | ||||||
|  |     '[ _ _ instance? <literal-info> ] | ||||||
|  |     [ drop object-info ] | ||||||
|  |     recover ; | ||||||
|  | 
 | ||||||
|  | : predicate-output-infos/class ( info class -- info ) | ||||||
|     [ class>> ] dip { |     [ class>> ] dip { | ||||||
|         { [ 2dup class<= ] [ t <literal-info> ] } |         { [ 2dup class<= ] [ t <literal-info> ] } | ||||||
|         { [ 2dup classes-intersect? not ] [ f <literal-info> ] } |         { [ 2dup classes-intersect? not ] [ f <literal-info> ] } | ||||||
|         [ object-info ] |         [ object-info ] | ||||||
|     } cond 2nip ; |     } cond 2nip ; | ||||||
| 
 | 
 | ||||||
|  | : predicate-output-infos ( info class -- info ) | ||||||
|  |     over literal?>> | ||||||
|  |     [ predicate-output-infos/literal ] | ||||||
|  |     [ predicate-output-infos/class ] | ||||||
|  |     if ; | ||||||
|  | 
 | ||||||
| : propagate-predicate ( #call word -- infos ) | : propagate-predicate ( #call word -- infos ) | ||||||
|     #! We need to force the caller word to recompile when the class |     #! We need to force the caller word to recompile when the class | ||||||
|     #! is redefined, since now we're making assumptions but the |     #! is redefined, since now we're making assumptions but the | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue