comparison runtime/array.c @ 63:04baa003de5a

Merged latest changes with better C branch
author Mike Pavone <pavone@retrodev.com>
date Wed, 05 May 2010 22:12:23 -0400
parents 70af7fa155d0
children 4d5ea487f810
comparison
equal deleted inserted replaced
62:b218af069da7 63:04baa003de5a
1 #include "array.h"
2 #include "integer.h" 1 #include "integer.h"
2 #include "object.h"
3 3
4 Func(Array,0, 4 void _internal_array_copyout(object * array, int32_t index, object * dest)
5 ;) 5 {
6 Ret(0, new_object(TYPE_ARRAY)) 6 t_Array * arr = (t_Array *)array;
7 Return 7 memcpy(((char *)dest) + sizeof(object), ((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, get_blueprint(dest)->size);
8 EndFunc 8 }
9 9
10 Method(Index,Array,2, 10 void _internal_array_copyin(object * array, int32_t index, object * val)
11 _t_Int32 * idx;) 11 {
12 Param(1,idx,Int32) 12 t_Array * arr = (t_Array *)array;
13 if (idx->num < 0 || idx->num >= me->numels) { 13 memcpy(((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, ((char *)val) + sizeof(object), arr->payload.Eltype->bp->size);
14 Ret(0, NULL) 14 }
15 Ret(1, me)
16 } else {
17 Ret(1, NULL)
18 if (me->contents_type) {
19 Ret(0, copy_from_raw(me->conents_type, (char *)me + sizeof(*me) + (idx->num * sizeof(object *))))
20 } else {
21 Ret(0, add_ref((object *)((char *)me + sizeof(*me) + (idx->num * sizeof(object *)))))
22 }
23 release_ref(me);
24 }
25 EndFunc
26 15
16 object * _internal_array_getboxed(object * array, int32_t index)
17 {
18 object * ret;
19 object ** intarr = (object **)(((char *) array) + sizeof(t_Array));
20 ret = add_ref(intarr[index]);
21 release_ref(array);
22 return ret;
23 }
24
25 void _internal_array_setboxed(object *array, int32_t index, object * val)
26 {
27 object ** intarr = (object **)(((char *) array) + sizeof(t_Array));
28 intarr[index] = val;
29 }
30
31 object *_internal_array_allocboxed(int32_t size)
32 {
33 t_Array * ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+sizeof(object *)*size);
34 ret->payload.Length = 0;
35 ret->payload.Storage = size;
36 ret->payload.Eltype = (t_Blueprint *)make_Blueprint(0);
37
38 return (object *)ret;
39 }
40
41 object * _internal_array_allocnaked(int32_t size , object * type)
42 {
43 t_Array * ret;
44 t_Blueprint * bp = (t_Blueprint *)type;
45 if (bp->bp->size < 0) {
46 return _internal_array_allocboxed(size);
47 }
48 ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size);
49 ret->payload.Length = 0;
50 ret->payload.Storage = size;
51 ret->payload.Eltype = bp;
52
53 return ret;
54 }
55