Fix serialization of circular structure
							parent
							
								
									4e0c0dab49
								
							
						
					
					
						commit
						ea2723a5a0
					
				| 
						 | 
					@ -73,7 +73,7 @@ IN: db.postgresql.lib
 | 
				
			||||||
        sql-spec-type {
 | 
					        sql-spec-type {
 | 
				
			||||||
            { FACTOR-BLOB [
 | 
					            { FACTOR-BLOB [
 | 
				
			||||||
                dup [
 | 
					                dup [
 | 
				
			||||||
                    binary [ serialize ] with-byte-writer
 | 
					                    object>bytes
 | 
				
			||||||
                    malloc-byte-array/length ] [ 0 ] if ] }
 | 
					                    malloc-byte-array/length ] [ 0 ] if ] }
 | 
				
			||||||
            { BLOB [
 | 
					            { BLOB [
 | 
				
			||||||
                dup [ malloc-byte-array/length ] [ 0 ] if ] }
 | 
					                dup [ malloc-byte-array/length ] [ 0 ] if ] }
 | 
				
			||||||
| 
						 | 
					@ -164,7 +164,7 @@ M: postgresql-malloc-destructor dispose ( obj -- )
 | 
				
			||||||
        { BLOB [ pq-get-blob ] }
 | 
					        { BLOB [ pq-get-blob ] }
 | 
				
			||||||
        { FACTOR-BLOB [
 | 
					        { FACTOR-BLOB [
 | 
				
			||||||
            pq-get-blob
 | 
					            pq-get-blob
 | 
				
			||||||
            dup [ binary [ deserialize ] with-byte-reader ] when ] }
 | 
					            dup [ bytes>object ] when ] }
 | 
				
			||||||
        [ no-sql-type ]
 | 
					        [ no-sql-type ]
 | 
				
			||||||
    } case ;
 | 
					    } case ;
 | 
				
			||||||
    ! PQgetlength PQgetisnull
 | 
					    ! PQgetlength PQgetisnull
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,7 +94,7 @@ IN: db.sqlite.lib
 | 
				
			||||||
        { TIMESTAMP [ sqlite-bind-text-by-name ] }
 | 
					        { TIMESTAMP [ sqlite-bind-text-by-name ] }
 | 
				
			||||||
        { BLOB [ sqlite-bind-blob-by-name ] }
 | 
					        { BLOB [ sqlite-bind-blob-by-name ] }
 | 
				
			||||||
        { FACTOR-BLOB [
 | 
					        { FACTOR-BLOB [
 | 
				
			||||||
            binary [ serialize ] with-byte-writer
 | 
					            object>bytes
 | 
				
			||||||
            sqlite-bind-blob-by-name
 | 
					            sqlite-bind-blob-by-name
 | 
				
			||||||
        ] }
 | 
					        ] }
 | 
				
			||||||
        { +native-id+ [ sqlite-bind-int-by-name ] }
 | 
					        { +native-id+ [ sqlite-bind-int-by-name ] }
 | 
				
			||||||
| 
						 | 
					@ -131,7 +131,7 @@ IN: db.sqlite.lib
 | 
				
			||||||
        { BLOB [ sqlite-column-blob ] }
 | 
					        { BLOB [ sqlite-column-blob ] }
 | 
				
			||||||
        { FACTOR-BLOB [
 | 
					        { FACTOR-BLOB [
 | 
				
			||||||
            sqlite-column-blob
 | 
					            sqlite-column-blob
 | 
				
			||||||
            dup [ binary [ deserialize ] with-byte-reader ] when
 | 
					            dup [ bytes>object ] when
 | 
				
			||||||
        ] }
 | 
					        ] }
 | 
				
			||||||
        ! { NULL [ 2drop f ] }
 | 
					        ! { NULL [ 2drop f ] }
 | 
				
			||||||
        [ no-sql-type ]
 | 
					        [ no-sql-type ]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					USING: assocs words sequences arrays compiler tools.time
 | 
				
			||||||
 | 
					io.styles io prettyprint vocabs kernel sorting generator
 | 
				
			||||||
 | 
					optimizer math ;
 | 
				
			||||||
 | 
					IN: report.optimizer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: count-optimization-passes ( nodes n -- n )
 | 
				
			||||||
 | 
					    >r optimize-1
 | 
				
			||||||
 | 
					    [ r> 1+ count-optimization-passes ] [ drop r> ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: results
 | 
				
			||||||
 | 
					    [ [ second ] swap compose compare ] curry sort 20 tail*
 | 
				
			||||||
 | 
					    print
 | 
				
			||||||
 | 
					    standard-table-style
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        [ [ [ pprint-cell ] each ] with-row ] each
 | 
				
			||||||
 | 
					    ] tabular-output ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: optimizer-report
 | 
				
			||||||
 | 
					    all-words [ compiled? ] subset
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        dup [
 | 
				
			||||||
 | 
					            word-dataflow nip 1 count-optimization-passes
 | 
				
			||||||
 | 
					        ] benchmark nip 2array
 | 
				
			||||||
 | 
					    ] { } map>assoc
 | 
				
			||||||
 | 
					    [ first ] "Worst number of optimizer passes:" results
 | 
				
			||||||
 | 
					    [ second ] "Worst compile times:" results ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MAIN: optimizer-report
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
USING: tools.test kernel serialize io io.streams.byte-array math
 | 
					USING: tools.test kernel serialize io io.streams.byte-array math
 | 
				
			||||||
