Changeset 5827
- Timestamp:
- Jan 30, 2007, 4:42:50 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/ccl/lib/db-io.lisp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/lib/db-io.lisp
r5795 r5827 38 38 (in-package "CCL") 39 39 40 (defparameter *interface-abi-version* 1) 40 (defparameter *interface-abi-version* 2) 41 (defparameter *min-interface-abi-version* 1) 41 42 42 43 (defconstant cdb-hash-mask (1- (ash 1 29))) … … 401 402 (if (equal sig "OpenMCL Interface File") 402 403 (if (eq target (backend-name *target-backend*)) 403 (if (eql version *interface-abi-version*) 404 (if (and version 405 (>= version *min-interface-abi-version*) 406 (<= version *interface-abi-version*)) 404 407 cdb 405 408 (error-with-cdb "Wrong interface ABI version. Expected ~d, got ~d" *interface-abi-version* version)) … … 1269 1272 '(#\?))))))))))) 1270 1273 ((:struct :union) 1271 (if (getf (ftd-attributes *target-ftd*) :struct-by-value) 1272 (if return-value-p `(#\a) 1273 `(,(if (eq (car spec) :struct) 1274 #\r 1275 #\u) 1276 ,@(encode-name (ffi-struct-reference (cadr spec))))) 1277 `(#\a))) 1274 `(,(if (eq (car spec) :struct) 1275 #\r 1276 #\u) 1277 ,@(encode-name (ffi-struct-reference (cadr spec))))) 1278 1278 (:typedef 1279 1279 (let* ((typedef (cadr spec)) … … 1652 1652 rtype)) 1653 1653 1654 (defun %decode-record-type (buf p ftd )1654 (defun %decode-record-type (buf p ftd already) 1655 1655 (declare (type macptr buf) (fixnum p)) 1656 1656 (let* ((rbyte (%get-unsigned-byte buf p)) … … 1667 1667 (%decode-name buf (1+ p)))) 1668 1668 (%determine-record-attributes 1669 (if name 1670 (if (eql rcode encoded-type-named-struct-ref) 1671 (or (info-foreign-type-struct name) 1672 (setf (info-foreign-type-struct name) 1673 (make-foreign-record-type :kind :struct :name name))) 1674 (or (info-foreign-type-union name) 1675 (setf (info-foreign-type-union name) 1676 (make-foreign-record-type :kind :union :name name)))) 1677 (make-foreign-record-type 1678 :kind (if (eql rcode encoded-type-anon-struct-ref) 1679 :struct 1680 :union) 1681 :name name)) 1669 (or already 1670 (if name 1671 (if (eql rcode encoded-type-named-struct-ref) 1672 (or (info-foreign-type-struct name) 1673 (setf (info-foreign-type-struct name) 1674 (make-foreign-record-type :kind :struct :name name))) 1675 (or (info-foreign-type-union name) 1676 (setf (info-foreign-type-union name) 1677 (make-foreign-record-type :kind :union :name name)))) 1678 (make-foreign-record-type 1679 :kind (if (eql rcode encoded-type-anon-struct-ref) 1680 :struct 1681 :union) 1682 :name name))) 1682 1683 (%decode-field-list buf q ftd) 1683 1684 alt-align)))) 1684 1685 1685 (defun extract-db-record (datum ftd )1686 (defun extract-db-record (datum ftd already) 1686 1687 (let* ((data (pref datum :cdb-datum.data))) 1687 1688 (unless (%null-ptr-p data) 1688 1689 (prog1 1689 (%decode-record-type data 0 ftd )1690 (%decode-record-type data 0 ftd already) 1690 1691 (cdb-free data))))) 1691 1692 1692 1693 1693 (defun %load-foreign-record (cdb name ftd )1694 (defun %load-foreign-record (cdb name ftd already) 1694 1695 (when cdb 1695 1696 (with-cstrs ((string (string name))) … … 1701 1702 (pref contents :cdb-datum.size) 0) 1702 1703 (cdb-get cdb key contents) 1703 (extract-db-record contents ftd )))))1704 (extract-db-record contents ftd already))))) 1704 1705 1705 1706 (defun load-record (name &optional (ftd *target-ftd*)) 1706 (let* ((name (unescape-foreign-name name))) 1707 ;; Try to destructively modify any info we already have. Use the 1708 ;; "escaped" name (keyword) for the lookup here. 1709 (let* ((already (or (info-foreign-type-struct name ftd) 1710 (info-foreign-type-union name ftd))) 1711 (name (unescape-foreign-name name))) 1707 1712 (do-interface-dirs (d) 1708 (let* ((r (%load-foreign-record (db-records d) name ftd )))1713 (let* ((r (%load-foreign-record (db-records d) name ftd already))) 1709 1714 (when r (return r))))))
Note:
See TracChangeset
for help on using the changeset viewer.
