From 5f5270ae90264169db53bbd8028384b8f758f4bd Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 5 Jan 2008 22:06:01 -0400 Subject: [PATCH] Cleaning up mixins --- core/classes/classes-tests.factor | 4 +++- core/classes/classes.factor | 2 +- core/classes/mixin/mixin.factor | 10 +++++++--- core/definitions/definitions.factor | 14 +++++++------- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/core/classes/classes-tests.factor b/core/classes/classes-tests.factor index c88141fd76..35cbef42be 100755 --- a/core/classes/classes-tests.factor +++ b/core/classes/classes-tests.factor @@ -2,7 +2,7 @@ USING: alien arrays definitions generic assocs hashtables io kernel math namespaces parser prettyprint sequences strings tools.test vectors words quotations classes io.streams.string classes.private classes.union classes.mixin classes.predicate -vectors definitions ; +vectors definitions source-files ; IN: temporary H{ } "s" set @@ -176,6 +176,8 @@ FORGET: forget-class-bug-2 DEFER: mixin-forget-test-g +[ "mixin-forget-test" forget-source ] with-compilation-unit + [ ] [ { "USING: sequences ;" diff --git a/core/classes/classes.factor b/core/classes/classes.factor index 63abec56f8..cf73148040 100755 --- a/core/classes/classes.factor +++ b/core/classes/classes.factor @@ -263,7 +263,7 @@ PRIVATE> uncache-classes dupd (define-class) ] keep cache-classes - r> [ changed-class ] [ drop ] if ; + r> [ update-methods ] [ drop ] if ; GENERIC: class ( object -- class ) inline diff --git a/core/classes/mixin/mixin.factor b/core/classes/mixin/mixin.factor index b56e3d771e..05d74b64c3 100755 --- a/core/classes/mixin/mixin.factor +++ b/core/classes/mixin/mixin.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2004, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: classes classes.union words kernel sequences -definitions prettyprint.backend combinators ; +definitions prettyprint.backend combinators arrays ; IN: classes.mixin PREDICATE: union-class mixin-class "mixin" word-prop ; @@ -52,6 +52,10 @@ M: mixin-instance equal? { [ t ] [ t ] } } cond 2nip ; +M: mixin-instance hashcode* + { mixin-instance-class mixin-instance-mixin } get-slots + 2array hashcode* ; + : ( class mixin -- definition ) { set-mixin-instance-class set-mixin-instance-mixin } mixin-instance construct ; @@ -71,5 +75,5 @@ M: mixin-instance definition drop f ; M: mixin-instance forget dup mixin-instance-class - swap mixin-instance-mixin - remove-mixin-instance ; + swap mixin-instance-mixin dup mixin-class? + [ remove-mixin-instance ] [ 2drop ] if ; diff --git a/core/definitions/definitions.factor b/core/definitions/definitions.factor index 055d969e66..694ee0c6f6 100755 --- a/core/definitions/definitions.factor +++ b/core/definitions/definitions.factor @@ -47,7 +47,7 @@ M: object redefined* drop ; GENERIC: update-methods ( class -- ) SYMBOL: changed-words -SYMBOL: changed-classes +! SYMBOL: changed-classes SYMBOL: old-definitions SYMBOL: new-definitions @@ -94,19 +94,19 @@ TUPLE: no-compilation-unit word ; [ no-compilation-unit ] unless* set-at ; -: changed-class ( class -- ) - dup changed-classes get - [ no-compilation-unit ] unless* - set-at ; +! : changed-class ( class -- ) +! dup changed-classes get +! [ no-compilation-unit ] unless* +! set-at ; : with-compilation-unit ( quot -- ) [ H{ } clone changed-words set - H{ } clone changed-classes set + ! H{ } clone changed-classes set new-definitions set 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 ] [ ] cleanup ] with-scope ; inline