alien arrays byte-arrays sequences math prettyprint parser
 | 
					alien arrays byte-arrays sequences math prettyprint parser
 | 
				
			||||||
classes math.constants io.encodings.binary random
 | 
					classes math.constants io.encodings.binary random
 | 
				
			||||||
combinators.lib ;
 | 
					combinators.lib assocs ;
 | 
				
			||||||
IN: serialize.tests
 | 
					IN: serialize.tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: test-serialize-cell
 | 
					: test-serialize-cell
 | 
				
			||||||
| 
						 | 
					@ -56,19 +56,23 @@ C: <serialize-test> serialize-test
 | 
				
			||||||
    } ;
 | 
					    } ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: check-serialize-1 ( obj -- ? )
 | 
					: check-serialize-1 ( obj -- ? )
 | 
				
			||||||
 | 
					    "=====" print
 | 
				
			||||||
    dup class .
 | 
					    dup class .
 | 
				
			||||||
 | 
					    dup .
 | 
				
			||||||
    dup
 | 
					    dup
 | 
				
			||||||
    binary [ serialize ] with-byte-writer
 | 
					    object>bytes
 | 
				
			||||||
    binary [ deserialize ] with-byte-reader = ;
 | 
					    bytes>object
 | 
				
			||||||
 | 
					    dup . = ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: check-serialize-2 ( obj -- ? )
 | 
					: check-serialize-2 ( obj -- ? )
 | 
				
			||||||
    dup number? over wrapper? or [
 | 
					    dup number? over wrapper? or [
 | 
				
			||||||
        drop t ! we don't care if numbers aren't interned
 | 
					        drop t ! we don't care if numbers aren't interned
 | 
				
			||||||
    ] [
 | 
					    ] [
 | 
				
			||||||
 | 
					        "=====" print
 | 
				
			||||||
        dup class .
 | 
					        dup class .
 | 
				
			||||||
        dup 2array
 | 
					        dup 2array dup .
 | 
				
			||||||
        binary [ serialize ] with-byte-writer
 | 
					        object>bytes
 | 
				
			||||||
        binary [ deserialize ] with-byte-reader
 | 
					        bytes>object dup .
 | 
				
			||||||
        first2 eq?
 | 
					        first2 eq?
 | 
				
			||||||
    ] if ;
 | 
					    ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,3 +83,17 @@ C: <serialize-test> serialize-test
 | 
				
			||||||
[ t ] [ pi check-serialize-1 ] unit-test
 | 
					[ t ] [ pi check-serialize-1 ] unit-test
 | 
				
			||||||
[ serialize ] must-infer
 | 
					[ serialize ] must-infer
 | 
				
			||||||
[ deserialize ] must-infer
 | 
					[ deserialize ] must-infer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ t ] [
 | 
				
			||||||
 | 
					    V{ } dup dup push
 | 
				
			||||||
 | 
					    object>bytes
 | 
				
			||||||
 | 
					    bytes>object
 | 
				
			||||||
 | 
					    dup first eq?
 | 
				
			||||||
 | 
					] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ t ] [
 | 
				
			||||||
 | 
					    H{ } dup dup dup set-at
 | 
				
			||||||
 | 
					    object>bytes
 | 
				
			||||||
 | 
					    bytes>object
 | 
				
			||||||
 | 
					    dup keys first eq?
 | 
				
			||||||
 | 
					] unit-test
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,8 +11,9 @@ USING: namespaces sequences kernel math io math.functions
 | 
				
			||||||
