mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-17 17:20:29 +02:00
Generics with setters have <applicable-struct-with-setter> layout
* libguile/goops.c (scm_sys_set_object_setter_x): Remove. Instead, we use slot-set! of 'setter. (scm_i_define_class_for_vtable): Move lower in the file, and fold in scm_make_extended_class_from_symbol and make_class_from_symbol. Properly handle applicable structs with setters. (scm_class_applicable_struct_with_setter_class): New private capture. (scm_sys_bless_applicable_struct_vtables_x): Rename to take two arguments, and bless the second argument as an applicable struct with setter vtable. (scm_sys_goops_early_init): Capture setter classes. * libguile/deprecated.c (SPEC_OF, CPL_OF): Access slots by name, not by index. (applicablep, more_specificp): Adapt to use CPL_OF. (scm_find_method): Access "methods" slot by name. * libguile/procs.c (scm_setter): Remove special case for generics; if it's a setter, it will be a normal applicable struct. * module/oop/goops.scm (<applicable-struct-with-setter-class>) (<applicable-struct-with-setter>): New classes. (<generic-with-setter>): Now an instance of the setter metaclass and a child of the setter class, so that the "setter" slot ends up in the right place. (<accessor>, <extended-generic-with-setter>, <extended-accessor>): Be instances of the setter metaclass. (<method>, <accessor-method>): Move definitions farther down. (make): Use slot-set! when initializing setters here. (initialize): Likewise for <applicable-struct-with-setter>. Remove specialization for <generic-with-setter>.
This commit is contained in:
parent
9e2cd55ec8
commit
6c7dd9ebd3
5 changed files with 117 additions and 138 deletions
|
@ -51,8 +51,8 @@
|
|||
<procedure> <primitive-generic>
|
||||
|
||||
;; Applicable structs.
|
||||
<applicable-struct-class>
|
||||
<applicable-struct>
|
||||
<applicable-struct-class> <applicable-struct-with-setter-class>
|
||||
<applicable-struct> <applicable-struct-with-setter>
|
||||
<generic> <extended-generic>
|
||||
<generic-with-setter> <extended-generic-with-setter>
|
||||
<accessor> <extended-accessor>
|
||||
|
@ -434,21 +434,20 @@
|
|||
|
||||
;; Applicables and their classes.
|
||||
(define-standard-class <procedure-class> (<class>))
|
||||
(define-standard-class <applicable-struct-class> (<procedure-class>))
|
||||
(%bless-applicable-struct-vtable! <applicable-struct-class>)
|
||||
(define-standard-class <method> (<object>)
|
||||
generic-function
|
||||
specializers
|
||||
procedure
|
||||
formals
|
||||
body
|
||||
make-procedure)
|
||||
(define-standard-class <accessor-method> (<method>)
|
||||
(slot-definition #:init-keyword #:slot-definition))
|
||||
(define-standard-class <applicable-struct-class>
|
||||
(<procedure-class>))
|
||||
(define-standard-class <applicable-struct-with-setter-class>
|
||||
(<applicable-struct-class>))
|
||||
(%bless-applicable-struct-vtables! <applicable-struct-class>
|
||||
<applicable-struct-with-setter-class>)
|
||||
|
||||
(define-standard-class <applicable> (<top>))
|
||||
(define-standard-class <applicable-struct> (<object> <applicable>)
|
||||
#:metaclass <applicable-struct-class>
|
||||
procedure)
|
||||
(define-standard-class <applicable-struct-with-setter> (<applicable-struct>)
|
||||
#:metaclass <applicable-struct-with-setter-class>
|
||||
setter)
|
||||
(define-standard-class <generic> (<applicable-struct>)
|
||||
#:metaclass <applicable-struct-class>
|
||||
methods
|
||||
|
@ -460,22 +459,33 @@
|
|||
#:metaclass <applicable-struct-class>
|
||||
(extends #:init-value ()))
|
||||
(%bless-pure-generic-vtable! <extended-generic>)
|
||||
(define-standard-class <generic-with-setter> (<generic>)
|
||||
#:metaclass <applicable-struct-class>
|
||||
setter)
|
||||
(define-standard-class <generic-with-setter> (<generic>
|
||||
<applicable-struct-with-setter>)
|
||||
#:metaclass <applicable-struct-with-setter-class>)
|
||||
(%bless-pure-generic-vtable! <generic-with-setter>)
|
||||
(define-standard-class <accessor> (<generic-with-setter>)
|
||||
#:metaclass <applicable-struct-class>)
|
||||
#:metaclass <applicable-struct-with-setter-class>)
|
||||
(%bless-pure-generic-vtable! <accessor>)
|
||||
(define-standard-class <extended-generic-with-setter> (<extended-generic>
|
||||
<generic-with-setter>)
|
||||
#:metaclass <applicable-struct-class>)
|
||||
#:metaclass <applicable-struct-with-setter-class>)
|
||||
(%bless-pure-generic-vtable! <extended-generic-with-setter>)
|
||||
(define-standard-class <extended-accessor> (<accessor>
|
||||
<extended-generic-with-setter>)
|
||||
#:metaclass <applicable-struct-class>)
|
||||
#:metaclass <applicable-struct-with-setter-class>)
|
||||
(%bless-pure-generic-vtable! <extended-accessor>)
|
||||
|
||||
;; Methods
|
||||
(define-standard-class <method> (<object>)
|
||||
generic-function
|
||||
specializers
|
||||
procedure
|
||||
formals
|
||||
body
|
||||
make-procedure)
|
||||
(define-standard-class <accessor-method> (<method>)
|
||||
(slot-definition #:init-keyword #:slot-definition))
|
||||
|
||||
;; Primitive types classes
|
||||
(define-standard-class <boolean> (<top>))
|
||||
(define-standard-class <char> (<top>))
|
||||
|
@ -534,7 +544,7 @@
|
|||
(when (eq? class <accessor>)
|
||||
(let ((setter (get-keyword #:setter args #f)))
|
||||
(when setter
|
||||
(%set-object-setter! z setter))))
|
||||
(slot-set! z 'setter setter))))
|
||||
z))
|
||||
(else
|
||||
(let ((z (%allocate-instance class args)))
|
||||
|
@ -2160,6 +2170,11 @@
|
|||
(next-method)
|
||||
(initialize-object-procedure applicable-struct initargs))
|
||||
|
||||
(define-method (initialize (applicable-struct <applicable-struct-with-setter>)
|
||||
initargs)
|
||||
(next-method)
|
||||
(slot-set! applicable-struct 'setter (get-keyword #:setter initargs #f)))
|
||||
|
||||
(define-method (initialize (generic <generic>) initargs)
|
||||
(let ((previous-definition (get-keyword #:default initargs #f))
|
||||
(name (get-keyword #:name initargs #f)))
|
||||
|
@ -2172,10 +2187,6 @@
|
|||
(set-procedure-property! generic 'name name))
|
||||
(invalidate-method-cache! generic)))
|
||||
|
||||
(define-method (initialize (gws <generic-with-setter>) initargs)
|
||||
(next-method)
|
||||
(%set-object-setter! gws (get-keyword #:setter initargs #f)))
|
||||
|
||||
(define-method (initialize (eg <extended-generic>) initargs)
|
||||
(next-method)
|
||||
(slot-set! eg 'extends (get-keyword #:extends initargs '())))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue