Fix stack effect redefinition

db4
Slava Pestov 2009-03-22 20:16:31 -05:00
parent 5408191724
commit 6080c6e734
11 changed files with 64 additions and 34 deletions

View File

@ -4,7 +4,7 @@ sequences system libc alien.strings io.encodings.utf8 ;
\ expand-constants must-infer \ expand-constants must-infer
: xyz 123 ; CONSTANT: xyz 123
[ { "blah" 123 } ] [ { "blah" xyz } expand-constants ] unit-test [ { "blah" 123 } ] [ { "blah" xyz } expand-constants ] unit-test

View File

@ -35,11 +35,14 @@ SYMBOLS: +optimized+ +unoptimized+ ;
[ usage [ word? ] filter ] [ compiled-usage keys ] if [ usage [ word? ] filter ] [ compiled-usage keys ] if
[ queue-compile ] each ; [ queue-compile ] each ;
: ripple-up? ( word status -- ? ) : ripple-up? ( status word -- ? )
swap "compiled-status" word-prop [ = not ] keep and ; [
[ nip changed-effects get key? ]
[ "compiled-status" word-prop eq? not ] 2bi or
] keep "compiled-status" word-prop and ;
: save-compiled-status ( word status -- ) : save-compiled-status ( word status -- )
[ dupd ripple-up? [ ripple-up ] [ drop ] if ] [ over ripple-up? [ ripple-up ] [ drop ] if ]
[ "compiled-status" set-word-prop ] [ "compiled-status" set-word-prop ]
2bi ; 2bi ;

View File

@ -1,12 +1,14 @@
IN: compiler.tests IN: compiler.tests
USING: compiler compiler.units tools.test math parser kernel USING: compiler compiler.units tools.test math parser kernel
sequences sequences.private classes.mixin generic definitions sequences sequences.private classes.mixin generic definitions
arrays words assocs eval ; arrays words assocs eval words.symbol ;
DEFER: redefine2-test DEFER: redefine2-test
[ ] [ "USE: sequences USE: kernel IN: compiler.tests TUPLE: redefine2-test ; M: redefine2-test nth 2drop 3 ; INSTANCE: redefine2-test sequence" eval ] unit-test [ ] [ "USE: sequences USE: kernel IN: compiler.tests TUPLE: redefine2-test ; M: redefine2-test nth 2drop 3 ; INSTANCE: redefine2-test sequence" eval ] unit-test
[ t ] [ \ redefine2-test symbol? ] unit-test
[ t ] [ redefine2-test new sequence? ] unit-test [ t ] [ redefine2-test new sequence? ] unit-test
[ 3 ] [ 0 redefine2-test new nth-unsafe ] unit-test [ 3 ] [ 0 redefine2-test new nth-unsafe ] unit-test

View File

@ -197,7 +197,7 @@ M: fixnum annotate-entry-test-1 drop ;
[ dup annotate-entry-test-1 1+ ] dip (annotate-entry-test-2) [ dup annotate-entry-test-1 1+ ] dip (annotate-entry-test-2)
] if ; inline recursive ] if ; inline recursive
: annotate-entry-test-2 0 -rot (annotate-entry-test-2) ; inline : annotate-entry-test-2 ( from to -- ) 0 -rot (annotate-entry-test-2) ; inline
[ f ] [ [ f ] [
[ { bignum } declare annotate-entry-test-2 ] [ { bignum } declare annotate-entry-test-2 ]

View File

@ -1,4 +1,4 @@
! Copyright (C) 2004, 2008 Slava Pestov. ! Copyright (C) 2004, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays definitions assocs kernel kernel.private USING: accessors arrays definitions assocs kernel kernel.private
slots.private namespaces make sequences strings words words.symbol slots.private namespaces make sequences strings words words.symbol
@ -126,14 +126,19 @@ M: sequence implementors [ implementors ] gather ;
} spread } spread
] H{ } make-assoc ; ] H{ } make-assoc ;
: ?define-symbol ( word -- )
dup deferred? [ define-symbol ] [ drop ] if ;
: (define-class) ( word props -- ) : (define-class) ( word props -- )
[ [
dup class? [ dup [ implementors-map+ ] [ new-class ] bi ] unless {
dup reset-class [ dup class? [ drop ] [ [ implementors-map+ ] [ new-class ] bi ] if ]
dup deferred? [ dup define-symbol ] when [ reset-class ]
dup redefined [ ?define-symbol ]
dup props>> [ redefined ]
] dip assoc-union >>props [ ]
} cleave
] dip [ assoc-union ] curry change-props
dup predicate-word dup predicate-word
[ 1quotation "predicate" set-word-prop ] [ 1quotation "predicate" set-word-prop ]
[ swap "predicating" set-word-prop ] [ swap "predicating" set-word-prop ]

View File

