]> gitweb.factorcode.org Git - factor.git/commitdiff
classes: If a tuple class with subclasses is redefined into something that's not...
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 31 Jan 2010 13:48:39 +0000 (02:48 +1300)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sun, 31 Jan 2010 13:48:39 +0000 (02:48 +1300)
16 files changed:
basis/bootstrap/image/image.factor
basis/classes/struct/struct.factor
core/bootstrap/primitives.factor
core/classes/algebra/algebra-docs.factor
core/classes/algebra/algebra.factor
core/classes/builtin/builtin.factor
core/classes/classes.factor
core/classes/intersection/intersection.factor
core/classes/mixin/mixin-tests.factor
core/classes/mixin/mixin.factor
core/classes/predicate/predicate-tests.factor
core/classes/predicate/predicate.factor
core/classes/tuple/tuple-tests.factor
core/classes/tuple/tuple.factor
core/compiler/units/units.factor
core/generic/generic-docs.factor

index 941b4149fa979f85888422d27f7d0d9ef9b3d08f..c99b047686501a5c3ed13e369a564ca222d3c36a 100644 (file)
@@ -5,12 +5,13 @@ hashtables.private io io.binary io.files io.encodings.binary
 io.pathnames kernel kernel.private math namespaces make parser
 prettyprint sequences strings sbufs vectors words quotations
 assocs system layouts splitting grouping growable classes
-classes.builtin classes.tuple classes.tuple.private vocabs
-vocabs.loader source-files definitions debugger
-quotations.private combinators combinators.short-circuit
-math.order math.private accessors slots.private
-generic.single.private compiler.units compiler.constants fry
-locals bootstrap.image.syntax generalizations ;
+classes.private classes.builtin classes.tuple
+classes.tuple.private vocabs vocabs.loader source-files
+definitions debugger quotations.private combinators
+combinators.short-circuit math.order math.private accessors
+slots.private generic.single.private compiler.units
+compiler.constants fry locals bootstrap.image.syntax
+generalizations ;
 IN: bootstrap.image
 
 : arch ( os cpu -- arch )
@@ -342,9 +343,7 @@ M: float '
 
 : t, ( -- ) t t-offset fixup ;
 
-M: f '
-    #! f is #define F RETAG(0,F_TYPE)
-    drop \ f type-number ;
+M: f ' drop \ f type-number ;
 
 :  0, ( -- )  0 >bignum '  0-offset fixup ;
 :  1, ( -- )  1 >bignum '  1-offset fixup ;
index cdd47cae9a1f8b85e98dbf9986369805444ddccc..fae39cd229e42baadb61d4692cf60281be6824e8 100644 (file)
@@ -1,12 +1,13 @@
 ! (c)Joe Groff, Daniel Ehrenberg bsd license
-USING: accessors alien alien.c-types alien.data alien.parser arrays
-byte-arrays classes classes.parser classes.tuple classes.tuple.parser
-classes.tuple.private combinators combinators.short-circuit
-combinators.smart cpu.architecture definitions functors.backend
-fry generalizations generic.parser kernel kernel.private lexer
-libc locals macros make math math.order parser quotations
-sequences slots slots.private specialized-arrays vectors words
-summary namespaces assocs vocabs.parser math.functions
+USING: accessors alien alien.c-types alien.data alien.parser
+arrays byte-arrays classes classes.private classes.parser
+classes.tuple classes.tuple.parser classes.tuple.private
+combinators combinators.short-circuit combinators.smart
+cpu.architecture definitions functors.backend fry
+generalizations generic.parser kernel kernel.private lexer libc
+locals macros make math math.order parser quotations sequences
+slots slots.private specialized-arrays vectors words summary
+namespaces assocs vocabs.parser math.functions
 classes.struct.bit-accessors bit-arrays ;
 QUALIFIED: math
 IN: classes.struct
index ecf66834cee652609283b76e7f7075dc452f7735..9366aa49c23c7d8ada0c493ce522e84377b2a140 100644 (file)
@@ -3,11 +3,12 @@
 USING: alien alien.strings arrays byte-arrays generic hashtables
 hashtables.private io io.encodings.ascii kernel math
 math.private math.order namespaces make parser sequences strings
-vectors words quotations assocs layouts classes classes.builtin
-classes.tuple classes.tuple.private kernel.private vocabs
-vocabs.loader source-files definitions slots classes.union
-classes.intersection classes.predicate compiler.units
-bootstrap.image.private io.files accessors combinators ;
+vectors words quotations assocs layouts classes classes.private
+classes.builtin classes.tuple classes.tuple.private
+kernel.private vocabs vocabs.loader source-files definitions
+slots classes.union classes.intersection classes.predicate
+compiler.units bootstrap.image.private io.files accessors
+combinators ;
 IN: bootstrap.primitives
 
 "Creating primitives and basic runtime structures..." print flush
index 7b931c80e8260326e2eb1bfe6f76d579671d16f7..2c286cb3f6b7711ed10ab7f184f819ded7fb58f6 100644 (file)
@@ -1,4 +1,4 @@
-USING: help.markup help.syntax kernel classes words\r
+USING: help.markup help.syntax kernel classes classes.private words\r
 checksums checksums.crc32 sequences math ;\r
 IN: classes.algebra\r
 \r
index 30697eb6a8661c09180275b0bfe208bcacb8c8d1..543a2f7420092a929eb974274a5453b60f36bcf9 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2004, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel classes combinators accessors sequences arrays
-vectors assocs namespaces words sorting layouts math hashtables
-kernel.private sets math.order ;
+USING: kernel classes classes.private combinators accessors
+sequences arrays vectors assocs namespaces words sorting layouts
+math hashtables kernel.private sets math.order ;
 IN: classes.algebra
 
 <PRIVATE
index fd14a64e35d74245fff30cd8629b215facca3755..c324ba7d52853c6f3a1dc0679ee79277b8ef58ab 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2004, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors classes classes.algebra classes.algebra.private
-words kernel kernel.private namespaces sequences math
-math.private combinators assocs quotations ;
+USING: accessors classes classes.private classes.algebra
+classes.algebra.private words kernel kernel.private namespaces
+sequences math math.private combinators assocs quotations ;
 IN: classes.builtin
 
 SYMBOL: builtins
index 8bf1648f8ff6164f56b0c119388da63d5b0d5f0f..6d68ad7fb4ef5a02d2a13f1d4679215d82718f04 100644 (file)
@@ -8,6 +8,10 @@ IN: classes
 
 ERROR: bad-inheritance class superclass ;
 
+PREDICATE: class < word "class" word-prop ;
+
+<PRIVATE
+
 SYMBOL: class<=-cache
 SYMBOL: class-not-cache
 SYMBOL: classes-intersect-cache
@@ -35,7 +39,23 @@ SYMBOL: update-map
 
 SYMBOL: implementors-map
 
-PREDICATE: class < word "class" word-prop ;
+GENERIC: rank-class ( class -- n )
+
+GENERIC: reset-class ( class -- )
+
+M: class reset-class
+    {
+        "class"
+        "metaclass"
+        "superclass"
+        "members"
+        "participants"
+        "predicate"
+    } reset-props ;
+
+M: word reset-class drop ;
+
+PRIVATE>
 
 : classes ( -- seq ) implementors-map get keys ;
 
@@ -65,8 +85,11 @@ M: predicate reset-word
 : superclasses ( class -- supers )
     [ superclass ] follow reverse ;
 
+: superclass-of? ( class superclass -- ? )
+    superclasses member-eq? ;
+
 : subclass-of? ( class superclass -- ? )
-    swap superclasses member? ;
+    swap superclass-of? ;
 
 : members ( class -- seq )
     #! Output f for non-classes to work with algebra code
@@ -76,22 +99,6 @@ M: predicate reset-word
     #! Output f for non-classes to work with algebra code
     dup class? [ "participants" word-prop ] [ drop f ] if ;
 
-GENERIC: rank-class ( class -- n )
-
-GENERIC: reset-class ( class -- )
-
-M: class reset-class
-    {
-        "class"
-        "metaclass"
-        "superclass"
-        "members"
-        "participants"
-        "predicate"
-    } reset-props ;
-
-M: word reset-class drop ;
-
 GENERIC: implementors ( class/classes -- seq )
 
 ! update-map
@@ -107,6 +114,10 @@ GENERIC: implementors ( class/classes -- seq )
 
 : class-usages ( class -- seq ) [ class-usage ] closure keys ;
 
+M: class implementors implementors-map get at keys ;
+
+M: sequence implementors [ implementors ] gather ;
+
 <PRIVATE
 
 : update-map+ ( class -- )
@@ -115,12 +126,8 @@ GENERIC: implementors ( class/classes -- seq )
 : update-map- ( class -- )
     dup class-uses update-map get remove-vertex ;
 
