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