Skip to content

define-binary-type forms need to be evaluated earlier to ensure that their effects can be seen by subsequent forms #1

@slyrus

Description

@slyrus

currently, when one has a define-binary-type form with slots, the :key args provided by those slots are not seen by the compiler as being available to subsequent forms, causing warnings such as this:

(define-binary-type box-list (limit)
  (:reader (in)
           (read-boxes in limit (current-binary-object)))
  (:writer (out value)
           (write-boxes out value)))

(define-binary-class full-container-bbox (full-bbox-header)
  ((children (box-list :limit (data-size (current-binary-object))))))


; file: /Users/sly/projects/iso-media/iso-media.lisp
; in: DEFINE-BINARY-CLASS FULL-CONTAINER-BBOX
;     (COM.GIGAMONKEYS.BINARY-DATA:DEFINE-BINARY-CLASS
;      ISO-MEDIA::FULL-CONTAINER-BBOX (ISO-MEDIA::FULL-BBOX-HEADER)
;      ((ISO-MEDIA:CHILDREN (ISO-MEDIA::BOX-LIST :LIMIT (ISO-MEDIA::DATA-SIZE #)))))
; --> COM.GIGAMONKEYS.BINARY-DATA::DEFINE-GENERIC-BINARY-CLASS PROGN 
; --> DEFMETHOD PROGN EVAL-WHEN SB-PCL::%DEFMETHOD-EXPANDER PROGN 
; --> SB-PCL::LOAD-DEFMETHOD SYMBOL-MACROLET 
; --> SB-PCL::FAST-LEXICAL-METHOD-FUNCTIONS 
; --> SB-PCL::BIND-FAST-LEXICAL-METHOD-FUNCTIONS LOCALLY SB-PCL::BIND-ARGS 
; --> LET* LOCALLY SYMBOL-MACROLET SB-PCL::PV-BINDING SB-PCL::PV-BINDING1 
; --> SB-PCL::PV-ENV LOCALLY LET BLOCK LET SYMBOL-MACROLET 
; --> SB-PCL::OPTIMIZED-SET-SLOT-VALUE LET 
; ==>
;   (COM.GIGAMONKEYS.BINARY-DATA:READ-VALUE 'ISO-MEDIA::BOX-LIST #:STREAMVAR708
;                                           :LIMIT
;                                           (ISO-MEDIA::DATA-SIZE
;                                            (COM.GIGAMONKEYS.BINARY-DATA:CURRENT-BINARY-OBJECT)))
; 
; caught STYLE-WARNING:
;   :LIMIT is not a known argument keyword.

; --> COM.GIGAMONKEYS.BINARY-DATA::DEFINE-GENERIC-BINARY-CLASS PROGN 
; --> DEFMETHOD PROGN EVAL-WHEN SB-PCL::%DEFMETHOD-EXPANDER PROGN 
; --> SB-PCL::LOAD-DEFMETHOD SYMBOL-MACROLET 
; --> SB-PCL::FAST-LEXICAL-METHOD-FUNCTIONS 
; --> SB-PCL::BIND-FAST-LEXICAL-METHOD-FUNCTIONS LOCALLY SB-PCL::BIND-ARGS 
; --> LET* LOCALLY SYMBOL-MACROLET SB-PCL::PV-BINDING SB-PCL::PV-BINDING1 
; --> SB-PCL::PV-ENV LOCALLY LET BLOCK LET SYMBOL-MACROLET 
; ==>
;   (COM.GIGAMONKEYS.BINARY-DATA:WRITE-VALUE 'ISO-MEDIA::BOX-LIST #:STREAMVAR710
;                                            (SB-PCL::OPTIMIZED-SLOT-VALUE
;                                             (SLOT-VALUE #:G746
;                                                         'ISO-MEDIA:CHILDREN)
;                                             #:OBJECTVAR709
;                                             (SB-PCL::INSTANCE-READ
;                                              (SB-PCL::PV-OFFSET 0)
;                                              #:OBJECTVAR709 0
;                                              'ISO-MEDIA:CHILDREN
;                                              'ISO-MEDIA::FULL-CONTAINER-BBOX))
;                                            :LIMIT
;                                            (ISO-MEDIA::DATA-SIZE
;                                             (COM.GIGAMONKEYS.BINARY-DATA:CURRENT-BINARY-OBJECT)))
; 
; caught STYLE-WARNING:
;   :LIMIT is not a known argument keyword.

Changing the progn in the define-binary-type macro to an eval-when fixes the problem:

diff --git a/binary-data.lisp b/binary-data.lisp
index bf0e080..573af15 100644
--- a/binary-data.lisp
+++ b/binary-data.lisp
@@ -36,7 +36,7 @@

 (defmacro define-binary-type (name (&rest args) &body spec)
   (with-gensyms (type stream value)
-  `(progn
+  `(eval-when (:compile-toplevel :load-toplevel :execute)
     (defmethod read-value ((,type (eql ',name)) ,stream &key ,@args)
       (declare (ignorable ,@args))
       ,(type-reader-body spec stream))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions