From 51c0b1b050c81385c7acfabf916066625df5a839 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sun, 30 Aug 2015 10:58:38 +0100 Subject: [PATCH] src/class-{finalize,layout}-impl.lisp: Error checking on layout slots. The layout slots which are autovivifying (`effective-methods', `%ilayout', and `vtables') shouldn't be accessed prior to class finalization, so gather their definitions together and check that this is done properly. --- src/class-finalize-impl.lisp | 14 ++++++++++++++ src/class-layout-impl.lisp | 9 --------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/class-finalize-impl.lisp b/src/class-finalize-impl.lisp index 9e75412..9c34bd7 100644 --- a/src/class-finalize-impl.lisp +++ b/src/class-finalize-impl.lisp @@ -391,4 +391,18 @@ (:finalized t)))) +(macrolet ((define-layout-slot (slot (class) &body body) + `(define-on-demand-slot sod-class ,slot (,class) + (check-class-is-finalized ,class) + ,@body))) + (flet ((check-class-is-finalized (class) + (unless (eq (sod-class-state class) :finalized) + (error "Class ~S is not finalized" class)))) + (define-layout-slot %ilayout (class) + (compute-ilayout class)) + (define-layout-slot effective-methods (class) + (compute-effective-methods class)) + (define-layout-slot vtables (class) + (compute-vtables class)))) + ;;;----- That's all, folks -------------------------------------------------- diff --git a/src/class-layout-impl.lisp b/src/class-layout-impl.lisp index 8edfcf6..7a2d9cc 100644 --- a/src/class-layout-impl.lisp +++ b/src/class-layout-impl.lisp @@ -129,9 +129,6 @@ (sod-class-messages super))) (sod-class-precedence-list class))) -(define-on-demand-slot sod-class effective-methods (class) - (compute-effective-methods class)) - ;;;-------------------------------------------------------------------------- ;;; Instance layout. @@ -204,9 +201,6 @@ (reverse chain))) (sod-class-chains class)))) -(define-on-demand-slot sod-class %ilayout (class) - (compute-ilayout class)) - ;;;-------------------------------------------------------------------------- ;;; Vtable layout. @@ -384,7 +378,4 @@ (compute-vtable class (reverse chain))) (sod-class-chains class))) -(define-on-demand-slot sod-class vtables (class) - (compute-vtables class)) - ;;;----- That's all, folks -------------------------------------------------- -- 2.11.0