-M: class implementors implementors-map get at keys ;
-
-M: sequence implementors [ implementors ] gather ;
-
 : implementors-map+ ( class -- )
-    H{ } clone swap implementors-map get set-at ;
+    [ H{ } clone ] dip implementors-map get set-at ;
 
 : implementors-map- ( class -- )
     implementors-map get delete-at ;
@@ -135,31 +142,39 @@ M: sequence implementors [ implementors ] gather ;
         } spread
     ] H{ } make-assoc ;
 
+GENERIC: metaclass-changed ( use class -- )
+
+: ?metaclass-changed ( class usages/f -- )
+    dup [ [ metaclass-changed ] with each ] [ 2drop ] if ;
+
+: check-metaclass ( class metaclass -- usages/f )
+    over class? [
+        over "metaclass" word-prop eq?
+        [ drop f ] [ class-usage keys ] if
+    ] [ 2drop f ] if ;
+
 : ?define-symbol ( word -- )
     dup deferred? [ define-symbol ] [ drop ] if ;
 
 : (define-class) ( word props -- )
     reset-caches
-    [ drop update-map- ]
-    [
+    2dup "metaclass" swap at check-metaclass
+    {
+        [ 2drop update-map- ]
+        [ 2drop dup class? [ reset-class ] [ implementors-map+ ] if ]
+        [ 2drop ?define-symbol ]
+        [ drop [ assoc-union ] curry change-props drop ]
         [
-            {
-                [ dup class? [ drop ] [ implementors-map+ ] if ]
-                [ reset-class ]
-                [ ?define-symbol ]
-                [ ]
-            } cleave
-        ] dip [ assoc-union ] curry change-props
-        dup create-predicate-word
-        [ 1quotation "predicate" set-word-prop ]
-        [ swap "predicating" set-word-prop ]
-        [ drop t "class" set-word-prop ]
-        2tri
-    ]
-    [ drop update-map+ ]
-    2tri ;
-
-PRIVATE>
+            2drop
+            dup create-predicate-word
+            [ 1quotation "predicate" set-word-prop ]
+            [ swap "predicating" set-word-prop ]
+            2bi
+        ]
+        [ 2drop t "class" set-word-prop ]
+        [ 2drop update-map+ ]
+        [ nip ?metaclass-changed ]
+    } 3cleave ;
 
 GENERIC: update-class ( class -- )
 
@@ -172,7 +187,7 @@ GENERIC: update-methods ( class seq -- )
     [ nip [ update-class ] each ] [ update-methods ] 2bi ;
 
 : check-inheritance ( subclass superclass -- )
-    2dup superclasses member-eq? [ bad-inheritance ] [ 2drop ] if ;
+    2dup superclass-of? [ bad-inheritance ] [ 2drop ] if ;
 
 : define-class ( word superclass members participants metaclass -- )
     [ 2dup check-inheritance ] 3dip
@@ -188,21 +203,21 @@ GENERIC: update-methods ( class seq -- )
 
 GENERIC: forget-methods ( class -- )
 
-GENERIC: class-forgotten ( use class -- )
+PRIVATE>
 
 : forget-class ( class -- )
-    {
-        [ dup class-usage keys [ class-forgotten ] with each ]
-        [ forget-predicate ]
-        [ forget-methods ]
-        [ implementors-map- ]
-        [ update-map- ]
-        [ reset-class ]
-    } cleave
-    reset-caches ;
-
-M: class class-forgotten
-    nip forget-class ;
+    dup f check-metaclass {
+        [ drop forget-predicate ]
+        [ drop forget-methods ]
+        [ drop implementors-map- ]
+        [ drop update-map- ]
+        [ drop reset-class ]
+        [ 2drop reset-caches ]
+        [ ?metaclass-changed ]
+    } 2cleave ;
+
+M: class metaclass-changed
+    swap class? [ drop ] [ forget-class ] if ;
 
 M: class forget* ( class -- )
     [ call-next-method ] [ forget-class ] bi ;
index 242f099ea090c1bd2e1642f09c0bbbb1e2812893..a3c1d5d60714a96dfab3947624c3b373924d7051 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2004, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: words accessors sequences kernel assocs combinators classes
-classes.algebra classes.algebra.private classes.builtin
-namespaces arrays math quotations ;
+USING: words accessors sequences kernel assocs combinators
+classes classes.private classes.algebra classes.algebra.private
+classes.builtin namespaces arrays math quotations ;
 IN: classes.intersection
 
 PREDICATE: intersection-class < class