@ -4,7 +4,8 @@ namespaces quotations sequences.private classes continuations
generic.standard effects classes.tuple classes.tuple.private generic.standard effects classes.tuple classes.tuple.private
arrays vectors strings compiler.units accessors classes.algebra arrays vectors strings compiler.units accessors classes.algebra
calendar prettyprint io.streams.string splitting summary calendar prettyprint io.streams.string splitting summary
columns math.order classes.private slots slots.private eval see ; columns math.order classes.private slots slots.private eval see
words.symbol ;
IN: classes.tuple.tests IN: classes.tuple.tests
TUPLE: rect x y w h ; TUPLE: rect x y w h ;
@ -62,7 +63,7 @@ TUPLE: predicate-test ;
C: <predicate-test> predicate-test C: <predicate-test> predicate-test
: predicate-test drop f ; : predicate-test ( a -- ? ) drop f ;
[ t ] [ <predicate-test> predicate-test? ] unit-test [ t ] [ <predicate-test> predicate-test? ] unit-test
@ -97,7 +98,7 @@ TUPLE: size-test a b c d ;
size-test tuple-layout second = size-test tuple-layout second =
] unit-test ] unit-test
GENERIC: <yo-momma> GENERIC: <yo-momma> ( a -- b )
TUPLE: yo-momma ; TUPLE: yo-momma ;
@ -123,7 +124,7 @@ TUPLE: loc-recording ;
TUPLE: forget-robustness ; TUPLE: forget-robustness ;
GENERIC: forget-robustness-generic GENERIC: forget-robustness-generic ( a -- b )
M: forget-robustness forget-robustness-generic ; M: forget-robustness forget-robustness-generic ;
@ -493,7 +494,7 @@ must-fail-with
[ t ] [ "z" accessor-exists? ] unit-test [ t ] [ "z" accessor-exists? ] unit-test
[ [ ] ] [ [ [ ] ] [
"IN: classes.tuple.tests GENERIC: forget-accessors-test" "IN: classes.tuple.tests GENERIC: forget-accessors-test ( a -- b )"
<string-reader> <string-reader>
"forget-accessors-test" parse-stream "forget-accessors-test" parse-stream
] unit-test ] unit-test
@ -508,7 +509,7 @@ TUPLE: another-forget-accessors-test ;
[ [ ] ] [ [ [ ] ] [
"IN: classes.tuple.tests GENERIC: another-forget-accessors-test" "IN: classes.tuple.tests GENERIC: another-forget-accessors-test ( a -- b )"
<string-reader> <string-reader>
"another-forget-accessors-test" parse-stream "another-forget-accessors-test" parse-stream
] unit-test ] unit-test
@ -567,7 +568,7 @@ GENERIC: break-me ( obj -- )
[ ] [ "IN: classes.tuple.tests USE: kernel M: subclass-reset-test-1 break-me drop ;" eval ] unit-test [ ] [ "IN: classes.tuple.tests USE: kernel M: subclass-reset-test-1 break-me drop ;" eval ] unit-test
[ ] [ "IN: classes.tuple.tests : subclass-reset-test ;" <string-reader> "subclass-reset-test" parse-stream drop ] unit-test [ ] [ "IN: classes.tuple.tests : subclass-reset-test ( -- ) ;" <string-reader> "subclass-reset-test" parse-stream drop ] unit-test
[ f ] [ subclass-reset-test-1 tuple-class? ] unit-test [ f ] [ subclass-reset-test-1 tuple-class? ] unit-test
[ f ] [ subclass-reset-test-2 tuple-class? ] unit-test [ f ] [ subclass-reset-test-2 tuple-class? ] unit-test
@ -666,7 +667,7 @@ DEFER: error-y
[ ] [ [ \ error-y dup class? [ forget-class ] [ drop ] if ] with-compilation-unit ] unit-test [ ] [ [ \ error-y dup class? [ forget-class ] [ drop ] if ] with-compilation-unit ] unit-test
[ ] [ "IN: classes.tuple.tests GENERIC: error-y" eval ] unit-test [ ] [ "IN: classes.tuple.tests GENERIC: error-y ( a -- b )" eval ] unit-test
[ f ] [ \ error-y tuple-class? ] unit-test [ f ] [ \ error-y tuple-class? ] unit-test
@ -731,3 +732,17 @@ SLOT: kex
[ t ] [ \ change-slot-test \ kex>> method >boolean ] unit-test [ t ] [ \ change-slot-test \ kex>> method >boolean ] unit-test
[ f ] [ \ change-slot-test \ kex>> method "reading" word-prop ] unit-test [ f ] [ \ change-slot-test \ kex>> method "reading" word-prop ] unit-test
DEFER: redefine-tuple-twice
[ ] [ "IN: classes.tuple.tests TUPLE: redefine-tuple-twice ;" eval ] unit-test
[ t ] [ \ redefine-tuple-twice symbol? ] unit-test
[ ] [ "IN: classes.tuple.tests DEFER: redefine-tuple-twice" eval ] unit-test
[ t ] [ \ redefine-tuple-twice deferred? ] unit-test
[ ] [ "IN: classes.tuple.tests TUPLE: redefine-tuple-twice ;" eval ] unit-test
[ t ] [ \ redefine-tuple-twice symbol? ] unit-test

