|
1 | 1 | (in-package :cl-binary-store) |
2 | 2 |
|
| 3 | +(defun is-type-specifier-p (type-specifier) |
| 4 | + "Returns true if TYPE-SPECIFIER is a valid type specifier." |
| 5 | + (or #+sbcl (sb-ext:valid-type-specifier-p type-specifier) |
| 6 | + #+ccl (ccl:type-specifier-p type-specifier) |
| 7 | + #+ecl (c::valid-type-specifier type-specifier))) |
| 8 | + |
3 | 9 | (defun restore-array (storage restore-object) |
4 | 10 | (declare (type function restore-object) (optimize (speed 3) (safety 1))) |
5 | 11 | (let* ((has-fill-pointer (funcall restore-object)) |
|
9 | 15 | (dimensions (loop repeat array-rank |
10 | 16 | collect (restore-tagged-unsigned-fixnum storage))) |
11 | 17 | (displaced (funcall restore-object)) |
12 | | - (array-total-size (if dimensions (reduce #'* dimensions) 0))) |
| 18 | + (array-total-size (if dimensions (reduce #'* dimensions) 0)) |
| 19 | + (element-type (funcall restore-object))) |
13 | 20 | (unless (and (typep array-total-size 'fixnum) (>= array-total-size 0)) |
14 | 21 | (unexpected-data "Array total size is too large")) |
| 22 | + #+ecl |
| 23 | + (unless element-type |
| 24 | + (unexpected-data "ECL does not support empty arrays with nil element type")) |
| 25 | + (unless (is-type-specifier-p element-type) |
| 26 | + (unexpected-data "Invalid array element-type")) |
15 | 27 | (check-if-too-much-data (read-storage-max-to-read storage) array-total-size) |
16 | 28 | (labels ((check-fill-pointer (dimensions) |
17 | 29 | (when has-fill-pointer |
|
21 | 33 | (unexpected-data "fill-pointer > vector length"))) |
22 | 34 | (values))) |
23 | 35 | (if displaced |
24 | | - (let ((element-type (funcall restore-object)) |
25 | | - (offset (restore-tagged-unsigned-fixnum storage)) |
| 36 | + (let ((offset (restore-tagged-unsigned-fixnum storage)) |
26 | 37 | (displaced-to (funcall restore-object))) |
27 | 38 | (unless (typep displaced-to 'array) |
28 | 39 | (unexpected-data "displaced to a non array?!")) |
|
37 | 48 | (progn |
38 | 49 | (when has-fill-pointer (check-fill-pointer dimensions)) |
39 | 50 | (let ((array |
40 | | - (let* ((element-type (funcall restore-object))) |
41 | | - (make-array dimensions :element-type element-type :adjustable adjustable |
42 | | - :fill-pointer fill-pointer)))) |
| 51 | + (make-array dimensions :element-type element-type :adjustable adjustable |
| 52 | + :fill-pointer fill-pointer))) |
43 | 53 | ;; We need to make our array first in case any of the array elements refer to it! |
44 | 54 | ;; If we are ever referred to, then there will already be a fixup in place for |
45 | 55 | ;; our array handled by `restore-new-reference-indicator'. |
|
0 commit comments