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