View File

@ -247,8 +247,7 @@ M: tuple-class update-class
bi bi
] each-subclass ] each-subclass
] ]
[ define-new-tuple-class ] [ define-new-tuple-class ] 3bi ;
3bi ;
: tuple-class-unchanged? ( class superclass slots -- ? ) : tuple-class-unchanged? ( class superclass slots -- ? )
[ [ superclass ] [ bootstrap-word ] bi* = ] [ [ superclass ] [ bootstrap-word ] bi* = ]
@ -275,7 +274,7 @@ M: word (define-tuple-class)
M: tuple-class (define-tuple-class) M: tuple-class (define-tuple-class)
3dup tuple-class-unchanged? 3dup tuple-class-unchanged?
[ 3drop ] [ redefine-tuple-class ] if ; [ 2drop ?define-symbol ] [ redefine-tuple-class ] if ;
: thrower-effect ( slots -- effect ) : thrower-effect ( slots -- effect )
[ dup array? [ first ] when ] map { "*" } <effect> ; [ dup array? [ first ] when ] map { "*" } <effect> ;

View File

@ -148,6 +148,7 @@ GENERIC: definitions-changed ( assoc obj -- )
[ [
H{ } clone changed-definitions set H{ } clone changed-definitions set
H{ } clone changed-generics set H{ } clone changed-generics set
H{ } clone changed-effects set
H{ } clone outdated-generics set H{ } clone outdated-generics set
H{ } clone outdated-tuples set H{ } clone outdated-tuples set
H{ } clone new-classes set H{ } clone new-classes set
@ -158,6 +159,7 @@ GENERIC: definitions-changed ( assoc obj -- )
[ [
H{ } clone changed-definitions set H{ } clone changed-definitions set
H{ } clone changed-generics set H{ } clone changed-generics set
H{ } clone changed-effects set
H{ } clone outdated-generics set H{ } clone outdated-generics set
H{ } clone forgotten-definitions set H{ } clone forgotten-definitions set
H{ } clone outdated-tuples set H{ } clone outdated-tuples set

View File

@ -1,13 +1,11 @@
! Copyright (C) 2006, 2008 Slava Pestov. ! Copyright (C) 2006, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
IN: definitions
USING: kernel sequences namespaces assocs graphs math math.order ; USING: kernel sequences namespaces assocs graphs math math.order ;
IN: definitions
ERROR: no-compilation-unit definition ; ERROR: no-compilation-unit definition ;
SYMBOL: inlined-dependency SYMBOLS: inlined-dependency flushed-dependency called-dependency ;
SYMBOL: flushed-dependency
SYMBOL: called-dependency
: set-in-unit ( value key assoc -- ) : set-in-unit ( value key assoc -- )
[ set-at ] [ no-compilation-unit ] if* ; [ set-at ] [ no-compilation-unit ] if* ;
@ -17,6 +15,11 @@ SYMBOL: changed-definitions
: changed-definition ( defspec -- ) : changed-definition ( defspec -- )
inlined-dependency swap changed-definitions get set-in-unit ; inlined-dependency swap changed-definitions get set-in-unit ;
SYMBOL: changed-effects
: changed-effect ( word -- )
dup changed-effects get set-in-unit ;
SYMBOL: changed-generics SYMBOL: changed-generics
SYMBOL: outdated-generics SYMBOL: outdated-generics

View File

@ -199,8 +199,7 @@ M: sequence update-methods ( class seq -- )
2cleave 2cleave
] if ] if
] ]
[ 2drop remake-generic ] [ 2drop remake-generic ] 3tri ;
3tri ;
M: generic subwords M: generic subwords
[ [

View File

@ -164,8 +164,10 @@ CONSTANT: reset-on-redefine { "inferred-effect" "cannot-infer" }
: set-stack-effect ( effect word -- ) : set-stack-effect ( effect word -- )
2dup "declared-effect" word-prop = [ 2drop ] [ 2dup "declared-effect" word-prop = [ 2drop ] [
swap swap
[ drop changed-effect ]
[ "declared-effect" set-word-prop ] [ "declared-effect" set-word-prop ]
[ drop dup primitive? [ dup redefined ] unless drop ] 2bi [ drop dup primitive? [ drop ] [ redefined ] if ]
2tri
] if ; ] if ;
: define-declared ( word def effect -- ) : define-declared ( word def effect -- )
@ -192,7 +194,7 @@ M: word reset-word
{ {
"unannotated-def" "parsing" "inline" "recursive" "unannotated-def" "parsing" "inline" "recursive"
"foldable" "flushable" "reading" "writing" "reader" "foldable" "flushable" "reading" "writing" "reader"
"writer" "declared-effect" "delimiter" "writer" "delimiter"
} reset-props ; } reset-props ;
GENERIC: subwords ( word -- seq ) GENERIC: subwords ( word -- seq )