]> gitweb.factorcode.org Git - factor.git/commitdiff
classes.struct: better redefinition behavior.
authorJohn Benediktsson <mrjbq7@gmail.com>
Sat, 15 Jan 2022 01:33:35 +0000 (17:33 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Sat, 15 Jan 2022 01:33:35 +0000 (17:33 -0800)
basis/classes/struct/struct.factor
core/classes/tuple/tuple.factor

index d450b0d67d24354048af313518807b7867fbf61b..3696cb948bba1d8f617a7d07af2d13ac523467c8 100644 (file)
@@ -6,12 +6,13 @@ DEFER: struct-slots ! for stack-checker
 DEFER: struct-class? ! for stack-checker
 DEFER: <struct-boa> ! for stack-checker
 USING: accessors alien alien.c-types alien.data alien.parser
-arrays byte-arrays classes classes.parser classes.private
+arrays assocs byte-arrays classes classes.parser classes.private
 classes.struct.bit-accessors classes.tuple classes.tuple.parser
-combinators combinators.smart cpu.architecture definitions
-delegate.private effects functors.backend generalizations generic
-generic.parser io kernel kernel.private lexer libc math
-math.order parser quotations sequences slots slots.private
+classes.tuple.private combinators combinators.smart
+cpu.architecture definitions delegate.private effects
+functors.backend generalizations generic generic.parser io
+kernel kernel.private lexer libc math math.order parser
+quotations sequences sequences.private slots slots.private
 specialized-arrays stack-checker.dependencies summary vectors
 vocabs.loader vocabs.parser words ;
 
@@ -283,7 +284,24 @@ M: struct binary-zero? binary-object uchar <c-direct-array> [ 0 = ] all? ; inlin
     [ type>> lookup-c-type drop ] each ;
 
 : redefine-struct-tuple-class ( class -- )
-    [ struct f define-tuple-class ] [ make-final ] bi ;
+    [ struct f redefine-tuple-class ] [ make-final ] bi ;
+
+: resize-underlying ( struct -- )
+    [ 2 slot ]
+    [ class-of "struct-size" word-prop '[ _ swap resize ] [ f ] if* ]
+    [ 2 set-slot ] tri ;
+
+M: struct update-tuple
+    ! make sure underlying byte-array is correct size, but maybe
+    ! has incorrect contents... is there something better to do?
+    [ resize-underlying ] [ call-next-method ] bi ;
+
+: forget-struct-slot-accessors ( class -- )
+    dup "c-type" word-prop [
+        dup struct-c-type? [
+            fields>> forget-slot-accessors
+        ] [ 2drop ] if
+    ] [ drop ] if* ;
 
 :: (define-struct-class) ( class slot-specs offsets-quot alignment-quot -- )
     slot-specs check-struct-slots
@@ -295,6 +313,8 @@ M: struct binary-zero? binary-object uchar <c-direct-array> [ 0 = ] all? ; inlin
 
     class slot-specs size alignment c-type-for-class :> c-type
 
+    class forget-struct-slot-accessors
+
     c-type class typedef
     class slot-specs define-accessors
     class size "struct-size" set-word-prop
@@ -329,11 +349,10 @@ ERROR: invalid-struct-slot token ;
 
 M: struct-class reset-class
     {
-        [ dup "c-type" word-prop fields>> forget-slot-accessors ]
-        [
-            [ forget-struct-slot-values-method ]
-            [ forget-clone-method ] bi
-        ]
+        [ \ <struct-boa> def>> first delete-at ]
+        [ forget-struct-slot-accessors ]
+        [ forget-struct-slot-values-method ]
+        [ forget-clone-method ]
         [ { "c-type" "layout" "struct-size" } remove-word-props ]
         [ call-next-method ]
     } cleave ;
index a78dc52a3a8b6240e11b347a042d3fc375926ddf..2aa5a4e8f3b30e40cc9254bf1e02c18949d19d4c 100644 (file)
@@ -227,7 +227,9 @@ SYMBOL: outdated-tuples
     compute-slot-permutation
     apply-slot-permutation ;
 
-: update-tuple ( tuple -- newtuple )
+GENERIC: update-tuple ( tuple -- newtuple )
+
+M: tuple update-tuple
     [ tuple-slots ] [ layout-of ] bi
     [ permute-slots ] [ first ] bi
     slots>tuple ;
@@ -239,7 +241,7 @@ SYMBOL: outdated-tuples
 
 : update-tuples ( outdated-tuples -- )
     dup assoc-empty? [ drop ] [
-        [ [ tuple? ] instances ] dip [ outdated-tuple? ] curry filter
+        '[ dup tuple? [ _ outdated-tuple? ] [ drop f ] if ] instances
         dup [ update-tuple ] map become
     ] if ;