Mercurial > repos > rhope
annotate runtime/array.c @ 124:8aedae4f4ddd
Add support for Int32 as Dictionary key
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 28 Oct 2010 21:05:50 -0400 |
parents | 72c648bca43b |
children |
rev | line source |
---|---|
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
1 #include "integer.h" |
78
4d5ea487f810
Working String implementation and some basic (but nowhere near exhaustive) tests
Mike Pavone <pavone@retrodev.com>
parents:
53
diff
changeset
|
2 #include "object.h" |
97 | 3 #include <stdio.h> |
78
4d5ea487f810
Working String implementation and some basic (but nowhere near exhaustive) tests
Mike Pavone <pavone@retrodev.com>
parents:
53
diff
changeset
|
4 |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
5 void _internal_array_copyout(object * array, int32_t index, object * dest) |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
6 { |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
7 t_Array * arr = (t_Array *)array; |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
8 memcpy(((char *)dest) + sizeof(object), ((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, get_blueprint(dest)->size); |
78
4d5ea487f810
Working String implementation and some basic (but nowhere near exhaustive) tests
Mike Pavone <pavone@retrodev.com>
parents:
53
diff
changeset
|
9 get_blueprint(dest)->copy(dest); |
103
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
10 release_ref(array); |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
11 } |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
12 |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
13 void _internal_array_copyin(object * array, int32_t index, object * val) |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
14 { |
119
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
15 char *dest; |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
16 t_Array * arr = (t_Array *)array; |
119
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
17 t_Blueprint * bp = arr->payload.Eltype; |
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
18 if(bp->bp->type_id >= TYPE_ARRAY && index < arr->payload.Length) |
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
19 { |
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
20 //Ugly hack |
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
21 dest = ((char *)(arr+1))-sizeof(object) + bp->bp->size * index; |
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
22 bp->bp->cleanup((object *)dest); |
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
23 } |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
24 memcpy(((char *)array) + sizeof(t_Array) + arr->payload.Eltype->bp->size * index, ((char *)val) + sizeof(object), arr->payload.Eltype->bp->size); |
78
4d5ea487f810
Working String implementation and some basic (but nowhere near exhaustive) tests
Mike Pavone <pavone@retrodev.com>
parents:
53
diff
changeset
|
25 get_blueprint(val)->copy(val); |
103
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
26 release_ref(val); |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
27 } |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
28 |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
29 void _internal_array_copychunk(object * src, int32_t srcidx, object * dest, int32_t destidx, int32_t len) |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
30 { |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
31 int32_t idx; |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
32 object * cur; |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
33 t_Array *sarr,*darr; |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
34 sarr = (t_Array *)src; |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
35 darr = (t_Array *)dest; |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
36 memcpy((char *)(darr+1) + darr->payload.Eltype->bp->size * destidx, (char *)(sarr+1) + sarr->payload.Eltype->bp->size * srcidx, len*sarr->payload.Eltype->bp->size); |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
37 cur = (object *)((char *)(darr+1) + darr->payload.Eltype->bp->size * destidx - sizeof(object)); |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
38 for (idx = 0; idx < len; ++idx) |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
39 { |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
40 darr->payload.Eltype->bp->copy(cur); |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
41 cur++; |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
42 } |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
43 release_ref(src); |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
44 } |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
45 |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
46 object * _internal_array_getboxed(object * array, int32_t index) |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
47 { |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
48 object * ret; |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
49 object ** intarr = (object **)(((char *) array) + sizeof(t_BoxedSP_Array)); |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
50 ret = add_ref(intarr[index]); |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
51 release_ref(array); |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
52 return ret; |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
53 } |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
54 |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
55 void _internal_array_setboxed(object *array, int32_t index, object * val) |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
56 { |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
57 object ** intarr = (object **)(((char *) array) + sizeof(t_BoxedSP_Array)); |
119
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
58 if (index < ((t_BoxedSP_Array *)array)->payload.Length) |
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
59 { |
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
60 release_ref(intarr[index]); |
72c648bca43b
Improved memory debug output and fixed memory leak in Array
Mike Pavone <pavone@retrodev.com>
parents:
106
diff
changeset
|
61 } |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
62 intarr[index] = val; |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
63 } |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
64 |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
65 object *_internal_array_allocboxed(int32_t size) |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
66 { |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
67 t_BoxedSP_Array * ret = (t_BoxedSP_Array *)new_multisize(TYPE_BOXEDARRAY, sizeof(nt_BoxedSP_Array)+sizeof(object *)*size); |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
68 ret->payload.Length = 0; |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
69 ret->payload.Storage = size; |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
70 |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
71 return (object *)ret; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
72 } |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
73 |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
74 object *_internal_array_allocboxedcopy(object * osource, int32_t size) |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
75 { |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
76 int32_t tocopy,idx; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
77 object **srcarr, **destarr; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
78 t_BoxedSP_Array * source = (t_BoxedSP_Array *)osource; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
79 t_BoxedSP_Array * ret = (t_BoxedSP_Array *)new_multisize(TYPE_BOXEDARRAY, sizeof(nt_BoxedSP_Array)+sizeof(object *)*size); |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
80 ret->payload.Length = 0; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
81 ret->payload.Storage = size; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
82 tocopy = size < source->payload.Length ? size : source->payload.Length; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
83 srcarr = (object **)(source+1); |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
84 destarr = (object **)(ret+1); |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
85 for(idx = 0; idx < tocopy; ++idx) |
103
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
86 destarr[idx] = add_ref(srcarr[idx]); |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
87 release_ref(osource); |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
88 |
53
70af7fa155d0
Cleaned up some C warnings and added a simple compile script
Mike Pavone <pavone@retrodev.com>
parents:
49
diff
changeset
|
89 return (object *)ret; |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
90 } |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
91 |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
92 object * _internal_array_allocnaked(int32_t size , object * type) |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
93 { |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
94 t_Array * ret; |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
95 t_Blueprint * bp = (t_Blueprint *)type; |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
96 if (bp->bp->size < 0) { |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
97 release_ref(type); |
49
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
98 return _internal_array_allocboxed(size); |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
99 } |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
100 ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size); |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
101 ret->payload.Length = 0; |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
102 ret->payload.Storage = size; |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
103 ret->payload.Eltype = bp; |
3e20ed8959c4
Added initial FFI implementation, Array type and 64-bit integers
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
104 |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
105 return (object *)ret; |
78
4d5ea487f810
Working String implementation and some basic (but nowhere near exhaustive) tests
Mike Pavone <pavone@retrodev.com>
parents:
53
diff
changeset
|
106 } |
4d5ea487f810
Working String implementation and some basic (but nowhere near exhaustive) tests
Mike Pavone <pavone@retrodev.com>
parents:
53
diff
changeset
|
107 |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
108 object * _internal_array_allocnakedcopy(object * osource, int32_t size) |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
109 { |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
110 int32_t tocopy,idx; |
97 | 111 char *cur; |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
112 t_Array * ret, *source = (t_Array *)osource; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
113 t_Blueprint * bp = source->payload.Eltype; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
114 |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
115 ret = (t_Array *)new_multisize(TYPE_ARRAY, sizeof(nt_Array)+bp->bp->size*size); |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
116 ret->payload.Length = 0; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
117 ret->payload.Storage = size; |
103
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
118 ret->payload.Eltype = bp; |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
119 add_ref((object *)bp); |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
120 tocopy = size < source->payload.Length ? size : source->payload.Length; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
121 memcpy(ret+1, source+1, tocopy*bp->bp->size); |
103
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
122 |
96
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
123 if(bp->bp->type_id >= TYPE_ARRAY) |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
124 { |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
125 //Ugly hack |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
126 cur = ((char *)(ret+1))-sizeof(object) ; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
127 for(idx=0; idx < tocopy; ++idx) |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
128 { |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
129 bp->bp->copy((object *)cur); |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
130 cur += bp->bp->size; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
131 } |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
132 } |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
133 release_ref(osource); |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
134 |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
135 return (object *)ret; |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
136 } |
5a08705f7610
Semi-broken cleanup of Array implementation
Mike Pavone <pavone@retrodev.com>
parents:
78
diff
changeset
|
137 |
103
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
138 void internalarrayboxedcopy(object * obj) |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
139 { |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
140 int32_t idx; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
141 object **elarr; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
142 t_BoxedSP_Array * arr = (t_BoxedSP_Array *)obj; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
143 elarr = (object **)(arr+1); |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
144 for(idx = 0; idx < arr->payload.Length; ++idx) |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
145 { |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
146 add_ref(elarr[idx]); |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
147 } |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
148 } |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
149 |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
150 void internalarraynakedcopy(object * obj) |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
151 { |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
152 int32_t tocopy,idx; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
153 char *cur; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
154 t_Array *arr = (t_Array *)obj; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
155 t_Blueprint * bp = arr->payload.Eltype; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
156 //Lower type IDs don't have any reference params so we can safely skip this for those |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
157 if(bp->bp->type_id >= TYPE_ARRAY) |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
158 { |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
159 //Ugly hack |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
160 cur = ((char *)(arr+1))-sizeof(object) ; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
161 for(idx=0; idx < arr->payload.Length; ++idx) |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
162 { |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
163 bp->bp->copy((object *)cur); |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
164 cur += bp->bp->size; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
165 } |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
166 } |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
167 add_ref((object *)bp); |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
168 } |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
169 |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
170 void internalarrayboxedcleanup(object * obj) |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
171 { |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
172 int32_t idx; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
173 object **elarr; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
174 t_BoxedSP_Array * arr = (t_BoxedSP_Array *)obj; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
175 elarr = (object **)(arr+1); |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
176 for(idx = 0; idx < arr->payload.Length; ++idx) |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
177 { |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
178 release_ref(elarr[idx]); |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
179 } |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
180 } |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
181 |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
182 void internalarraynakedcleanup(object * obj) |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
183 { |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
184 int32_t tocopy,idx; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
185 char *cur; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
186 t_Array *arr = (t_Array *)obj; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
187 t_Blueprint * bp = arr->payload.Eltype; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
188 //Lower type IDs don't have any reference params so we can safely skip this for those |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
189 if(bp->bp->type_id >= TYPE_ARRAY) |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
190 { |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
191 //Ugly hack |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
192 cur = ((char *)(arr+1))-sizeof(object) ; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
193 for(idx=0; idx < arr->payload.Length; ++idx) |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
194 { |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
195 bp->bp->cleanup((object *)cur); |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
196 cur += bp->bp->size; |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
197 } |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
198 } |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
199 release_ref((object *)bp); |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
200 } |
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
201 |
104
2d2da148d844
Performance improvement for string comparisons
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
202 int32_t _internal_memcmp_offset(void * left, int32_t loff, void * right, int32_t roff, int32_t len) |
2d2da148d844
Performance improvement for string comparisons
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
203 { |
2d2da148d844
Performance improvement for string comparisons
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
204 return memcmp(((char *)left)+loff, ((char *)right)+roff, len); |
2d2da148d844
Performance improvement for string comparisons
Mike Pavone <pavone@retrodev.com>
parents:
103
diff
changeset
|
205 } |
103
7428aa5d6ade
Compiler compiled by compiler sort of working
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
206 |