Fix stack effect redefinition
parent
5408191724
commit
6080c6e734
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ]
|
||||||
|
|
|
@ -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 ]
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
@ -730,4 +731,18 @@ SLOT: kex
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
[ 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
|
|
@ -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> ;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
[
|
[
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
Loading…
Reference in New Issue