summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-13 19:45:22 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-13 19:45:22 +0000
commit50d6dd8b50958271bf1ff13f99dc21d4cd8431f7 (patch)
tree504f2a16f29fefedc7ff0a326475f122d018590a /array.c
parentb1b55e907a5aaf177344769d2b303351ba936bff (diff)
Implement basic reference counting for arrays, which so they
get freed when not in use anymore.
Diffstat (limited to 'array.c')
-rw-r--r--array.c22
1 files changed, 5 insertions, 17 deletions
diff --git a/array.c b/array.c
index 9feb132..4913112 100644
--- a/array.c
+++ b/array.c
@@ -10,23 +10,9 @@ int datasizes[] = {
};
Array *
-mkarray(arrayDataType t, int rank, int size)
-{
- Array *a = malloc(sizeof(Array));
- a->rank = rank;
- a->type = t;
- a->size = size;
- a->stranded = 0;
- a->shape = malloc(sizeof(int) * rank);
- a->rawdata = malloc(datasizes[t] * size);
- a->type = t;
- return a;
-}
-
-Array *
mkscalarint(vlong i)
{
- Array *a = mkarray(AtypeInt, 0, 1);
+ Array *a = allocarray(AtypeInt, 0, 1);
a->intdata[0] = i;
return a;
@@ -35,10 +21,12 @@ mkscalarint(vlong i)
Array *
duparray(Array *a)
{
- Array *b = mkarray(a->type, a->rank, a->size);
+ Array *b = allocarray(a->type, a->rank, a->size);
memcpy(b->shape, a->shape, sizeof(int) * a->rank);
memcpy(b->rawdata, a->rawdata, datasizes[a->type]*a->size);
- /* TODO duplicate recursivley */
+ if(b->type == AtypeArray)
+ for(int i = 0; i < b->size; i++)
+ incref(b->arraydata[i]);
return b;
}