1
Fork 0
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:
Andy Wingo 2015-01-06 13:41:56 -05:00
parent 9e2cd55ec8
commit 6c7dd9ebd3
5 changed files with 117 additions and 138 deletions

View file

@ -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 '())))