io.binary strings classes words sbufs tuples arrays
 | 
					io.binary strings classes words sbufs tuples arrays
 | 
				
			||||||
vectors byte-arrays bit-arrays quotations hashtables
 | 
					vectors byte-arrays bit-arrays quotations hashtables
 | 
				
			||||||
assocs help.syntax help.markup float-arrays splitting
 | 
					assocs help.syntax help.markup float-arrays splitting
 | 
				
			||||||
io.encodings.string io.encodings.utf8 combinators new-slots
 | 
					io.encodings.string io.encodings.utf8 combinators
 | 
				
			||||||
accessors ;
 | 
					combinators.cleave new-slots accessors locals prettyprint
 | 
				
			||||||
 | 
					compiler.units sequences.private tuples.private ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
! Variable holding a assoc of objects already serialized
 | 
					! Variable holding a assoc of objects already serialized
 | 
				
			||||||
SYMBOL: serialized
 | 
					SYMBOL: serialized
 | 
				
			||||||
| 
						 | 
					@ -69,7 +70,8 @@ GENERIC: (serialize) ( obj -- )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: serialize-shared ( obj quot -- )
 | 
					: serialize-shared ( obj quot -- )
 | 
				
			||||||
    >r dup object-id
 | 
					    >r dup object-id
 | 
				
			||||||
    [ CHAR: o write1 serialize-cell drop ] r> if* ; inline
 | 
					    [ CHAR: o write1 serialize-cell drop ]
 | 
				
			||||||
 | 
					    r> if* ; inline
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: f (serialize) ( obj -- )
 | 
					M: f (serialize) ( obj -- )
 | 
				
			||||||
    drop CHAR: n write1 ;
 | 
					    drop CHAR: n write1 ;
 | 
				
			||||||
| 
						 | 
					@ -96,75 +98,93 @@ M: ratio (serialize) ( obj -- )
 | 
				
			||||||
    dup numerator (serialize)
 | 
					    dup numerator (serialize)
 | 
				
			||||||
    denominator (serialize) ;
 | 
					    denominator (serialize) ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: serialize-string ( obj code -- )
 | 
					: serialize-seq ( obj code -- )
 | 
				
			||||||
    write1
 | 
					    [
 | 
				
			||||||
    dup utf8 encode dup length serialize-cell write
 | 
					        write1
 | 
				
			||||||
    add-object ;
 | 
					        [ add-object ]
 | 
				
			||||||
 | 
					        [ length serialize-cell ]
 | 
				
			||||||
M: string (serialize) ( obj -- )
 | 
					        [ [ (serialize) ] each ] tri
 | 
				
			||||||
    [ CHAR: s serialize-string ] serialize-shared ;
 | 
					    ] curry serialize-shared ;
 | 
				
			||||||
 | 
					 | 
				
			||||||
: serialize-elements ( seq -- )
 | 
					 | 
				
			||||||
    [ (serialize) ] each CHAR: . write1 ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: tuple (serialize) ( obj -- )
 | 
					M: tuple (serialize) ( obj -- )
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        CHAR: T write1
 | 
					        CHAR: T write1
 | 
				
			||||||
        dup tuple>array serialize-elements
 | 
					        [ class (serialize) ]
 | 
				
			||||||
        add-object
 | 
					        [ add-object ]
 | 
				
			||||||
 | 
					        [ tuple>array 1 tail (serialize) ]
 | 
				
			||||||
 | 
					        tri
 | 
				
			||||||
    ] serialize-shared ;
 | 
					    ] serialize-shared ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: serialize-seq ( seq code -- )
 | 
					 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
        write1
 | 
					 | 
				
			||||||
        dup serialize-elements
 | 
					 | 
				
			||||||
        add-object
 | 
					 | 
				
			||||||
    ] curry serialize-shared ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
M: array (serialize) ( obj -- )
 | 
					M: array (serialize) ( obj -- )
 | 
				
			||||||
    CHAR: a serialize-seq ;
 | 
					    CHAR: a serialize-seq ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: byte-array (serialize) ( obj -- )
 | 
					 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
        CHAR: A write1
 | 
					 | 
				
			||||||
        dup dup length serialize-cell write
 | 
					 | 
				
			||||||
        add-object
 | 
					 | 
				
			||||||
    ] serialize-shared ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
