# HG changeset patch # User Mike Pavone # Date 1281510808 14400 # Node ID 7428aa5d6ade684219b05d9b49a761aefda52ec1 # Parent 2f6f0867fd68467b69d8e1b6df7a2faa6e35f6b7 Compiler compiled by compiler sort of working diff -r 2f6f0867fd68 -r 7428aa5d6ade nworker.rhope --- 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 diff -r 2f6f0867fd68 -r 7428aa5d6ade runtime/array.c --- 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); +} + + diff -r 2f6f0867fd68 -r 7428aa5d6ade runtime/array.h --- 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_ diff -r 2f6f0867fd68 -r 7428aa5d6ade runtime/worker.c --- 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]); + } + } +} diff -r 2f6f0867fd68 -r 7428aa5d6ade runtime/worker.h --- 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_