shithub: sl

Download patch

ref: 07b1360acf3d14f651113f9b7113f74fd56c21f5
parent: f141072d5a38bbd6280ed92a881a5e9a86049e9f
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Wed Apr 9 02:46:08 EDT 2025

const-error: throw with the symbol itself

--- a/src/builtins.c
+++ b/src/builtins.c
@@ -170,7 +170,7 @@
 	argcount(nargs, 2);
 	sl_sym *sym = tosym(args[0]);
 	if(sl_unlikely(isconst(sym)))
-		bthrow(const_error(sym));
+		bthrow(const_error(args[0]));
 	sym->binding = args[1];
 	return args[1];
 }
@@ -180,7 +180,7 @@
 	argcount(nargs, 1);
 	sl_sym *sym = tosym(args[0]);
 	if(sl_unlikely(isconst(sym)))
-		bthrow(const_error(sym));
+		bthrow(const_error(args[0]));
 	sym->binding = UNBOUND;
 	return sl_void;
 }
--- a/src/sl.c
+++ b/src/sl.c
@@ -167,14 +167,9 @@
 }
 
 _Noreturn void
-const_error(const sl_sym *sym)
+const_error(sl_v sym)
 {
-	lerrorf(
-		sl_errconst,
-		"modifying a %s is not permitted: %s",
-		iskeyword(sym) ? "keyword" : "constant",
-		sym->name
-	);
+	sl_raise(mk_list2(sl_errconst, sym));
 }
 
 _Noreturn void
--- a/src/sl.h
+++ b/src/sl.h
@@ -286,7 +286,7 @@
 _Noreturn void sl_raise(sl_v e);
 _Noreturn void type_error(const char *expected, sl_v got);
 _Noreturn void bounds_error(sl_v arr, sl_v ind);
-_Noreturn void const_error(const sl_sym *sym);
+_Noreturn void const_error(sl_v sym);
 _Noreturn void unbound_error(sl_v sym);
 _Noreturn void arity_error(int nargs, int c);
 
--- a/src/vm.h
+++ b/src/vm.h
@@ -857,8 +857,10 @@
 	v = vec_elt(v, i);
 	assert(issym(v));
 	sl_sym *sym = ptr(v);
-	if(sl_unlikely(isconst(sym)))
-		const_error(sym);
+	if(sl_unlikely(isconst(sym))){
+		*ipd = (uintptr)ip;
+		const_error(v);
+	}
 	sym->binding = sp[-1];
 	NEXT_OP;
 }