Mercurial > repos > rhope
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); +} + +