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;
}