index d174bb55ade6b191987b61d75398047c819b5520..056914939272963e2b2269c132640a77e29bdda7 100644 (file)
@@ -128,3 +128,23 @@ SYMBOL: not-a-mixin
 TUPLE: a-class ;
 
 [ [ \ a-class \ not-a-mixin add-mixin-instance ] with-compilation-unit ] must-fail
+
+! Changing a mixin member's metaclass should not remove it from the mixin
+MIXIN: metaclass-change-mixin
+TUPLE: metaclass-change ;
+INSTANCE: metaclass-change metaclass-change-mixin
+
+GENERIC: metaclass-change-generic ( a -- b )
+
+M: metaclass-change-mixin metaclass-change-generic ;
+
+[ T{ metaclass-change } ] [ T{ metaclass-change } metaclass-change-generic ] unit-test
+
+[ ] [ "IN: classes.mixin.tests USE: math UNION: metaclass-change integer ;" eval( -- ) ] unit-test
+
+[ 0 ] [ 0 metaclass-change-generic ] unit-test
+
+! Forgetting a mixin member class should remove it from the mixin
+[ ] [ [ metaclass-change forget-class ] with-compilation-unit ] unit-test
+
+[ t ] [ metaclass-change-mixin members empty? ] unit-test
index 8a48a25160bdbebb7f6ea63b21fa62ed8ca4f55d..fa0a6e8d3753ebd6f6ebe2a1af53ea36f8bda95a 100644 (file)
@@ -1,8 +1,9 @@
 ! Copyright (C) 2004, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: classes classes.algebra classes.algebra.private
-classes.union classes.union.private words kernel sequences
-definitions combinators arrays assocs generic accessors ;
+USING: classes classes.private classes.algebra
+classes.algebra.private classes.union classes.union.private
+words kernel sequences definitions combinators arrays assocs
+generic accessors ;
 IN: classes.mixin
 
 PREDICATE: mixin-class < union-class "mixin" word-prop ;
@@ -75,7 +76,8 @@ M: class add-mixin-instance
 : remove-mixin-instance ( class mixin -- )
     [ (remove-mixin-instance) ] [ 2drop ] if-mixin-member? ;
 
