shithub: sl

Download patch

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))))