comparison 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
comparison
equal deleted inserted replaced
95:f4fd8962c385 96:5a08705f7610
16 } 16 }
17 17
18 object * _internal_array_getboxed(object * array, int32_t index) 18 object * _internal_array_getboxed(object * array, int32_t index)
19 { 19 {
20 object * ret; 20 object * ret;
21 object ** intarr = (object **)(((char *) array) + sizeof(t_Array)); 21 object ** intarr = (object **)(((char *) array) + sizeof(t_BoxedSP_Array));
22 ret = add_ref(intarr[index]); 22 ret = add_ref(intarr[index]);
23 release_ref(array); 23 release_ref(array);
24 return ret; 24 return ret;
25 } 25 }
26 26
27 void _internal_array_setboxed(object *array, int32_t index, object * val) 27 void _internal_array_setboxed(object *array, int32_t index, object * val)
28 { 28 {
29 object ** intarr = (object **)(((char *) array) + sizeof(t_Array)); 29 object ** intarr = (object **)(((char *) array) + sizeof(t_BoxedSP_Array));
30 intarr[index] = val; 30 intarr[index] = val;
31 } 31 }
32 32
33 object *_internal_array_allocboxed(int32_t size) 33 object *_internal_array_allocboxed(int32_t size)
34 { 34 {
35 t_Array * ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+sizeof(object *)*size); 35 t_BoxedSP_Array * ret = (t_BoxedSP_Array *)new_multisize(TYPE_BOXEDARRAY, sizeof(nt_BoxedSP_Array)+sizeof(object *)*size);
36 ret->payload.Length = 0; 36 ret->payload.Length = 0;
37 ret->payload.Storage = size; 37 ret->payload.Storage = size;
38 ret->payload.Eltype = (t_Blueprint *)make_Blueprint(0); 38
39 return (object *)ret;
40 }
41
42 object *_internal_array_allocboxedcopy(object * osource, int32_t size)
43 {
44 int32_t tocopy,idx;
45 object **srcarr, **destarr;
46 t_BoxedSP_Array * source = (t_BoxedSP_Array *)osource;
47 t_BoxedSP_Array * ret = (t_BoxedSP_Array *)new_multisize(TYPE_BOXEDARRAY, sizeof(nt_BoxedSP_Array)+sizeof(object *)*size);
48 ret->payload.Length = 0;
49 ret->payload.Storage = size;
50 tocopy = size < source->payload.Length ? size : source->payload.Length;
51 srcarr = (object **)(source+1);
52 destarr = (object **)(ret+1);
53 for(idx = 0; idx < tocopy; ++idx)
54 destarr[idx] = srcarr[idx];
55 release_ref(osource);
39 56
40 return (object *)ret; 57 return (object *)ret;
41 } 58 }
42 59
43 object * _internal_array_allocnaked(int32_t size , object * type) 60 object * _internal_array_allocnaked(int32_t size , object * type)
44 { 61 {
45 t_Array * ret; 62 t_Array * ret;
46 t_Blueprint * bp = (t_Blueprint *)type; 63 t_Blueprint * bp = (t_Blueprint *)type;
47 if (bp->bp->size < 0) { 64 if (bp->bp->size < 0) {
65 release_ref(type);
48 return _internal_array_allocboxed(size); 66 return _internal_array_allocboxed(size);
49 } 67 }
50 ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size); 68 ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size);
51 ret->payload.Length = 0; 69 ret->payload.Length = 0;
52 ret->payload.Storage = size; 70 ret->payload.Storage = size;
53 ret->payload.Eltype = bp; 71 ret->payload.Eltype = bp;
54 72
55 return ret; 73 return (object *)ret;
56 } 74 }
57 75
76 object * _internal_array_allocnakedcopy(object * osource, int32_t size)
77 {
78 int32_t tocopy,idx;
79 object *cur;
80 t_Array * ret, *source = (t_Array *)osource;
81 t_Blueprint * bp = source->payload.Eltype;
82
83 ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size);
84 ret->payload.Length = 0;
85 ret->payload.Storage = size;
86 add_ref((object *)bp);
87 ret->payload.Eltype = bp;
88 tocopy = size < source->payload.Length ? size : source->payload.Length;
89
90 memcpy(ret+1, source+1, tocopy*bp->bp->size);
91 //Lower type IDs don't have any reference params so we can safely skip this for those
92 if(bp->bp->type_id >= TYPE_ARRAY)
93 {
94 //Ugly hack
95 cur = ((char *)(ret+1))-sizeof(object) ;
96 for(idx=0; idx < tocopy; ++idx)
97 {
98 bp->bp->copy((object *)cur);
99 cur += bp->bp->size;
100 }
101 }
102 release_ref(osource);
103
104 return (object *)ret;
105 }
106