Cleaning up mixins

db4
Slava Pestov 2008-01-05 22:06:01 -04:00
parent 825601ccc7
commit 5f5270ae90
4 changed files with 18 additions and 12 deletions

View File

@ -2,7 +2,7 @@ USING: alien arrays definitions generic assocs hashtables io
kernel math namespaces parser prettyprint sequences strings kernel math namespaces parser prettyprint sequences strings
tools.test vectors words quotations classes io.streams.string tools.test vectors words quotations classes io.streams.string
classes.private classes.union classes.mixin classes.predicate classes.private classes.union classes.mixin classes.predicate
vectors definitions ; vectors definitions source-files ;
IN: temporary IN: temporary
H{ } "s" set H{ } "s" set
@ -176,6 +176,8 @@ FORGET: forget-class-bug-2
DEFER: mixin-forget-test-g DEFER: mixin-forget-test-g
[ "mixin-forget-test" forget-source ] with-compilation-unit
[ ] [ [ ] [
{ {
"USING: sequences ;" "USING: sequences ;"

View File

@ -263,7 +263,7 @@ PRIVATE>
uncache-classes uncache-classes
dupd (define-class) dupd (define-class)
] keep cache-classes ] keep cache-classes
r> [ changed-class ] [ drop ] if ; r> [ update-methods ] [ drop ] if ;
GENERIC: class ( object -- class ) inline GENERIC: class ( object -- class ) inline

View File

@ -1,7 +1,7 @@
! Copyright (C) 2004, 2008 Slava Pestov. ! Copyright (C) 2004, 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: classes classes.union words kernel sequences USING: classes classes.union words kernel sequences
definitions prettyprint.backend combinators ; definitions prettyprint.backend combinators arrays ;
IN: classes.mixin IN: classes.mixin
PREDICATE: union-class mixin-class "mixin" word-prop ; PREDICATE: union-class mixin-class "mixin" word-prop ;
@ -52,6 +52,10 @@ M: mixin-instance equal?
{ [ t ] [ t ] } { [ t ] [ t ] }
} cond 2nip ; } cond 2nip ;
M: mixin-instance hashcode*
{ mixin-instance-class mixin-instance-mixin } get-slots
2array hashcode* ;
: <mixin-instance> ( class mixin -- definition ) : <mixin-instance> ( class mixin -- definition )
{ set-mixin-instance-class set-mixin-instance-mixin } { set-mixin-instance-class set-mixin-instance-mixin }
mixin-instance construct ; mixin-instance construct ;
@ -71,5 +75,5 @@ M: mixin-instance definition drop f ;
M: mixin-instance forget M: mixin-instance forget
dup mixin-instance-class dup mixin-instance-class
swap mixin-instance-mixin swap mixin-instance-mixin dup mixin-class?
remove-mixin-instance ; [ remove-mixin-instance ] [ 2drop ] if ;

View File

@ -47,7 +47,7 @@ M: object redefined* drop ;
GENERIC: update-methods ( class -- ) GENERIC: update-methods ( class -- )
SYMBOL: changed-words SYMBOL: changed-words
SYMBOL: changed-classes ! SYMBOL: changed-classes
SYMBOL: old-definitions SYMBOL: old-definitions
SYMBOL: new-definitions SYMBOL: new-definitions
@ -94,19 +94,19 @@ TUPLE: no-compilation-unit word ;
[ no-compilation-unit ] unless* [ no-compilation-unit ] unless*
set-at ; set-at ;
: changed-class ( class -- ) ! : changed-class ( class -- )
dup changed-classes get ! dup changed-classes get
[ no-compilation-unit ] unless* ! [ no-compilation-unit ] unless*
set-at ; ! set-at ;
: with-compilation-unit ( quot -- ) : with-compilation-unit ( quot -- )
[ [
H{ } clone changed-words set H{ } clone changed-words set
H{ } clone changed-classes set ! H{ } clone changed-classes set
<definitions> new-definitions set <definitions> new-definitions set
<definitions> old-definitions set <definitions> old-definitions set
[ [
changed-classes get keys [ update-methods ] each ! changed-classes get keys [ update-methods ] each
changed-words get keys recompile-hook get call changed-words get keys recompile-hook get call
] [ ] cleanup ] [ ] cleanup
] with-scope ; inline ] with-scope ; inline