Fixes bug 194259. R6RS records can now be written and read back
through fasl-write and fasl-read.
This commit is contained in:
		
							parent
							
								
									c8f9b1dc3d
								
							
						
					
					
						commit
						e36b0029f6
					
				|  | @ -314,6 +314,28 @@ | ||||||
|                            (cons x (f (- n 1))))])))]) |                            (cons x (f (- n 1))))])))]) | ||||||
|              (when m (put-mark m ls)) |              (when m (put-mark m ls)) | ||||||
|              ls)] |              ls)] | ||||||
|  |           [(#\W) ;;; r6rs record type descriptor | ||||||
|  |            (let* ([name    (read)] | ||||||
|  |                   [parent  (read)] | ||||||
|  |                   [uid     (read)] | ||||||
|  |                   [sealed? (read)] | ||||||
|  |                   [opaque? (read)] | ||||||
|  |                   [n       (read)] | ||||||
|  |                   [fields  (make-vector n)]) | ||||||
|  |              (let f ([i 0]) | ||||||
|  |                (cond | ||||||
|  |                  [(= i n)  | ||||||
|  |                   (let ([rtd (make-record-type-descriptor | ||||||
|  |                                name parent uid sealed? opaque? | ||||||
|  |                                fields)]) | ||||||
|  |                     (when m (put-mark m rtd)) | ||||||
|  |                     rtd)] | ||||||
|  |                  [else | ||||||
|  |                   (let* ([field-mutable? (read)] | ||||||
|  |                          [field-name (read)]) | ||||||
|  |                     (vector-set! fields i  | ||||||
|  |                       (list (if field-mutable? 'mutable 'immutable) field-name)) | ||||||
|  |                     (f (+ i 1)))])))] | ||||||
|           [else |           [else | ||||||
|            (die who "Unexpected char as a fasl object header" h)]))) |            (die who "Unexpected char as a fasl object header" h)]))) | ||||||
|     (read)) |     (read)) | ||||||
|  |  | ||||||
|  | @ -199,6 +199,25 @@ | ||||||
|                (f (fxadd1 i) n))) |                (f (fxadd1 i) n))) | ||||||
|            (fasl-write-object (code-reloc-vector x) p h m))] |            (fasl-write-object (code-reloc-vector x) p h m))] | ||||||
|         [(struct? x) |         [(struct? x) | ||||||
|  |          (cond | ||||||
|  |            [(record-type-descriptor? x) | ||||||
|  |             (put-tag #\W p) | ||||||
|  |             (let* ([m (fasl-write-object (record-type-name x) p h m)] | ||||||
|  |                    [m (fasl-write-object (record-type-parent x) p h m)] | ||||||
|  |                    [m (fasl-write-object (record-type-uid x) p h m)]) | ||||||
|  |               (fasl-write-immediate (record-type-sealed? x) p) | ||||||
|  |               (fasl-write-immediate (record-type-opaque? x) p) | ||||||
|  |               (let* ([fields (record-type-field-names x)] | ||||||
|  |                      [n (vector-length fields)]) | ||||||
|  |                 (fasl-write-immediate n p) | ||||||
|  |                 (let f ([i 0] [m m]) | ||||||
|  |                   (cond | ||||||
|  |                     [(= i n) m] | ||||||
|  |                     [else | ||||||
|  |                      (fasl-write-immediate (record-field-mutable? x i) p) | ||||||
|  |                      (f (+ i 1)  | ||||||
|  |                         (fasl-write-object (vector-ref fields i) p h m))]))))] | ||||||
|  |            [else | ||||||
|             (let ([rtd (struct-type-descriptor x)]) |             (let ([rtd (struct-type-descriptor x)]) | ||||||
|               (cond |               (cond | ||||||
|                 [(eq? rtd (base-rtd)) |                 [(eq? rtd (base-rtd)) | ||||||
|  | @ -218,16 +237,17 @@ | ||||||
|                 [else |                 [else | ||||||
|                  ;;; non-rtd record |                  ;;; non-rtd record | ||||||
|                  (put-tag #\{ p) |                  (put-tag #\{ p) | ||||||
|               (write-int (length (struct-type-field-names rtd)) p) |                  (let ([n (struct-length x)]) | ||||||
|               (let f ([names (struct-type-field-names rtd)]  |                    (write-int n p) | ||||||
|  |                    (let f ([i 0]  | ||||||
|                            [m (fasl-write-object rtd p h m)]) |                            [m (fasl-write-object rtd p h m)]) | ||||||
|                      (cond |                      (cond | ||||||
|                   [(null? names) m] |                        [(= i n) m] | ||||||
|                        [else |                        [else | ||||||
|                    (f (cdr names)  |                         (f (+ i 1) | ||||||
|                            (fasl-write-object  |                            (fasl-write-object  | ||||||
|                          ((struct-field-accessor rtd (car names)) x) |                               (struct-ref x i) | ||||||
|                          p h m))]))]))] |                               p h m))])))]))])] | ||||||
|         [(procedure? x) |         [(procedure? x) | ||||||
|          (put-tag #\Q p) |          (put-tag #\Q p) | ||||||
|          (fasl-write-object ($closure-code x) p h m)] |          (fasl-write-object ($closure-code x) p h m)] | ||||||
|  | @ -313,23 +333,32 @@ | ||||||
|               (make-graph ($code-annotation x) h) |               (make-graph ($code-annotation x) h) | ||||||
|               (make-graph (code-reloc-vector x) h)] |               (make-graph (code-reloc-vector x) h)] | ||||||
|              [(struct? x) |              [(struct? x) | ||||||
|               (when (eq? x (base-rtd)) |               (cond | ||||||
|                 (die 'fasl-write "base-rtd is not writable")) |                 [(eq? x (base-rtd)) | ||||||
|  |                  (die 'fasl-write "base-rtd is not writable")] | ||||||
|  |                 [(record-type-descriptor? x)  | ||||||
|  |                  (make-graph (record-type-name x) h) | ||||||
|  |                  (make-graph (record-type-parent x) h) | ||||||
|  |                  (make-graph (record-type-uid x) h) | ||||||
|  |                  (vector-for-each  | ||||||
|  |                    (lambda (x) (make-graph x h)) | ||||||
|  |                    (record-type-field-names x))] | ||||||
|  |                 [else | ||||||
|                  (let ([rtd (struct-type-descriptor x)]) |                  (let ([rtd (struct-type-descriptor x)]) | ||||||
|                    (cond |                    (cond | ||||||
|                      [(eq? rtd (base-rtd)) |                      [(eq? rtd (base-rtd)) | ||||||
|                    ;;; this is an rtd |                       ;;; this is a struct rtd | ||||||
|                       (make-graph (struct-type-name x) h) |                       (make-graph (struct-type-name x) h) | ||||||
|                       (make-graph (struct-type-symbol x) h) |                       (make-graph (struct-type-symbol x) h) | ||||||
|                       (for-each (lambda (x) (make-graph x h)) |                       (for-each (lambda (x) (make-graph x h)) | ||||||
|                         (struct-type-field-names x))] |                         (struct-type-field-names x))] | ||||||
|                      [else |                      [else | ||||||
|                    ;;; this is a record |                       ;;; this is a struct | ||||||
|                       (make-graph rtd h) |                       (make-graph rtd h) | ||||||
|                    (for-each  |                       (let f ([i 0] [n (struct-length x)]) | ||||||
|                      (lambda (name)  |                         (unless (= i n)  | ||||||
|                        (make-graph ((struct-field-accessor rtd name) x) h)) |                           (make-graph (struct-ref x i) h) | ||||||
|                      (struct-type-field-names rtd))]))] |                           (f (+ i 1) n)))]))])] | ||||||
|              [(procedure? x) |              [(procedure? x) | ||||||
|               (let ([code ($closure-code x)]) |               (let ([code ($closure-code x)]) | ||||||
|                 (unless (fxzero? (code-freevars code)) |                 (unless (fxzero? (code-freevars code)) | ||||||
|  |  | ||||||
|  | @ -75,7 +75,11 @@ | ||||||
| 
 | 
 | ||||||
|   (define (record-type-uid x) |   (define (record-type-uid x) | ||||||
|     (if (rtd? x) |     (if (rtd? x) | ||||||
|         (rtd-uid x) |         (or (rtd-uid x) | ||||||
|  |             (let ([g (gensym)]) | ||||||
|  |               (set-rtd-uid! x g)  | ||||||
|  |               (intern-rtd! g x) | ||||||
|  |               g)) | ||||||
|         (die 'record-type-uid "not an rtd" x))) |         (die 'record-type-uid "not an rtd" x))) | ||||||
| 
 | 
 | ||||||
|   (define (record-type-sealed? x) |   (define (record-type-sealed? x) | ||||||
|  | @ -90,7 +94,7 @@ | ||||||
| 
 | 
 | ||||||
|   (define (record-type-generative? x) |   (define (record-type-generative? x) | ||||||
|     (if (rtd? x) |     (if (rtd? x) | ||||||
|         (not (rtd-sealed? x)) |         (not (rtd-sealed? x)) ;;; FIXME: bogus? | ||||||
|         (die 'record-type-generative? "not an rtd" x))) |         (die 'record-type-generative? "not an rtd" x))) | ||||||
| 
 | 
 | ||||||
|   (define (record-type-field-names x) |   (define (record-type-field-names x) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum