Do not use vector-set when creating record types

This improves performance as mutations force the GC to do more work.
This commit is contained in:
Justin Ethier 2019-02-27 10:29:18 -05:00
parent f5b68ee8d2
commit 0f0beb024c

View file

@ -1818,11 +1818,13 @@
;; Record-type definitions
(define record-marker (list 'record-marker))
(define (register-simple-type name parent field-tags)
(let ((new (make-vector 3 #f)))
(vector-set! new 0 record-marker)
(vector-set! new 1 name)
(vector-set! new 2 field-tags)
new))
(vector record-marker name field-tags)
;(let ((new (make-vector 3 #f)))
; (vector-set! new 0 record-marker)
; (vector-set! new 1 name)
; (vector-set! new 2 field-tags)
; new)
)
(define (make-type-predicate pred name)
(lambda (obj)
(and (vector? obj)
@ -1832,12 +1834,15 @@
(lambda ()
(let* ((field-tags (vector-ref name 2))
(field-values (make-vector (length field-tags) #f))
(new (make-vector 3 #f))
; (new (make-vector 3 #f))
)
(vector-set! new 0 record-marker)
(vector-set! new 1 name)
(vector-set! new 2 field-values)
new)))
; (vector-set! new 0 record-marker)
; (vector-set! new 1 name)
; (vector-set! new 2 field-values)
; new
(vector record-marker name field-values)
)
));
(define (type-slot-offset name sym)
(let ((field-tags (vector-ref name 2)))
(_list-index sym field-tags)))