From: Cyrus Harmon Date: Mon, 15 Oct 2012 06:12:58 +0000 (-0700) Subject: alien type improvement: handle offsets in unparse-alien-record-type X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=c78d726af276ff97f8ec85eb42aa72cb31766284;p=sbcl.git alien type improvement: handle offsets in unparse-alien-record-type 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. --- diff --git a/src/code/host-alieneval.lisp b/src/code/host-alieneval.lisp index 1f554c6..eb883db 100644 --- a/src/code/host-alieneval.lisp +++ b/src/code/host-alieneval.lisp @@ -1003,7 +1003,7 @@ ;;; 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 @@ -1052,7 +1052,8 @@ (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 @@ -1068,7 +1069,7 @@ (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 @@ -1095,7 +1096,9 @@ `(,(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.