shithub: sl

Download patch

ref: 12e6e4059651285cbc6df5c58e9ed43c81919b36
parent: c6aa991371c01426c0925b61776f957823425799
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Jan 28 22:13:38 EST 2025

add ismpint and tompint

--- a/src/builtins.c
+++ b/src/builtins.c
@@ -264,9 +264,7 @@
 BUILTIN("bignum?", bignump)
 {
 	argcount(nargs, 1);
-	value_t v = args[0];
-	return (iscvalue(v) && cp_numtype(ptr(v)) == T_MPINT) ?
-		FL_t : FL_f;
+	return ismpint(args[0]) ? FL_t : FL_f;
 }
 
 BUILTIN("fixnum", fixnum)
@@ -275,14 +273,15 @@
 	value_t v = args[0];
 	if(isfixnum(v))
 		return v;
-	void *p = ptr(v);
-	if(iscprim(v))
+	if(iscprim(v)){
+		void *p = ptr(v);
 		return fixnum(conv_to_int64(cp_data(p), cp_numtype(p)));
-	if(iscvalue(v) && cp_numtype(p) == T_MPINT)
+	}
+	if(ismpint(v))
 #ifdef BITS64
-		return fixnum(mptov(*(mpint**)cv_data(p)));
+		return fixnum(mptov(tompint(v)));
 #else
-		return fixnum(mptoi(*(mpint**)cv_data(p)));
+		return fixnum(mptoi(tompint(v)));
 #endif
 	type_error("number", v);
 }
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -223,9 +223,8 @@
 			cprim_t *cp = ptr(arg); \
 			void *p = cp_data(cp); \
 			n = (ctype)conv_to_##cnvt(p, cp_numtype(cp)); \
-		}else if(iscvalue(arg) && cp_numtype(ptr(arg)) == T_MPINT){ \
-			cvalue_t *cv = ptr(arg); \
-			void *p = cv_data(cv); \
+		}else if(ismpint(arg)){ \
+			void *p = cv_data(ptr(arg)); \
 			n = (ctype)conv_to_##cnvt(p, T_MPINT); \
 		}else \
 			return 1; \
--- a/src/flisp.h
+++ b/src/flisp.h
@@ -111,7 +111,7 @@
 #define bothfixnums(x, y) ((((x)|(y)) & 3) == TAG_NUM)
 #define isvector(x) (tag(x) == TAG_VECTOR)
 #define iscvalue(x) (tag(x) == TAG_CVALUE)
-#define iscprim(x)  (tag(x) == TAG_CPRIM)
+#define iscprim(x) (tag(x) == TAG_CPRIM)
 // doesn't lead to other values
 #define leafp(a) (((a)&TAG_NONLEAF_MASK) != TAG_NONLEAF_MASK)
 
@@ -328,6 +328,9 @@
 #define cp_data(cp)	(&((cprim_t*)(cp))->_space[0])
 // WARNING: multiple evaluation!
 #define cptr(v) (iscprim(v) ? cp_data(ptr(v)) : cvalue_data(v))
+
+#define ismpint(v) (iscvalue(v) && cp_numtype(ptr(v)) == T_MPINT)
+#define tompint(v) (*(mpint**)cv_data(ptr(v)))
 
 #define BUILTIN(lname, cname) \
 	value_t fn_builtin_##cname(value_t *args, uint32_t nargs)
--- a/src/string.c
+++ b/src/string.c
@@ -382,10 +382,10 @@
 			lerrorf(FL_ArgError, "invalid radix with floating point");
 		else
 			return fn_builtin_string(args, nargs);
-	}else if(iscvalue(n) && cp_numtype(ptr(n)) == T_MPINT){
+	}else if(ismpint(n)){
 		if(radix != 16 && radix != 10 && radix != 8 && radix != 4 && radix != 2)
 			lerrorf(FL_ArgError, "invalid radix with bignum");
-		mpint *i = *(mpint**)cv_data(ptr(n));
+		mpint *i = tompint(n);
 		char *s = mptoa(i, radix, nil, 0);
 		assert(s != nil);
 		if(radix == 16){ /* FFFF → ffff */