1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-30 06:50:31 +02:00

change-object-class refactor

* module/oop/goops.scm (change-object-class): Refactor to use slot-ref,
  slot-bound?, and slot-set! instead of the using-class? variants.
This commit is contained in:
Andy Wingo 2015-01-16 13:02:31 +01:00
parent f15c0f545b
commit 9539b20ba9

View file

@ -2680,26 +2680,19 @@ var{initargs}."
(define (change-object-class old-instance old-class new-class)
(let ((new-instance (allocate-instance new-class '())))
;; Initialize the slots of the new instance
(for-each (lambda (slot)
(if (and (slot-exists-using-class? old-class old-instance slot)
(for-each
(lambda (slot)
(if (and (slot-exists? old-instance slot)
(eq? (slot-definition-allocation
(class-slot-definition old-class slot))
#:instance)
(slot-bound-using-class? old-class old-instance slot))
(slot-bound? old-instance slot))
;; Slot was present and allocated in old instance; copy it
(slot-set-using-class!
new-class
new-instance
slot
(slot-ref-using-class old-class old-instance slot))
(slot-set! new-instance slot (slot-ref old-instance slot))
;; slot was absent; initialize it with its default value
(let ((init (slot-init-function new-class slot)))
(if init
(slot-set-using-class!
new-class
new-instance
slot
(apply init '()))))))
(when init
(slot-set! new-instance slot (init))))))
(map slot-definition-name (class-slots new-class)))
;; Exchange old and new instance in place to keep pointers valid
(%modify-instance old-instance new-instance)