M: bit-array (serialize) ( obj -- )
 | 
					 | 
				
			||||||
    [
 | 
					 | 
				
			||||||
        CHAR: b write1
 | 
					 | 
				
			||||||
        dup length serialize-cell
 | 
					 | 
				
			||||||
        dup [ 1 0 ? ] B{ } map-as write
 | 
					 | 
				
			||||||
        add-object
 | 
					 | 
				
			||||||
    ] serialize-shared ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
M: quotation (serialize) ( obj -- )
 | 
					M: quotation (serialize) ( obj -- )
 | 
				
			||||||
    CHAR: q serialize-seq ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
M: float-array (serialize) ( obj -- )
 | 
					 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        CHAR: f write1
 | 
					        CHAR: q write1 [ >array (serialize) ] [ add-object ] bi
 | 
				
			||||||
        dup length serialize-cell
 | 
					 | 
				
			||||||
        dup [ double>bits 8 >be write ] each
 | 
					 | 
				
			||||||
        add-object
 | 
					 | 
				
			||||||
    ] serialize-shared ;
 | 
					    ] serialize-shared ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: hashtable (serialize) ( obj -- )
 | 
					M: hashtable (serialize) ( obj -- )
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        CHAR: h write1
 | 
					        CHAR: h write1
 | 
				
			||||||
        dup >alist (serialize)
 | 
					        [ add-object ] [ >alist (serialize) ] bi
 | 
				
			||||||
        add-object
 | 
					 | 
				
			||||||
    ] serialize-shared ;
 | 
					    ] serialize-shared ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: word (serialize) ( obj -- )
 | 
					M: bit-array (serialize) ( obj -- )
 | 
				
			||||||
 | 
					    CHAR: b serialize-seq ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					M: byte-array (serialize) ( obj -- )
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        CHAR: w write1
 | 
					        CHAR: A write1
 | 
				
			||||||
        dup word-name (serialize)
 | 
					        [ add-object ]
 | 
				
			||||||
        dup word-vocabulary (serialize)
 | 
					        [ length serialize-cell ]
 | 
				
			||||||
        add-object
 | 
					        [ write ] tri
 | 
				
			||||||
    ] serialize-shared ;
 | 
					    ] serialize-shared ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					M: float-array (serialize) ( obj -- )
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        CHAR: f write1
 | 
				
			||||||
 | 
					        [ add-object ]
 | 
				
			||||||
 | 
					        [ length serialize-cell ]
 | 
				
			||||||
 | 
					        [ [ double>bits 8 >be write ] each ]
 | 
				
			||||||
 | 
					        tri
 | 
				
			||||||
 | 
					    ] serialize-shared ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					M: string (serialize) ( obj -- )
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        CHAR: s write1
 | 
				
			||||||
 | 
					        [ add-object ]
 | 
				
			||||||
 | 
					        [
 | 
				
			||||||
 | 
					            utf8 encode
 | 
				
			||||||
 | 
					            [ length serialize-cell ]
 | 
				
			||||||
 | 
					            [ write ] bi
 | 
				
			||||||
 | 
					        ] bi
 | 
				
			||||||
 | 
					    ] serialize-shared ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: serialize-true ( word -- )
 | 
				
			||||||
 | 
					    drop CHAR: t write1 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: serialize-gensym ( word -- )
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        CHAR: G write1
 | 
				
			||||||
 | 
					        [ add-object ]
 | 
				
			||||||
 | 
					        [ word-def (serialize) ]
 | 
				
			||||||
 | 
					        [ word-props (serialize) ]
 | 
				
			||||||
 | 
					        tri
 | 
				
			||||||
 | 
					    ] serialize-shared ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: serialize-word ( word -- )
 | 
				
			||||||
 | 
					    CHAR: w write1
 | 
				
			||||||
 | 
					    [ word-name (serialize) ]
 | 
				
			||||||
 | 
					    [ word-vocabulary (serialize) ]
 | 
				
			||||||
 | 
					    bi ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					M: word (serialize) ( obj -- )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        { [ dup t eq? ] [ serialize-true ] }
 | 
				
			||||||
 | 
					        { [ dup word-vocabulary not ] [ serialize-gensym ] }
 | 
				
			||||||
 | 
					        { [ t ] [ serialize-word ] }
 | 
				
			||||||
 | 
					    } cond ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: wrapper (serialize) ( obj -- )
 | 
					M: wrapper (serialize) ( obj -- )
 | 
				
			||||||
    CHAR: W write1
 | 
					    CHAR: W write1
 | 
				
			||||||
    wrapped (serialize) ;
 | 
					    wrapped (serialize) ;
 | 
				
			||||||
| 
						 | 
					@ -179,6 +199,9 @@ SYMBOL: deserialized
 | 
				
			||||||
: deserialize-false ( -- f )
 | 
					: deserialize-false ( -- f )
 | 
				
			||||||
    f ;
 | 
					    f ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: deserialize-true ( -- f )
 | 
				
			||||||
 | 
					    t ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-positive-integer ( -- number )
 | 
					: deserialize-positive-integer ( -- number )
 | 
				
			||||||
    deserialize-cell ;
 | 
					    deserialize-cell ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -204,53 +227,63 @@ SYMBOL: deserialized
 | 
				
			||||||
    (deserialize-string) dup intern-object ;
 | 
					    (deserialize-string) dup intern-object ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-word ( -- word )
 | 
					: deserialize-word ( -- word )
 | 
				
			||||||
    (deserialize) dup (deserialize) lookup
 | 
					    (deserialize) (deserialize) 2dup lookup
 | 
				
			||||||
    [ dup intern-object ] [ "Unknown word" throw ] ?if ;
 | 
					    dup [ 2nip ] [
 | 
				
			||||||
 | 
					        "Unknown word: " -rot
 | 
				
			||||||
 | 
					        2array unparse append throw
 | 
				
			||||||
 | 
					    ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: deserialize-gensym ( -- word )
 | 
				
			||||||
 | 
					    gensym
 | 
				
			||||||
 | 
					    dup intern-object
 | 
				
			||||||
 | 
					    dup (deserialize) define
 | 
				
			||||||
 | 
					    dup (deserialize) swap set-word-props ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-wrapper ( -- wrapper )
 | 
					: deserialize-wrapper ( -- wrapper )
 | 
				
			||||||
    (deserialize) <wrapper> ;
 | 
					    (deserialize) <wrapper> ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SYMBOL: +stop+
 | 
					:: (deserialize-seq) ( exemplar quot -- seq )
 | 
				
			||||||
 | 
					    deserialize-cell exemplar new
 | 
				
			||||||
: (deserialize-seq) ( -- seq )
 | 
					    [ intern-object ]
 | 
				
			||||||
    [ (deserialize) dup +stop+ get eq? not ] [ ] [ drop ] unfold ;
 | 
					    [ dup [ drop quot call ] change-each ] bi ; inline
 | 
				
			||||||
 | 
					 | 
				
			||||||
: deserialize-seq ( seq -- array )
 | 
					 | 
				
			||||||
    >r (deserialize-seq) r> like dup intern-object ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-array ( -- array )
 | 
					: deserialize-array ( -- array )
 | 
				
			||||||
    { } deserialize-seq ;
 | 
					    { } [ (deserialize) ] (deserialize-seq) ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-quotation ( -- array )
 | 
					: deserialize-quotation ( -- array )
 | 
				
			||||||
    [ ] deserialize-seq ;
 | 
					    (deserialize) >quotation dup intern-object ;
 | 
				
			||||||
 | 
					 | 
				
			||||||
: (deserialize-byte-array) ( -- byte-array )
 | 
					 | 
				
			||||||
    deserialize-cell read B{ } like ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-byte-array ( -- byte-array )
 | 
					: deserialize-byte-array ( -- byte-array )
 | 
				
			||||||
    (deserialize-byte-array) dup intern-object ;
 | 
					    B{ } [ read1 ] (deserialize-seq) ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-bit-array ( -- bit-array )
 | 
					: deserialize-bit-array ( -- bit-array )
 | 
				
			||||||
    (deserialize-byte-array) [ 0 > ] ?{ } map-as
 | 
					    ?{ } [ (deserialize) ] (deserialize-seq) ;
 | 
				
			||||||
    dup intern-object ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-float-array ( -- float-array )
 | 
					: deserialize-float-array ( -- float-array )
 | 
				
			||||||
    deserialize-cell
 | 
					    F{ } [ 8 read be> bits>double ] (deserialize-seq) ;
 | 
				
			||||||
    8 * read 8 <groups> [ be> bits>double ] F{ } map-as
 | 
					 | 
				
			||||||
    dup intern-object ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-hashtable ( -- hashtable )
 | 
					: deserialize-hashtable ( -- hashtable )
 | 
				
			||||||
    (deserialize) >hashtable dup intern-object ;
 | 
					    H{ } clone
 | 
				
			||||||
 | 
					    [ intern-object ]
 | 
				
			||||||
 | 
					    [ (deserialize) update ]
 | 
				
			||||||
 | 
					    [ ] tri ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: copy-seq-to-tuple ( seq tuple -- )
 | 
				
			||||||
 | 
					    >r dup length [ 1+ ] map r> [ set-array-nth ] curry 2each ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-tuple ( -- array )
 | 
					: deserialize-tuple ( -- array )
 | 
				
			||||||
    (deserialize-seq) >tuple dup intern-object ;
 | 
					    #! Ugly because we have to intern the tuple before reading
 | 
				
			||||||
 | 
					    #! slots
 | 
				
			||||||
 | 
					    (deserialize) construct-empty
 | 
				
			||||||
 | 
					    [ intern-object ]
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					        [ (deserialize) ]
 | 
				
			||||||
 | 
					        [ [ copy-seq-to-tuple ] keep ] bi*
 | 
				
			||||||
 | 
					    ] bi ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-unknown ( -- object )
 | 
					: deserialize-unknown ( -- object )
 | 
				
			||||||
    deserialize-cell deserialized get nth ;
 | 
					    deserialize-cell deserialized get nth ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize-stop ( -- object )
 | 
					 | 
				
			||||||
    +stop+ get ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
