From 26f311279cf42f955b7f6e1061c842ba603b05f6 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 29 Jan 2010 21:53:14 +1300 Subject: [PATCH] Re-defining a tuple class now invalidates cached quotation stack effects --- basis/compiler/crossref/crossref.factor | 2 +- .../call-effect/call-effect-tests.factor | 13 +++++++++++++ .../propagation/known-words/known-words.factor | 2 +- .../compiler/tree/propagation/simple/simple.factor | 4 ++-- .../tree/propagation/transforms/transforms.factor | 2 +- .../stack-checker/dependencies/dependencies.factor | 12 ++++++------ basis/stack-checker/transforms/transforms.factor | 2 +- core/compiler/units/units.factor | 14 +++++++------- 8 files changed, 32 insertions(+), 19 deletions(-) diff --git a/basis/compiler/crossref/crossref.factor b/basis/compiler/crossref/crossref.factor index b7a48a9d51..72e2c07c34 100644 --- a/basis/compiler/crossref/crossref.factor +++ b/basis/compiler/crossref/crossref.factor @@ -36,7 +36,7 @@ compiled-generic-crossref [ H{ } clone ] initialize [ drop compiled-usage - [ nip class-dependency dependency>= ] assoc-filter + [ nip conditional-dependency dependency>= ] assoc-filter [ drop dependencies-satisfied? not ] assoc-filter ] { } assoc>map ; diff --git a/basis/compiler/tree/propagation/call-effect/call-effect-tests.factor b/basis/compiler/tree/propagation/call-effect/call-effect-tests.factor index 4a543fb87a..4b524fd0d4 100644 --- a/basis/compiler/tree/propagation/call-effect/call-effect-tests.factor +++ b/basis/compiler/tree/propagation/call-effect/call-effect-tests.factor @@ -79,3 +79,16 @@ TUPLE: a-tuple x ; [ ] [ "IN: compiler.tree.propagation.call-effect.tests USE: math : call(-redefine-test ( a -- c ) 1 + ;" eval( -- ) ] unit-test [ 1 3 test-quotatation inline-cache-invalidation-test ] [ T{ wrong-values f (( a b -- c )) } = ] must-fail-with + +! See if redefining a tuple class bumps effect counter +TUPLE: my-tuple a b c ; + +: my-quot ( -- quot ) [ my-tuple boa ] ; + +: my-word ( a b c q -- result ) call( a b c -- result ) ; + +[ T{ my-tuple f 1 2 3 } ] [ 1 2 3 my-quot my-word ] unit-test + +[ ] [ "IN: compiler.tree.propagation.call-effect.tests TUPLE: my-tuple a b ;" eval( -- ) ] unit-test + +[ 1 2 3 my-quot my-word ] [ wrong-values? ] must-fail-with diff --git a/basis/compiler/tree/propagation/known-words/known-words.factor b/basis/compiler/tree/propagation/known-words/known-words.factor index 2a84d41f3c..252c5d892b 100644 --- a/basis/compiler/tree/propagation/known-words/known-words.factor +++ b/basis/compiler/tree/propagation/known-words/known-words.factor @@ -318,7 +318,7 @@ generic-comparison-ops [ dup literal>> class? [ literal>> - [ class-dependency depends-on ] + [ conditional-dependency depends-on ] [ predicate-output-infos ] bi ] [ 2drop object-info ] if diff --git a/basis/compiler/tree/propagation/simple/simple.factor b/basis/compiler/tree/propagation/simple/simple.factor index 8df6621dc2..da973e785c 100644 --- a/basis/compiler/tree/propagation/simple/simple.factor +++ b/basis/compiler/tree/propagation/simple/simple.factor @@ -36,7 +36,7 @@ M: #declare propagate-before #! classes mentioned in the declaration are redefined, since #! now we're making assumptions but their definitions. declaration>> [ - [ class-dependency depends-on ] + [ conditional-dependency depends-on ] [ swap refine-value-info ] bi ] assoc-each ; @@ -111,7 +111,7 @@ M: #declare propagate-before #! class definition itself. [ in-d>> first value-info ] [ "predicating" word-prop ] bi* - [ nip class-dependency depends-on ] + [ nip conditional-dependency depends-on ] [ predicate-output-infos 1array ] 2bi ; : default-output-value-infos ( #call word -- infos ) diff --git a/basis/compiler/tree/propagation/transforms/transforms.factor b/basis/compiler/tree/propagation/transforms/transforms.factor index f387b2b1df..414c553290 100644 --- a/basis/compiler/tree/propagation/transforms/transforms.factor +++ b/basis/compiler/tree/propagation/transforms/transforms.factor @@ -163,7 +163,7 @@ ERROR: bad-partial-eval quot word ; : inline-new ( class -- quot/f ) dup tuple-class? [ - dup class-dependency depends-on + dup conditional-dependency depends-on [ all-slots [ initial>> literalize ] map ] [ tuple-layout '[ _ ] ] bi append >quotation diff --git a/basis/stack-checker/dependencies/dependencies.factor b/basis/stack-checker/dependencies/dependencies.factor index 838a97a944..97c151ac9d 100644 --- a/basis/stack-checker/dependencies/dependencies.factor +++ b/basis/stack-checker/dependencies/dependencies.factor @@ -7,13 +7,13 @@ IN: stack-checker.dependencies ! Words that the current quotation depends on SYMBOL: dependencies -SYMBOLS: inlined-dependency class-dependency flushed-dependency called-dependency ; +SYMBOLS: inlined-dependency conditional-dependency flushed-dependency called-dependency ; : index>= ( obj1 obj2 seq -- ? ) [ index ] curry bi@ >= ; : dependency>= ( how1 how2 -- ? ) - { called-dependency class-dependency flushed-dependency inlined-dependency } + { called-dependency conditional-dependency flushed-dependency inlined-dependency } index>= ; : strongest-dependency ( how1 how2 -- how ) @@ -42,14 +42,14 @@ SYMBOL: conditional-dependencies GENERIC: satisfied? ( dependency -- ? ) -: conditional-dependency ( ... class -- ) +: add-conditional-dependency ( ... class -- ) boa conditional-dependencies get dup [ push ] [ 2drop ] if ; inline TUPLE: depends-on-class<= class1 class2 ; : depends-on-class<= ( class1 class2 -- ) - \ depends-on-class<= conditional-dependency ; + \ depends-on-class<= add-conditional-dependency ; M: depends-on-class<= satisfied? [ class1>> ] [ class2>> ] bi class<= ; @@ -57,7 +57,7 @@ M: depends-on-class<= satisfied? TUPLE: depends-on-classes-disjoint class1 class2 ; : depends-on-classes-disjoint ( class1 class2 -- ) - \ depends-on-classes-disjoint conditional-dependency ; + \ depends-on-classes-disjoint add-conditional-dependency ; M: depends-on-classes-disjoint satisfied? [ class1>> ] [ class2>> ] bi classes-intersect? not ; @@ -65,7 +65,7 @@ M: depends-on-classes-disjoint satisfied? TUPLE: depends-on-method class generic method ; : depends-on-method ( class generic method -- ) - \ depends-on-method conditional-dependency ; + \ depends-on-method add-conditional-dependency ; M: depends-on-method satisfied? [ [ class>> ] [ generic>> ] bi method-for-class ] [ method>> ] bi eq? ; diff --git a/basis/stack-checker/transforms/transforms.factor b/basis/stack-checker/transforms/transforms.factor index 8610bbf66a..5426ac9e19 100644 --- a/basis/stack-checker/transforms/transforms.factor +++ b/basis/stack-checker/transforms/transforms.factor @@ -140,7 +140,7 @@ IN: stack-checker.transforms ! Constructors \ boa [ dup tuple-class? [ - dup class-dependency depends-on + dup conditional-dependency depends-on [ "boa-check" word-prop [ ] or ] [ tuple-layout '[ _ ] ] bi append diff --git a/core/compiler/units/units.factor b/core/compiler/units/units.factor index 40cb235e8a..21ab578ccc 100644 --- a/core/compiler/units/units.factor +++ b/core/compiler/units/units.factor @@ -54,8 +54,7 @@ M: generic update-generic ( class generic -- ) 2bi ; M: sequence update-methods ( class seq -- ) - [ [ predicate-word changed-call-sites ] with each ] - [ implementors [ update-generic ] with each ] 2bi ; + implementors [ update-generic ] with each ; HOOK: recompile compiler-impl ( words -- alist ) @@ -108,9 +107,9 @@ GENERIC: definitions-changed ( assoc obj -- ) ! inline caching : effect-counter ( -- n ) 47 special-object ; inline -GENERIC: bump-effect-counter* ( defspec -- ? ) +GENERIC: always-bump-effect-counter? ( defspec -- ? ) -M: object bump-effect-counter* drop f ; +M: object always-bump-effect-counter? drop f ;