Skip to content

Commit 17debf5

Browse files
committed
Replace etypecase-error compiler macro with transform
This isolates it to cclasp, and will help in removing the multiple-value-foreign-call special operator. The other ERROR cases are up next.
1 parent 13f9e5a commit 17debf5

File tree

7 files changed

+18
-16
lines changed

7 files changed

+18
-16
lines changed

src/core/commonLispPackage.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ SYMBOL_EXPORT_SC_(ClPkg, eql);
175175
SYMBOL_EXPORT_SC_(ClPkg, equal);
176176
SYMBOL_EXPORT_SC_(ClPkg, equalp);
177177
SYMBOL_EXPORT_SC_(ClPkg, error);
178+
SYMBOL_EXPORT_SC_(ClPkg, etypecase);
178179
SYMBOL_EXPORT_SC_(ClPkg, eval);
179180
SYMBOL_EXPORT_SC_(ClPkg, every);
180181
SYMBOL_EXPORT_SC_(ClPkg, extended_char);

src/lisp/kernel/cleavir/bir-to-bmir.lisp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@
170170

171171
(deftransform random-state-p (core::headerq random-state) t)
172172

173+
(deftransform core::etypecase-error core::etypecase-error t t)
174+
173175
(deftransform core:to-single-float core::double-to-single double-float)
174176
(deftransform core:to-single-float core::fixnum-to-single fixnum)
175177
(deftransform core:to-double-float core::single-to-double single-float)

src/lisp/kernel/cleavir/primop.lisp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@
130130
;;; Particular primops
131131
;;;
132132

133+
(defvprimop-intrinsic core::etypecase-error ((:object) :object :object)
134+
"cc_etypecase_error")
135+
133136
(macrolet ((def-float-compare (sfname dfname op reversep)
134137
`(progn
135138
(deftprimop ,sfname (:single-float :single-float)

src/lisp/kernel/cleavir/type.lisp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,10 @@
303303
(declare (ignore datum arguments))
304304
(ctype:values-bottom *clasp-system*))
305305

306+
(define-deriver core::etypecase-error (datum types)
307+
(declare (ignore datum types))
308+
(ctype:values-bottom *clasp-system*))
309+
306310
;;; I extremely doubt these matter, but why not.
307311
(define-deriver cerror (cfc datum &rest arguments)
308312
(declare (ignore cfc datum arguments))

src/lisp/kernel/cmp/opt/opt-condition.lisp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,3 @@
2727
default)))
2828
;; this will include the non-constant case (datum = nil)
2929
(otherwise default))))
30-
31-
;; Ditto for ETYPECASE
32-
#+(and (not bytecode) (or cclasp eclasp))
33-
(define-compiler-macro core::etypecase-error (&whole whole value types &environment env)
34-
(if (constantp types env)
35-
(let ((types (ext:constant-form-value types env)))
36-
`(core:multiple-value-foreign-call
37-
"cc_error_case_failure"
38-
,value '(or ,@types) 'etypecase ',types))
39-
whole))

src/lisp/kernel/cmp/primitives.lisp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888

8989
(primitive-unwinds "cc_error_type_error" :void (list :t* :t*) :does-not-return t)
9090
(primitive-unwinds "cc_error_array_out_of_bounds" :void (list :t* :t* :t*) :does-not-return t)
91-
(primitive-unwinds "cc_error_case_failure" :void (list :t* :t* :t* :t*) :does-not-return t)
91+
(primitive-unwinds "cc_etypecase_error" :void (list :t* :t*) :does-not-return t)
9292

9393
(primitive-unwinds "gdb" :void nil)
9494
(primitive "debugInspectTPtr" :void (list :t*))

src/llvmo/link_intrinsics.cc

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,13 +1059,15 @@ void cc_error_array_out_of_bounds(T_O* index, T_O* expected_type, T_O* array) {
10591059

10601060
SYMBOL_EXPORT_SC_(CorePkg, case_failure);
10611061
SYMBOL_EXPORT_SC_(KeywordPkg, possibilities);
1062-
NEVER_OPTIMIZE void cc_error_case_failure(T_O* datum, T_O* expected_type, T_O* name, T_O* possibilities) {
1062+
NEVER_OPTIMIZE void cc_etypecase_error(T_O* datum, T_O* possibilities) {
10631063
core::T_sp tdatum((gctools::Tagged)datum);
1064-
core::T_sp texpected_type((gctools::Tagged)expected_type);
1065-
core::T_sp tname((gctools::Tagged)name);
10661064
core::T_sp tpossibilities((gctools::Tagged)possibilities);
1067-
core::eval::funcall(cl::_sym_error, core::_sym_case_failure, kw::_sym_datum, tdatum, kw::_sym_expected_type, texpected_type,
1068-
kw::_sym_name, tname, kw::_sym_possibilities, tpossibilities);
1065+
core::T_sp expected = core::Cons_O::create(cl::_sym_or, tpossibilities);
1066+
core::eval::funcall(cl::_sym_error, core::_sym_case_failure,
1067+
kw::_sym_datum, tdatum,
1068+
kw::_sym_expected_type, expected,
1069+
kw::_sym_name, cl::_sym_etypecase,
1070+
kw::_sym_possibilities, tpossibilities);
10691071
}
10701072

10711073
core::T_O* cc_enclose(core::T_O* simpleFunInfo, std::size_t numCells) {

0 commit comments

Comments
 (0)