changeset 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 2f6f0867fd68
children 2d2da148d844 43cc42df26cc
files nworker.rhope runtime/array.c runtime/array.h runtime/worker.c runtime/worker.h
diffstat 5 files changed, 130 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/nworker.rhope	Tue Aug 10 20:55:52 2010 -0400
+++ b/nworker.rhope	Wed Aug 11 03:13:28 2010 -0400
@@ -1376,8 +1376,17 @@
 {
 	//Rhope identifiers can't start with spaces, so we can use identifiers that start with spaces for special functions
 	init name <- [" init "]Append[name]
-	copy name <- [" copy "]Append[name]
-	cleanup name <- [" cleanup "]Append[name]
+	[("Array","Boxed Array","Worker")]Find[name]
+	{
+		[("internalarraynaked","internalarrayboxed","internalworker")]Index[~]
+		{
+			copy name <- [~]Append["copy"]
+			cleanup name <- [~]Append["cleanup"]
+		}
+	}{
+		copy name <- [" copy "]Append[name]
+		cleanup name <- [" cleanup "]Append[name]
+	}
 	type <- [[[Fold["_Compile Blueprint Methods", Fold["_Compile Blueprint Fields", [backend]Create Type[name], [bp]Fields >>], [bp]Methods >>]
 	]Init <<[init name]
 	]Copy <<[copy name]
@@ -1389,14 +1398,17 @@
 Compile Special@NBlueprint[bp,backend,name:out]
 {
 	init name <- [" init "]Append[name]
-	copy name <- [" copy "]Append[name]
-	cleanup name <- [" cleanup "]Append[name]
-	got specials <- [bp]Make Special[
-				[bp]Make Special[
-					[bp]Make Special[backend, init name, name, "Make Init"], 
-					copy name, name, "Make Copy"], 
-			cleanup name, name, "Make Cleanup"]
-	out <- Fold[["Getters Setters"]Set Input[2, name], got specials, [bp]Fields >>]
+	[("Array","Boxed Array","Worker")]Find[name]
+	{
+		after copyclean <- Val[backend]
+	}{		
+		copy name <- [" copy "]Append[name]
+		cleanup name <- [" cleanup "]Append[name]
+		after copyclean <- [bp]Make Special[
+					[bp]Make Special[backend, copy name, name, "Make Copy"], 
+				cleanup name, name, "Make Cleanup"]
+	}
+	out <- Fold[["Getters Setters"]Set Input[2, name], [bp]Make Special[after copyclean, init name, name, "Make Init"], [bp]Fields >>]
 }
 
 Blueprint NProgram
--- 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);
+}
+
+
--- a/runtime/array.h	Tue Aug 10 20:55:52 2010 -0400
+++ b/runtime/array.h	Wed Aug 11 03:13:28 2010 -0400
@@ -13,6 +13,10 @@
 object *_internal_array_allocboxedcopy(object * osource, int32_t size);
 object * _internal_array_allocnaked(int32_t size , object * type);
 object * _internal_array_allocnakedcopy(object * osource, int32_t size);
+void internalarrayboxedcopy(object * obj);
+void internalarraynakedcopy(object * obj);
+void internalarrayboxedcleanup(object * obj);
+void internalarraynakedcleanup(object * obj);
 
 
 #endif //_ARRAY_H_
--- a/runtime/worker.c	Tue Aug 10 20:55:52 2010 -0400
+++ b/runtime/worker.c	Wed Aug 11 03:13:28 2010 -0400
@@ -35,3 +35,30 @@
 	}
 }
 
+void internalworkercopy(object * obj)
+{
+	int32_t idx;
+	t_Worker * worker = (t_Worker *)obj;
+	object **params = (object **)(worker+1);
+	for(idx = 0; idx < worker->payload.Size; ++idx)
+	{
+		if(params[idx])
+		{
+			add_ref(params[idx]);
+		}
+	}
+}
+
+void internalworkercleanup(object * obj)
+{
+	int32_t idx;
+	t_Worker * worker = (t_Worker *)obj;
+	object **params = (object **)(worker+1);
+	for(idx = 0; idx < worker->payload.Size; ++idx)
+	{
+		if(params[idx])
+		{
+			release_ref(params[idx]);
+		}
+	}
+}
--- a/runtime/worker.h	Tue Aug 10 20:55:52 2010 -0400
+++ b/runtime/worker.h	Wed Aug 11 03:13:28 2010 -0400
@@ -4,11 +4,12 @@
 #include "object.h"
 #include "func.h"
 #include "builtin.h"	
-
-object * _internal_worker_alloc(int16_t size);
-void _internal_worker_setinput(object * worker, int16_t num, object * val);
-object * _internal_worker_getinput(object * worker, int16_t num);
+
+object * _internal_worker_alloc(int16_t size);
+void _internal_worker_setinput(object * worker, int16_t num, object * val);
+object * _internal_worker_getinput(object * worker, int16_t num);
 int32_t _internal_worker_hasinput(object * worker, int16_t num);
-
+void internalworkercopy(object * obj);
+void internalworkercleanup(object * obj);
 
-#endif //_WORKER_H_
+#endif //_WORKER_H_