shithub: sl

Download patch

ref: 2541b6d5353b03df793fabfe1a51ad2fe484ee75
parent: 94b9b2bac35c30b8128dcbaa9aa8a40cd56123ec
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Apr 7 00:15:46 EDT 2025

aref: return the value of the original array element type

--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -335,10 +335,10 @@
 	num_ctor_init_unboxed(typenam, ctype, tag) \
 	num_ctor_ctor_unboxed(typenam, ctype, tag)
 
-num_ctor_init_unboxed(s8, s8int, T_S8)
-num_ctor_init_unboxed(u8, u8int, T_U8)
-num_ctor_init_unboxed(s16, s16int, T_S16)
-num_ctor_init_unboxed(u16, u16int, T_U16)
+num_ctor_unboxed(s8, s8int, T_S8)
+num_ctor_unboxed(u8, u8int, T_U8)
+num_ctor_unboxed(s16, s16int, T_S16)
+num_ctor_unboxed(u16, u16int, T_U16)
 num_ctor_unboxed(s32, s32int, T_S32)
 num_ctor_unboxed(u32, u32int, T_U32)
 num_ctor_unboxed(s64, s64int, T_S64)
@@ -848,33 +848,29 @@
 {
 	u8int *data;
 	int index;
+	check_addr_args(args[0], args[1], &data, &index);
+
 	sl_type *eltype = cv_class(ptr(args[0]))->eltype;
-	sl_v el = 0;
 	sl_numtype nt = eltype->numtype;
-	if(nt >= T_S32)
-		el = cvalue(eltype, eltype->size);
-	check_addr_args(args[0], args[1], &data, &index);
-	if(nt < T_S32){
-		if(nt == T_S8)
-			return fixnum((s8int)data[index]);
-		if(nt == T_U8)
-			return fixnum((u8int)data[index]);
-		if(nt == T_S16)
-			return fixnum(((s16int*)data)[index]);
-		return fixnum(((u16int*)data)[index]);
+	if(nt < T_UNBOXED_NUM){
+		switch(nt){
+		case T_S8: return mk_s8(data[index]);
+		case T_U8: return mk_u8(data[index]);
+		case T_S16: return mk_s16(((s16int*)data)[index]);
+		case T_U16: return mk_u16(((u16int*)data)[index]);
+		case T_S32: return mk_s32(((s32int*)data)[index]);
+		case T_U32: return mk_u32(((u32int*)data)[index]);
+		case T_S64: return mk_s64(((s64int*)data)[index]);
+		case T_U64: return mk_u64(((u64int*)data)[index]);
+		default: break;
+		}
 	}
+	if(eltype == sl_runetype)
+		return mk_rune(((Rune*)data)[index]);
+
+	sl_v el = cvalue(eltype, eltype->size);
 	u8int *dest = cptr(el);
-	usize sz = eltype->size;
-	if(sz == 1)
-		*dest = data[index];
-	else if(sz == 2)
-		*(s16int*)dest = ((s16int*)data)[index];
-	else if(sz == 4)
-		*(s32int*)dest = ((s32int*)data)[index];
-	else if(sz == 8)
-		*(s64int*)dest = ((s64int*)data)[index];
-	else
-		memcpy(dest, data + index*sz, sz);
+	memcpy(dest, data + index*eltype->size, eltype->size);
 	return el;
 }
 
--- a/src/cvalues.h
+++ b/src/cvalues.h
@@ -46,6 +46,10 @@
 
 sl_v mk_double(double n);
 sl_v mk_float(float n);
+sl_v mk_s8(s8int n);
+sl_v mk_u8(u8int n);
+sl_v mk_s16(s16int n);
+sl_v mk_u16(u16int n);
 sl_v mk_s32(s32int n);
 sl_v mk_u32(u32int n);
 sl_v mk_s64(s64int n);
--