|
103 | 103 | (ensure-enough-data storage 8) |
104 | 104 | (let* ((offset (read-storage-offset storage)) |
105 | 105 | (fixnum (signed-sap-ref-64 (read-storage-sap storage) offset))) |
| 106 | + (unless (typep fixnum 'fixnum) |
| 107 | + (unexpected-data "fixnum" fixnum)) |
106 | 108 | (setf (read-storage-offset storage) (truly-the fixnum (+ offset 8))) |
107 | 109 | (truly-the fixnum fixnum))) |
108 | 110 |
|
|
220 | 222 | (incf offset)) |
221 | 223 | (set-sap-ref-double sap offset double-float))))) |
222 | 224 |
|
| 225 | +(declaim (inline ensure-integer)) |
| 226 | +(defun ensure-integer (x) |
| 227 | + (unless (integerp x) |
| 228 | + (unexpected-data "integer" x)) |
| 229 | + x) |
| 230 | + |
223 | 231 | (defun restore-ratio (restore-object) |
224 | 232 | (declare (optimize (speed 3) (safety 1)) (type function restore-object)) |
225 | | - (/ (the integer (funcall restore-object)) |
226 | | - (the integer (funcall restore-object)))) |
| 233 | + (let ((a (ensure-integer (funcall restore-object))) |
| 234 | + (b (ensure-integer (funcall restore-object)))) |
| 235 | + (declare (type integer a b)) |
| 236 | + (unless (> b 0) |
| 237 | + (unexpected-data "integer > 0" b)) |
| 238 | + (/ (the integer a) (the integer b)))) |
227 | 239 |
|
228 | 240 | (defun store-ratio (ratio storage num-eq-refs assign-new-reference-id) |
229 | 241 | "Nominally we don't need to do references here, but if someone has two bignums and takes |
|
239 | 251 | (store-integer (numerator ratio)) |
240 | 252 | (store-integer (denominator ratio))))) |
241 | 253 |
|
| 254 | +(declaim (inline ensure-real)) |
| 255 | +(defun ensure-real (x) |
| 256 | + (unless (typep x 'real) |
| 257 | + (unexpected-data "real" x)) |
| 258 | + x) |
| 259 | + |
242 | 260 | (defun restore-complex (restore-object) |
243 | 261 | (declare (type function restore-object)) |
244 | | - (complex (funcall restore-object) |
245 | | - (funcall restore-object))) |
| 262 | + (complex (ensure-real (funcall restore-object)) |
| 263 | + (ensure-real (funcall restore-object)))) |
246 | 264 |
|
247 | 265 | (declaim (inline restore-complex-double-float)) |
248 | 266 | (defun restore-complex-double-float (storage) |
|
296 | 314 | (if (>= tag +first-direct-unsigned-integer-interior-code+) |
297 | 315 | (- tag +first-direct-unsigned-integer-interior-code+) |
298 | 316 | (truly-the fixnum |
299 | | - (+ (ecase tag |
300 | | - (#.+ub8-code+ (restore-ub8 storage)) |
301 | | - (#.+ub16-code+ (restore-ub16 storage)) |
302 | | - (#.+ub32-code+ (restore-ub32 storage)) |
303 | | - (#.+fixnum-code+ (restore-fixnum storage))) |
304 | | - +interior-coded-max-integer+ 1))))) |
| 317 | + (+ (case tag |
| 318 | + (#.+ub8-code+ (restore-ub8 storage)) |
| 319 | + (#.+ub16-code+ (restore-ub16 storage)) |
| 320 | + (#.+ub32-code+ (restore-ub32 storage)) |
| 321 | + (#.+fixnum-code+ |
| 322 | + (let ((fixnum (restore-fixnum storage))) |
| 323 | + (unless (>= fixnum 0) |
| 324 | + (unexpected-data "unsigned fixnum" fixnum)) |
| 325 | + (truly-the fixnum fixnum))) |
| 326 | + (otherwise (unexpected-data "tag for unsigned fixnum" tag))) |
| 327 | + +interior-coded-max-integer+ 1))))) |
305 | 328 |
|
306 | 329 | (declaim (ftype (function (read-storage) |
307 | 330 | #+sbcl (values fixnum &optional) |
|
313 | 336 | (let ((tag (restore-ub8 storage))) |
314 | 337 | (if (<= +small-integer-zero-code+ tag +last-small-integer-code+) |
315 | 338 | (- tag +small-integer-zero-code+) |
316 | | - (ecase tag |
| 339 | + (case tag |
317 | 340 | (#.+ub8-code+ (restore-ub8 storage)) |
318 | 341 | (#.+ub16-code+ (restore-ub16 storage)) |
319 | 342 | (#.+ub32-code+ (restore-ub32 storage)) |
320 | | - (#.+fixnum-code+ (restore-fixnum storage)))))) |
| 343 | + (#.+fixnum-code+ (restore-fixnum storage)) |
| 344 | + (otherwise (unexpected-data "tag for unsigned fixnum" tag)))))) |
321 | 345 |
|
322 | 346 | (declaim (ftype (function (read-storage) |
323 | 347 | #+sbcl (values fixnum &optional) |
|
327 | 351 | (let ((tag (restore-ub8 storage))) |
328 | 352 | (if (<= +first-small-integer-code+ tag +last-small-integer-code+) |
329 | 353 | (- tag +small-integer-zero-code+) |
330 | | - (ecase tag |
| 354 | + (case tag |
331 | 355 | (#.+ub8-code+ (restore-ub8 storage)) |
332 | 356 | (#.+ub16-code+ (restore-ub16 storage)) |
333 | 357 | (#.+ub32-code+ (restore-ub32 storage)) |
334 | 358 | (#.+fixnum-code+ (restore-fixnum storage)) |
335 | 359 | (#.+sb8-code+ (restore-sb8 storage)) |
336 | 360 | (#.+sb16-code+ (restore-sb16 storage)) |
337 | | - (#.+sb32-code+ (restore-sb32 storage)))))) |
| 361 | + (#.+sb32-code+ (restore-sb32 storage)) |
| 362 | + (otherwise (unexpected-data "tag for fixnum" tag)))))) |
338 | 363 |
|
339 | 364 | (declaim (inline store-tagged-unsigned-integer)) |
340 | 365 |
|
|
0 commit comments