alien type improvement: handle offsets in unparse-alien-record-type
authorCyrus Harmon <ch-github@bobobeach.com>
Mon, 15 Oct 2012 06:12:58 +0000 (23:12 -0700)
committerCyrus Harmon <ch-github@bobobeach.com>
Sun, 4 Nov 2012 17:09:21 +0000 (09:09 -0800)
Previously, when recomputing the offset to struct fields we would
ignore the offset and attempt to recompute it, occasionally getting it
wrong. Now store the offset in uparse-alien-record-field and use in
parse-alien-record-fields.

Also, fix some comment typos.

src/code/host-alieneval.lisp

index 1f554c6..eb883db 100644 (file)
 
 ;;; FIXME: This is really pretty horrible: we avoid creating new
 ;;; ALIEN-RECORD-TYPE objects when a live one is flitting around the
-;;; system already. This way forwrd-references sans fields get get
+;;; system already. This way forward-references sans fields get
 ;;; "updated" for free to contain the field info. Maybe rename
 ;;; MAKE-ALIEN-RECORD-TYPE to %MAKE-ALIEN-RECORD-TYPE and use
 ;;; ENSURE-ALIEN-RECORD-TYPE instead. --NS 20040729
         (overall-alignment 1)
         (parsed-fields nil))
     (dolist (field fields)
-      (destructuring-bind (var type &key alignment) field
+      (destructuring-bind (var type &key alignment bits offset) field
+        (declare (ignore bits))
         (let* ((field-type (parse-alien-type type env))
                (bits (alien-type-bits field-type))
                (parsed-field
           (setf overall-alignment (max overall-alignment alignment))
           (ecase kind
             (:struct
-             (let ((offset (align-offset total-bits alignment)))
+             (let ((offset (or offset (align-offset total-bits alignment))))
                (setf (alien-record-field-offset parsed-field) offset)
                (setf total-bits (+ offset bits))))
             (:union
   `(,(alien-record-field-name field)
      ,(%unparse-alien-type (alien-record-field-type field))
      ,@(when (alien-record-field-bits field)
-             (list (alien-record-field-bits field)))))
+             (list :bits (alien-record-field-bits field)))
+     ,@(when (alien-record-field-offset field)
+             (list :offset (alien-record-field-offset field)))))
 
 ;;; Test the record fields. Keep a hashtable table of already compared
 ;;; types to detect cycles.