Mercurial > repos > rhope
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 |