: deserialize* ( -- object ? )
 | 
					: deserialize* ( -- object ? )
 | 
				
			||||||
    read1 [
 | 
					    read1 [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					@ -265,14 +298,15 @@ SYMBOL: +stop+
 | 
				
			||||||
            { CHAR: h [ deserialize-hashtable ] }
 | 
					            { CHAR: h [ deserialize-hashtable ] }
 | 
				
			||||||
            { CHAR: m [ deserialize-negative-integer ] }
 | 
					            { CHAR: m [ deserialize-negative-integer ] }
 | 
				
			||||||
            { CHAR: n [ deserialize-false ] }
 | 
					            { CHAR: n [ deserialize-false ] }
 | 
				
			||||||
 | 
					            { CHAR: t [ deserialize-true ] }
 | 
				
			||||||
            { CHAR: o [ deserialize-unknown ] }
 | 
					            { CHAR: o [ deserialize-unknown ] }
 | 
				
			||||||
            { CHAR: p [ deserialize-positive-integer ] }
 | 
					            { CHAR: p [ deserialize-positive-integer ] }
 | 
				
			||||||
            { CHAR: q [ deserialize-quotation ] }
 | 
					            { CHAR: q [ deserialize-quotation ] }
 | 
				
			||||||
            { CHAR: r [ deserialize-ratio ] }
 | 
					            { CHAR: r [ deserialize-ratio ] }
 | 
				
			||||||
            { CHAR: s [ deserialize-string ] }
 | 
					            { CHAR: s [ deserialize-string ] }
 | 
				
			||||||
            { CHAR: w [ deserialize-word ] }
 | 
					            { CHAR: w [ deserialize-word ] }
 | 
				
			||||||
 | 
					            { CHAR: G [ deserialize-word ] }
 | 
				
			||||||
            { CHAR: z [ deserialize-zero ] }
 | 
					            { CHAR: z [ deserialize-zero ] }
 | 
				
			||||||
            { CHAR: . [ deserialize-stop ] }
 | 
					 | 
				
			||||||
        } case t
 | 
					        } case t
 | 
				
			||||||
    ] [
 | 
					    ] [
 | 
				
			||||||
        f f
 | 
					        f f
 | 
				
			||||||
| 
						 | 
					@ -283,13 +317,15 @@ SYMBOL: +stop+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: deserialize ( -- obj )
 | 
					: deserialize ( -- obj )
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        V{ } clone deserialized set
 | 
					        V{ } clone deserialized
 | 
				
			||||||
        gensym +stop+ set
 | 
					        [ (deserialize) ] with-variable
 | 
				
			||||||
        (deserialize)
 | 
					    ] with-compilation-unit ;
 | 
				
			||||||
    ] with-scope ;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
: serialize ( obj -- )
 | 
					: serialize ( obj -- )
 | 
				
			||||||
    [
 | 
					    H{ } clone serialized [ (serialize) ] with-variable ;
 | 
				
			||||||
        H{ } clone serialized set
 | 
					
 | 
				
			||||||
        (serialize)
 | 
					: bytes>object ( bytes -- obj )
 | 
				
			||||||
    ] with-scope ;
 | 
					    binary [ deserialize ] with-byte-reader ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: object>bytes ( obj -- bytes )
 | 
				
			||||||
 | 
					    binary [ serialize ] with-byte-writer ;
 | 
				
			||||||
		Loading…
	
		Reference in New Issue