ref: ec4d8b26ab214f3b601db96d7effd78ea5da89c8
parent: c141adb1002f51f9754b288de7102f7d76dd5373
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Wed Mar 19 02:25:32 EDT 2025
aref/aset!: fail on NIL (don't consider it a sequence) Fixes: https://todo.sr.ht/~ft/sl/51
--- a/src/vm.h
+++ b/src/vm.h
@@ -438,7 +438,7 @@
v = vec_elt(v, isz);
continue;
}
- if(!iscons(v) && v != sl_nil){
+ if(!iscons(v)){
sl.sp = sp;
type_error("sequence", v);
}
@@ -524,7 +524,7 @@
v = vec_elt(v, isz);
continue;
}
- if(!iscons(v) && v != sl_nil){
+ if(sl_unlikely(!iscons(v))){
sl.sp = sp;
type_error("sequence", v);
}
@@ -550,7 +550,7 @@
bounds_error(v, e);
}
vec_elt(v, isz) = (e = sp[-1]);
- }else if(iscons(v) || v == sl_nil){
+ }else if(iscons(v)){
for(sl_v v0 = v;; isz--){
if(isz == 0){
car_(v) = (e = sp[-1]);
--- a/test/unittest.lsp
+++ b/test/unittest.lsp
@@ -444,6 +444,8 @@
(assert (equal? (fixnum #\o) (aref #("hello") 0 (1+ 3))))
(assert-fail (aref #("hello") 0 5))
(assert-fail (aref #("hello") 1 0))
+(assert-fail (aref '(()) 0 0))
+(assert-fail (apply aref '((()) 0 0)))
;; aset with multiple indices
(def a #(#(0 1 2) #(3 (4 5 6) 7)))
@@ -452,6 +454,8 @@
(assert (equal? "hello" (aset! a (1+ 0) 2 "hello")))
(assert-fail (aset! a 1 1 3 "nope"))
(assert (equal? a #(#(8 1 2) #(3 (4 5 9) "hello"))))
+(assert-fail (aset! '(()) 0 0 1))
+(assert-fail (apply aset! '((()) 0 0 1)))
;; apply with multiple args
(assert (equal? 15 (apply + 1 2 '(3 4 5))))