diff --git a/bin/ikarus b/bin/ikarus index c02f4e0..ca1bf67 100755 Binary files a/bin/ikarus and b/bin/ikarus differ diff --git a/bin/ikarus-collect.c b/bin/ikarus-collect.c index f772178..6951e77 100644 --- a/bin/ikarus-collect.c +++ b/bin/ikarus-collect.c @@ -1109,12 +1109,12 @@ add_object_proc(gc_t* gc, ikp x) else if(tag == string_tag){ if(is_fixnum(fst)){ int strlen = unfix(fst); - int memreq = align(strlen + disp_string_data + 1); + int memreq = align(strlen*string_char_size + disp_string_data + 1); ikp new_str = gc_alloc_new_data(memreq, gen, gc) + string_tag; ref(new_str, off_string_length) = fst; memcpy(new_str+off_string_data, x + off_string_data, - strlen + 1); + strlen*string_char_size + 1); ref(x, -string_tag) = forward_ptr; ref(x, wordsize-string_tag) = new_str; #if accounting diff --git a/bin/ikarus-data.h b/bin/ikarus-data.h index 2435bef..5508783 100644 --- a/bin/ikarus-data.h +++ b/bin/ikarus-data.h @@ -97,7 +97,7 @@ #define off_string_length (disp_string_length - string_tag) #define off_string_data (disp_string_data - string_tag) -#define string_data(x) ((char*)((x) + off_string_data)) +//#define string_data(x) ((char*)((x) + off_string_data)) #define string_set(x,i,c) \ ((((unsigned char*)(x)) + off_string_data + (int)(i))[0] = \ (((int)(c)) >> IK_CHAR_SHIFT)) diff --git a/bin/ikarus-main.c b/bin/ikarus-main.c index 716a2fe..3143ddf 100644 --- a/bin/ikarus-main.c +++ b/bin/ikarus-main.c @@ -137,11 +137,17 @@ int main(int argc, char** argv){ while(i > 0){ char* s = argv[i]; int n = strlen(s); - ikp str = ik_alloc(pcb, align(n+disp_string_data+1)); - ref(str, disp_string_length) = fix(n); - strcpy((char*)str+disp_string_data, s); + ikp str = ik_alloc(pcb, align(n*string_char_size+disp_string_data+1)) + + string_tag; + ref(str, off_string_length) = fix(n); + { + int i; + for(i=0; i