diff runtime/array.c @ 96:5a08705f7610

Semi-broken cleanup of Array implementation
author Mike Pavone <pavone@retrodev.com>
date Mon, 02 Aug 2010 05:12:19 -0400
parents 4d5ea487f810
children fa437d23bb24
line wrap: on
line diff
--- a/runtime/array.c	Mon Aug 02 01:55:56 2010 -0400
+++ b/runtime/array.c	Mon Aug 02 05:12:19 2010 -0400
@@ -18,7 +18,7 @@
 object * _internal_array_getboxed(object * array, int32_t index)
 {
 	object * ret;
-	object ** intarr = (object **)(((char *) array) + sizeof(t_Array));
+	object ** intarr = (object **)(((char *) array) + sizeof(t_BoxedSP_Array));
 	ret = add_ref(intarr[index]);
 	release_ref(array);
 	return ret;
@@ -26,16 +26,33 @@
 
 void _internal_array_setboxed(object *array, int32_t index, object * val)
 {
-	object ** intarr = (object **)(((char *) array) + sizeof(t_Array));
+	object ** intarr = (object **)(((char *) array) + sizeof(t_BoxedSP_Array));
 	intarr[index] = val;
 }
 
 object *_internal_array_allocboxed(int32_t size)
 {
-	t_Array * ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+sizeof(object *)*size);
+	t_BoxedSP_Array * ret = (t_BoxedSP_Array *)new_multisize(TYPE_BOXEDARRAY, sizeof(nt_BoxedSP_Array)+sizeof(object *)*size);
 	ret->payload.Length = 0;
 	ret->payload.Storage = size;
-	ret->payload.Eltype = (t_Blueprint *)make_Blueprint(0);
+	
+	return (object *)ret;
+}
+
+object *_internal_array_allocboxedcopy(object * osource, int32_t size)
+{
+	int32_t tocopy,idx;
+	object **srcarr, **destarr;
+	t_BoxedSP_Array * source = (t_BoxedSP_Array *)osource;
+	t_BoxedSP_Array * ret = (t_BoxedSP_Array *)new_multisize(TYPE_BOXEDARRAY, sizeof(nt_BoxedSP_Array)+sizeof(object *)*size);
+	ret->payload.Length = 0;
+	ret->payload.Storage = size;
+	tocopy = size < source->payload.Length ? size : source->payload.Length;
+	srcarr = (object **)(source+1);
+	destarr = (object **)(ret+1);
+	for(idx = 0; idx < tocopy; ++idx)
+		destarr[idx] = srcarr[idx];
+	release_ref(osource);
 	
 	return (object *)ret;
 }
@@ -45,6 +62,7 @@
 	t_Array * ret;
 	t_Blueprint * bp = (t_Blueprint *)type;
 	if (bp->bp->size < 0) {
+		release_ref(type);
 		return _internal_array_allocboxed(size);
 	}	
 	ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size);
@@ -52,6 +70,37 @@
 	ret->payload.Storage = size;
 	ret->payload.Eltype = bp;
 	
-	return ret;
+	return (object *)ret;
 }
 
+object * _internal_array_allocnakedcopy(object * osource, int32_t size)
+{
+	int32_t tocopy,idx;
+	object *cur;
+	t_Array * ret, *source = (t_Array *)osource;
+	t_Blueprint * bp = source->payload.Eltype;
+	
+	ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size);
+	ret->payload.Length = 0;
+	ret->payload.Storage = size;
+	add_ref((object *)bp);
+	ret->payload.Eltype = bp;
+	tocopy = size < source->payload.Length ? size : source->payload.Length;
+
+	memcpy(ret+1, source+1, tocopy*bp->bp->size);
+	//Lower type IDs don't have any reference params so we can safely skip this for those
+	if(bp->bp->type_id >= TYPE_ARRAY)
+	{
+		//Ugly hack
+		cur = ((char *)(ret+1))-sizeof(object) ;
+		for(idx=0; idx < tocopy; ++idx)
+		{
+			bp->bp->copy((object *)cur);
+			cur += bp->bp->size;
+		}
+	}
+	release_ref(osource);
+	
+	return (object *)ret;
+}
+