|
142 | 142 | clasp-cleavir:*clasp-system* |
143 | 143 | header-type)))) |
144 | 144 |
|
| 145 | +;; If CTYPE is an eql type (constant), return (constant t), else nil nil. |
| 146 | +(defun ctype-constant-value (ctype) |
| 147 | + (let ((system clasp-cleavir:*clasp-system*)) |
| 148 | + (if (cleavir-ctype:member-p system ctype) |
| 149 | + (let ((members (cleavir-ctype:member-members system ctype))) |
| 150 | + (if (= (length members) 1) |
| 151 | + (values (first members) t) |
| 152 | + (values nil nil))) |
| 153 | + (values nil nil)))) |
| 154 | + |
145 | 155 | (defun headerp-test (return-type object-type header-type) |
146 | 156 | (declare (ignore return-type object-type)) |
147 | | - (and (cleavir-ctype:member-p clasp-cleavir:*clasp-system* header-type) |
148 | | - (let ((h (first (cleavir-ctype:member-members |
149 | | - clasp-cleavir:*clasp-system* header-type)))) |
150 | | - (and (gethash h core:+type-header-value-map+) t)))) |
| 157 | + (multiple-value-bind (h constantp) |
| 158 | + (ctype-constant-value header-type) |
| 159 | + (and constantp (gethash h core:+type-header-value-map+) t))) |
151 | 160 |
|
152 | 161 | (deftransform-f core::headerp #'compute-headerp-primop 'headerp-test (0) |
153 | 162 | t t t) |
|
171 | 180 | (deftransform random-state-p (core::headerq random-state) t) |
172 | 181 |
|
173 | 182 | (deftransform core::etypecase-error core::etypecase-error t t) |
| 183 | +;; These are written kinda stupidly. Please forgive me. |
| 184 | +;; TODO: Better mechanism for &key parameters. |
| 185 | +(deftransform-f error (constantly 'type-error) (constantly t) |
| 186 | + (2 4) t (eql type-error) (eql :datum) t (eql :expected-type) t) |
| 187 | +(deftransform-f error (constantly 'type-error) (constantly t) |
| 188 | + (4 2) t (eql type-error) (eql :expected-type) t (eql :datum) t) |
174 | 189 |
|
175 | 190 | (deftransform core:to-single-float core::double-to-single double-float) |
176 | 191 | (deftransform core:to-single-float core::fixnum-to-single fixnum) |
|
341 | 356 | '(t single-float double-float |
342 | 357 | base-char character)) |
343 | 358 | (cleavir-ctype:member-p system order-type) |
344 | | - (let ((mems (cleavir-ctype:member-members system order-type))) |
345 | | - (and (= (length mems) 1) |
346 | | - (member (first mems) |
347 | | - '(:sequentially-consistent :relaxed |
348 | | - :acquire-release :acquire :release)))))) |
| 359 | + (member (ctype-constant-value order-type) |
| 360 | + '(:sequentially-consistent :relaxed |
| 361 | + :acquire-release :acquire :release)))) |
349 | 362 |
|
350 | 363 | (defun atomic-aref-test (return-type order-type array-type |
351 | 364 | &rest index-types) |
|
0 commit comments