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