diff runtime/array.c @ 103:7428aa5d6ade

Compiler compiled by compiler sort of working
author Mike Pavone <pavone@retrodev.com>
date Wed, 11 Aug 2010 03:13:28 -0400
parents fa437d23bb24
children 2d2da148d844 43cc42df26cc
line wrap: on
line diff
--- a/runtime/array.c	Tue Aug 10 20:55:52 2010 -0400
+++ b/runtime/array.c	Wed Aug 11 03:13:28 2010 -0400
@@ -7,6 +7,7 @@
 	t_Array * arr = (t_Array *)array;
 	memcpy(((char *)dest) + sizeof(object), ((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, get_blueprint(dest)->size);
 	get_blueprint(dest)->copy(dest);
+	release_ref(array);
 }
 
 void _internal_array_copyin(object * array, int32_t index, object * val)
@@ -14,6 +15,7 @@
 	t_Array * arr = (t_Array *)array;
 	memcpy(((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, ((char *)val) + sizeof(object), arr->payload.Eltype->bp->size);
 	get_blueprint(val)->copy(val);
+	release_ref(val);
 }
 
 object * _internal_array_getboxed(object * array, int32_t index)
@@ -52,7 +54,7 @@
 	srcarr = (object **)(source+1);
 	destarr = (object **)(ret+1);
 	for(idx = 0; idx < tocopy; ++idx)
-		destarr[idx] = srcarr[idx];
+		destarr[idx] = add_ref(srcarr[idx]);
 	release_ref(osource);
 	
 	return (object *)ret;
@@ -84,11 +86,11 @@
 	ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size);
 	ret->payload.Length = 0;
 	ret->payload.Storage = size;
+	ret->payload.Eltype = bp;
 	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
@@ -99,9 +101,73 @@
 			cur += bp->bp->size;
 		}
 	}
-	fflush(stdout);
 	release_ref(osource);
 	
 	return (object *)ret;
 }
 
+void internalarrayboxedcopy(object * obj)
+{
+	int32_t idx;
+	object **elarr;
+	t_BoxedSP_Array * arr = (t_BoxedSP_Array *)obj;
+	elarr = (object **)(arr+1);
+	for(idx = 0; idx < arr->payload.Length; ++idx)
+	{
+		add_ref(elarr[idx]);
+	}
+}
+
+void internalarraynakedcopy(object * obj)
+{	
+	int32_t tocopy,idx;
+	char *cur;
+	t_Array *arr = (t_Array *)obj;
+	t_Blueprint * bp = arr->payload.Eltype;
+	//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 *)(arr+1))-sizeof(object) ;
+		for(idx=0; idx < arr->payload.Length; ++idx)
+		{
+			bp->bp->copy((object *)cur);
+			cur += bp->bp->size;
+		}
+	}
+	add_ref((object *)bp);
+}
+
+void internalarrayboxedcleanup(object * obj)
+{
+	int32_t idx;
+	object **elarr;
+	t_BoxedSP_Array * arr = (t_BoxedSP_Array *)obj;
+	elarr = (object **)(arr+1);
+	for(idx = 0; idx < arr->payload.Length; ++idx)
+	{
+		release_ref(elarr[idx]);
+	}
+}
+
+void internalarraynakedcleanup(object * obj)
+{
+	int32_t tocopy,idx;
+	char *cur;
+	t_Array *arr = (t_Array *)obj;
+	t_Blueprint * bp = arr->payload.Eltype;
+	//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 *)(arr+1))-sizeof(object) ;
+		for(idx=0; idx < arr->payload.Length; ++idx)
+		{
+			bp->bp->cleanup((object *)cur);
+			cur += bp->bp->size;
+		}
+	}
+	release_ref((object *)bp);
+}
+
+