-M: mixin-class class-forgotten remove-mixin-instance ;
+M: mixin-class metaclass-changed
+    over class? [ 2drop ] [ remove-mixin-instance ] if ;
 
 : define-mixin-class ( class -- )
     dup mixin-class? [
index a37b674b3b9b01ed32142b1d8dd617ec4081ce6c..7a63b88a655f4bd10b993d439a034fb94a9df162 100644 (file)
@@ -1,5 +1,6 @@
 USING: math tools.test classes.algebra words kernel sequences assocs
-accessors eval definitions compiler.units generic strings classes ;
+accessors eval definitions compiler.units generic strings classes
+generic.single ;
 IN: classes.predicate.tests
 
 PREDICATE: negative < integer 0 < ;
@@ -59,3 +60,30 @@ PREDICATE: tup < string ;
 UNION: u tup ;
 
 [ ] [ "IN: classes.predicate.tests PREDICATE: u < tup ;" eval( -- ) ] unit-test
+
+! Changing the metaclass of the predicate superclass should work
+GENERIC: change-meta-test ( a -- b )
+
+TUPLE: change-meta-test-class length ;
+
+PREDICATE: change-meta-test-predicate < change-meta-test-class length>> 2 > ;
+
+M: change-meta-test-predicate change-meta-test length>> ;
+
+[ f ] [ \ change-meta-test "methods" word-prop assoc-empty? ] unit-test
+
+[ T{ change-meta-test-class f 0 } change-meta-test ] [ no-method? ] must-fail-with
+[ 7 ] [ T{ change-meta-test-class f 7 } change-meta-test ] unit-test
+
+[ ] [ "IN: classes.predicate.tests USE: arrays UNION: change-meta-test-class array ;" eval( -- ) ] unit-test
+
+! Should not have changed
+[ change-meta-test-class ] [ change-meta-test-predicate superclass ] unit-test
+[ { } change-meta-test ] [ no-method? ] must-fail-with
+[ 4 ] [ { 1 2 3 4 } change-meta-test ] unit-test
+
+[ ] [ [ \ change-meta-test-class forget-class ] with-compilation-unit ] unit-test
+
+[ f ] [ change-meta-test-predicate class? ] unit-test
+
+[ t ] [ \ change-meta-test "methods" word-prop assoc-empty? ] unit-test
index c0dfb4efa0990b807dee63bdac5e1c1b66deb6af..25feac7989787e04caa40745b4c3766e6905c6bf 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2004, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: classes classes.algebra classes.algebra.private kernel
-namespaces make words sequences quotations arrays kernel.private
-assocs combinators ;
+USING: classes classes.private classes.algebra
+classes.algebra.private kernel namespaces make words sequences
+quotations arrays kernel.private assocs combinators ;
 IN: classes.predicate
 
 PREDICATE: predicate-class < class
index aa99ac3194df4651cc1d86a9a8b35307c3685af6..c4c2e83e95ee3ab9b10fc72a82be0664cef95025 100644 (file)
@@ -511,58 +511,6 @@ TUPLE: another-forget-accessors-test ;
 ! Missing error check
 [ "IN: classes.tuple.tests USE: words TUPLE: wrong-superclass < word ;" eval( -- ) ] must-fail
 
-! Class forget messyness
-TUPLE: subclass-forget-test ;
-
-TUPLE: subclass-forget-test-1 < subclass-forget-test ;
-TUPLE: subclass-forget-test-2 < subclass-forget-test ;
-TUPLE: subclass-forget-test-3 < subclass-forget-test-2 ;
-
-[ ] [ "IN: classes.tuple.tests FORGET: subclass-forget-test" eval( -- ) ] unit-test
-
-[ { subclass-forget-test-2 } ]
-[ subclass-forget-test-2 class-usages ]
-unit-test
-
-[ { subclass-forget-test-3 } ]
-[ subclass-forget-test-3 class-usages ]
-unit-test
-
-[ f ] [ subclass-forget-test-1 tuple-class? ] unit-test
-[ f ] [ subclass-forget-test-2 tuple-class? ] unit-test
-[ subclass-forget-test-3 new ] must-fail
-
-[ "IN: classes.tuple.tests TUPLE: subclass-forget-test-4 < subclass-forget-test-2 ;" eval( -- ) ] must-fail
-
-! More
-DEFER: subclass-reset-test
-DEFER: subclass-reset-test-1
-DEFER: subclass-reset-test-2
-DEFER: subclass-reset-test-3
-
-GENERIC: break-me ( obj -- )
-
-[ ] [ [ M\ integer break-me forget ] with-compilation-unit ] unit-test
-
-[ ] [ "IN: classes.tuple.tests TUPLE: subclass-reset-test ;" <string-reader> "subclass-reset-test" parse-stream drop ] unit-test
-[ ] [ "IN: classes.tuple.tests TUPLE: subclass-reset-test-1 < subclass-reset-test ;" eval( -- ) ] unit-test
-[ ] [ "IN: classes.tuple.tests TUPLE: subclass-reset-test-2 < subclass-reset-test ;" eval( -- ) ] unit-test
-[ ] [ "IN: classes.tuple.tests TUPLE: subclass-reset-test-3 < subclass-reset-test-2 ;" 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
-
-[ f ] [ subclass-reset-test-1 tuple-class? ] unit-test
-[ f ] [ subclass-reset-test-2 tuple-class? ] unit-test
-[ subclass-forget-test-3 new ] must-fail
-
-[ t ] [ \ break-me "methods" word-prop assoc-empty? ] unit-test
-
-[ ] [ "IN: classes.tuple.tests USE: math USE: kernel M: integer break-me drop ;" eval( -- ) ] unit-test
-
-[ f ] [ \ break-me "methods" word-prop assoc-empty? ] unit-test
-
 ! Insufficient type checking
 [ \ vocab tuple>array drop ] must-fail
 
@@ -784,3 +732,25 @@ TUPLE: code-heap-ref ;
 ! Data heap reference
 [ t ] [ \ code-heap-ref' def>> first code-heap-ref? ] unit-test
 [ 5 ] [ \ code-heap-ref' def>> first x>> ] unit-test
+
+! If the metaclass of a superclass changes into something other
+! than a tuple class, the tuple needs to have its superclass reset
+TUPLE: metaclass-change ;
+TUPLE: metaclass-change-subclass < metaclass-change ;
+
+[ metaclass-change ] [ metaclass-change-subclass superclass ] unit-test
+
+[ ] [ "IN: classes.tuple.tests MIXIN: metaclass-change" eval( -- ) ] unit-test
+
+[ t ] [ metaclass-change-subclass tuple-class? ] unit-test
+[ tuple ] [ metaclass-change-subclass superclass ] unit-test
+
+! Reshaping bug related to the above
+TUPLE: a-g ;
+TUPLE: g < a-g ;
+
+[ ] [ g new "g" set ] unit-test
+
+[ ] [ "IN: classes.tuple.tests MIXIN: a-g TUPLE: g ;" eval( -- ) ] unit-test
+
+[ t ] [ g new layout-of "g" get layout-of eq? ] unit-test
index 620c65c8655473552b784d6ee18db8184211f314..e3b51267139f3945b625a5f98fbed4b1d89b954e 100644 (file)
@@ -13,9 +13,6 @@ PREDICATE: tuple-class < class
 
 ERROR: not-a-tuple object ;
 
-: check-tuple ( object -- tuple )
-    dup tuple? [ not-a-tuple ] unless ; inline
-
 : all-slots ( class -- slots )
     superclasses [ "slots" word-prop ] map concat ;
 
@@ -35,6 +32,9 @@ M: tuple class layout-of 2 slot { word } declare ; inline
 : tuple-size ( tuple -- size )
     layout-of 3 slot { fixnum } declare ; inline
 
+: check-tuple ( object -- tuple )
+    dup tuple? [ not-a-tuple ] unless ; inline
+
 : prepare-tuple>array ( tuple -- n tuple layout )
     check-tuple [ tuple-size iota ] [ ] [ layout-of ] tri ;
 
@@ -49,14 +49,14 @@ M: tuple class layout-of 2 slot { word } declare ; inline
         ] 2each
     ] if-bootstrapping ; inline
 
-PRIVATE>
-
 : initial-values ( class -- slots )
     all-slots [ initial>> ] map ;
 
 : pad-slots ( slots class -- slots' class )
     [ initial-values over length tail append ] keep ; inline
 
+PRIVATE>
+
 : tuple>array ( tuple -- array )
     prepare-tuple>array
     [ copy-tuple-slots ] dip
@@ -247,6 +247,9 @@ M: class valid-superclass? drop f ;
 
 GENERIC# (define-tuple-class) 2 ( class superclass slots -- )
 
+: thrower-effect ( slots -- effect )
+    [ name>> ] map { "*" } <effect> ;
+
 PRIVATE>
 
 : define-tuple-class ( class superclass slots -- )
@@ -261,9 +264,6 @@ M: tuple-class (define-tuple-class)
     3dup tuple-class-unchanged?
     [ 2drop ?define-symbol ] [ redefine-tuple-class ] if ;
 
-: thrower-effect ( slots -- effect )
-    [ name>> ] map { "*" } <effect> ;
-
 : define-error-class ( class superclass slots -- )
     [ define-tuple-class ]
     [ 2drop reset-generic ]
@@ -293,6 +293,11 @@ M: tuple-class reset-class
         bi
     ] bi ;
 
+M: tuple-class metaclass-changed
+    ! Our superclass is no longer a tuple class, redefine with
+    ! default superclass
+    nip tuple over "slots" word-prop define-tuple-class ;
+
 M: tuple-class rank-class drop 0 ;
 
 M: tuple-class instance?
index 9fe13ba3ed69e3722c5490d421b08ee0b797f649..07f8494a59345efce32ae8f9cd968d01c4234f4d 100644 (file)
@@ -1,10 +1,9 @@
 ! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays kernel continuations assocs namespaces
-sequences words vocabs definitions hashtables init sets
-math math.order classes classes.algebra classes.tuple
-classes.tuple.private generic source-files.errors
-kernel.private ;
+sequences words vocabs definitions hashtables init sets math
+math.order classes classes.private classes.algebra classes.tuple
+classes.tuple.private generic source-files.errors kernel.private ;
 IN: compiler.units
 
 SYMBOL: old-definitions
index 240fdd96e0aab3c1a3a899adabe8baa3f182fed7..f4edb5e8babed5b3ea7265fded880071a7307f9d 100644 (file)
@@ -163,10 +163,6 @@ HELP: create-method
 { $description "Creates a method or returns an existing one. This is the runtime equivalent of " { $link POSTPONE: M: } "." }
 { $notes "To define a method, pass the output value to " { $link define } "." } ;
 
-HELP: forget-methods
-{ $values { "class" class } }
-{ $description "Remove all method definitions which specialize on the class." } ;
-
 { sort-classes order } related-words
 
 HELP: (call-next-method)