Mercurial > repos > rhope
comparison 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 |
comparison
equal
deleted
inserted
replaced
102:2f6f0867fd68 | 103:7428aa5d6ade |
---|---|
5 void _internal_array_copyout(object * array, int32_t index, object * dest) | 5 void _internal_array_copyout(object * array, int32_t index, object * dest) |
6 { | 6 { |
7 t_Array * arr = (t_Array *)array; | 7 t_Array * arr = (t_Array *)array; |
8 memcpy(((char *)dest) + sizeof(object), ((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, get_blueprint(dest)->size); | 8 memcpy(((char *)dest) + sizeof(object), ((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, get_blueprint(dest)->size); |
9 get_blueprint(dest)->copy(dest); | 9 get_blueprint(dest)->copy(dest); |
10 release_ref(array); | |
10 } | 11 } |
11 | 12 |
12 void _internal_array_copyin(object * array, int32_t index, object * val) | 13 void _internal_array_copyin(object * array, int32_t index, object * val) |
13 { | 14 { |
14 t_Array * arr = (t_Array *)array; | 15 t_Array * arr = (t_Array *)array; |
15 memcpy(((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, ((char *)val) + sizeof(object), arr->payload.Eltype->bp->size); | 16 memcpy(((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, ((char *)val) + sizeof(object), arr->payload.Eltype->bp->size); |
16 get_blueprint(val)->copy(val); | 17 get_blueprint(val)->copy(val); |
18 release_ref(val); | |
17 } | 19 } |
18 | 20 |
19 object * _internal_array_getboxed(object * array, int32_t index) | 21 object * _internal_array_getboxed(object * array, int32_t index) |
20 { | 22 { |
21 object * ret; | 23 object * ret; |
50 ret->payload.Storage = size; | 52 ret->payload.Storage = size; |
51 tocopy = size < source->payload.Length ? size : source->payload.Length; | 53 tocopy = size < source->payload.Length ? size : source->payload.Length; |
52 srcarr = (object **)(source+1); | 54 srcarr = (object **)(source+1); |
53 destarr = (object **)(ret+1); | 55 destarr = (object **)(ret+1); |
54 for(idx = 0; idx < tocopy; ++idx) | 56 for(idx = 0; idx < tocopy; ++idx) |
55 destarr[idx] = srcarr[idx]; | 57 destarr[idx] = add_ref(srcarr[idx]); |
56 release_ref(osource); | 58 release_ref(osource); |
57 | 59 |
58 return (object *)ret; | 60 return (object *)ret; |
59 } | 61 } |
60 | 62 |
82 t_Blueprint * bp = source->payload.Eltype; | 84 t_Blueprint * bp = source->payload.Eltype; |
83 | 85 |
84 ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size); | 86 ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size); |
85 ret->payload.Length = 0; | 87 ret->payload.Length = 0; |
86 ret->payload.Storage = size; | 88 ret->payload.Storage = size; |
89 ret->payload.Eltype = bp; | |
87 add_ref((object *)bp); | 90 add_ref((object *)bp); |
88 ret->payload.Eltype = bp; | |
89 tocopy = size < source->payload.Length ? size : source->payload.Length; | 91 tocopy = size < source->payload.Length ? size : source->payload.Length; |
90 memcpy(ret+1, source+1, tocopy*bp->bp->size); | 92 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 | 93 |
92 if(bp->bp->type_id >= TYPE_ARRAY) | 94 if(bp->bp->type_id >= TYPE_ARRAY) |
93 { | 95 { |
94 //Ugly hack | 96 //Ugly hack |
95 cur = ((char *)(ret+1))-sizeof(object) ; | 97 cur = ((char *)(ret+1))-sizeof(object) ; |
96 for(idx=0; idx < tocopy; ++idx) | 98 for(idx=0; idx < tocopy; ++idx) |
97 { | 99 { |
98 bp->bp->copy((object *)cur); | 100 bp->bp->copy((object *)cur); |
99 cur += bp->bp->size; | 101 cur += bp->bp->size; |
100 } | 102 } |
101 } | 103 } |
102 fflush(stdout); | |
103 release_ref(osource); | 104 release_ref(osource); |
104 | 105 |
105 return (object *)ret; | 106 return (object *)ret; |
106 } | 107 } |
107 | 108 |
109 void internalarrayboxedcopy(object * obj) | |
110 { | |
111 int32_t idx; | |
112 object **elarr; | |
113 t_BoxedSP_Array * arr = (t_BoxedSP_Array *)obj; | |
114 elarr = (object **)(arr+1); | |
115 for(idx = 0; idx < arr->payload.Length; ++idx) | |
116 { | |
117 add_ref(elarr[idx]); | |
118 } | |
119 } | |
120 | |
121 void internalarraynakedcopy(object * obj) | |
122 { | |
123 int32_t tocopy,idx; | |
124 char *cur; | |
125 t_Array *arr = (t_Array *)obj; | |
126 t_Blueprint * bp = arr->payload.Eltype; | |
127 //Lower type IDs don't have any reference params so we can safely skip this for those | |
128 if(bp->bp->type_id >= TYPE_ARRAY) | |
129 { | |
130 //Ugly hack | |
131 cur = ((char *)(arr+1))-sizeof(object) ; | |
132 for(idx=0; idx < arr->payload.Length; ++idx) | |
133 { | |
134 bp->bp->copy((object *)cur); | |
135 cur += bp->bp->size; | |
136 } | |
137 } | |
138 add_ref((object *)bp); | |
139 } | |
140 | |
141 void internalarrayboxedcleanup(object * obj) | |
142 { | |
143 int32_t idx; | |
144 object **elarr; | |
145 t_BoxedSP_Array * arr = (t_BoxedSP_Array *)obj; | |
146 elarr = (object **)(arr+1); | |
147 for(idx = 0; idx < arr->payload.Length; ++idx) | |
148 { | |
149 release_ref(elarr[idx]); | |
150 } | |
151 } | |
152 | |
153 void internalarraynakedcleanup(object * obj) | |
154 { | |
155 int32_t tocopy,idx; | |
156 char *cur; | |
157 t_Array *arr = (t_Array *)obj; | |
158 t_Blueprint * bp = arr->payload.Eltype; | |
159 //Lower type IDs don't have any reference params so we can safely skip this for those | |
160 if(bp->bp->type_id >= TYPE_ARRAY) | |
161 { | |
162 //Ugly hack | |
163 cur = ((char *)(arr+1))-sizeof(object) ; | |
164 for(idx=0; idx < arr->payload.Length; ++idx) | |
165 { | |
166 bp->bp->cleanup((object *)cur); | |
167 cur += bp->bp->size; | |
168 } | |
169 } | |
170 release_ref((object *)bp); | |
171 } | |
172 | |
173 |