Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/decode.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -103,18 +103,24 @@
(let* ((len (or len (decode-size (size-bytes header) buffer)))
(fixed-header (when (container-fixed-p header)
(fast-read-byte buffer)))
(class (decode-value buffer)))
(class (decode-value buffer))
(forward-refs nil))
(container-precheck-bytes (* 2 len) fixed-header)
(unless (symbolp class)
(error 'invalid-tmap-type :value class :reason "Not a symbol"))
(loop for i from 0 below len
collect
(let ((cons (cons nil nil)))
(setf (car cons) (decode-value-or-fref buffer :car cons fixed-header))
(setf (cdr cons) (decode-value-or-fref buffer :cdr cons nil))
(setf (cdr cons) (decode-value-or-fref buffer :tmap-value nil (car cons)))
(when (forward-ref-p (cdr cons))
(push (cdr cons) forward-refs))
cons) into alist
finally
(return (decode-object class alist)))))
(let ((object (decode-object class alist)))
(loop for forward-ref in forward-refs
do (setf (forward-ref-ref forward-ref) object))
(return object)))))

(defun decode-container (header buffer &optional len)
(let ((type (decode-container-type header)))
Expand Down
4 changes: 3 additions & 1 deletion src/reftable.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@
(setf (gethash object ref) (gethash forward-ref ref))
(remhash forward-ref ref))
(:map-value
(setf (gethash datum ref) object)))))
(setf (gethash datum ref) object))
(:tmap-value
(setf (slot-value ref datum) object)))))

(defun replace-forward-refs (id object &optional (context *ref-context*))
(loop for forward-ref in (gethash id (ref-context-forward-refs context))
Expand Down