summaryrefslogtreecommitdiff
path: root/functions.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 /functions.c
parentb1b55e907a5aaf177344769d2b303351ba936bff (diff)
Implement basic reference counting for arrays, which so they
get freed when not in use anymore.
Diffstat (limited to 'functions.c')
-rw-r--r--functions.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/functions.c b/functions.c
index 4d9a69f..bbac1a9 100644
--- a/functions.c
+++ b/functions.c
@@ -121,6 +121,7 @@ fndyad dyadfunctiondefs[] = {
Array *
fnSame(Array *right)
{
+ incref(right);
return right;
}
@@ -133,10 +134,11 @@ fnTally(Array *right)
Array *
fnEnclose(Array *right)
{
+ incref(right);
if(simplescalar(right))
return right;
else{
- Array *res = mkarray(AtypeArray, 0, 1);
+ Array *res = allocarray(AtypeArray, 0, 1);
res->arraydata[0] = right;
return res;
}
@@ -147,7 +149,7 @@ fnIndexGenerator(Array *right)
{
/* TODO only works for creating vectors */
vlong n = right->intdata[0];
- Array *res = mkarray(AtypeInt, 1, n);
+ Array *res = allocarray(AtypeInt, 1, n);
res->shape[0] = n;
vlong io = globalIO();
for(vlong i = 0; i < n; i++)
@@ -161,7 +163,7 @@ fnNest(Array *right)
if(simplearray(right))
return fnEnclose(right);
else
- return right;
+ return fnSame(right);
}
Array *
@@ -177,7 +179,7 @@ fnRavel(Array *right)
Array *
fnShape(Array *right)
{
- Array *res = mkarray(AtypeInt, 1, right->rank);
+ Array *res = allocarray(AtypeInt, 1, right->rank);
res->shape[0] = right->rank;
for(int i = 0; i < right->rank; i++)
res->intdata[i] = right->shape[i];
@@ -190,6 +192,7 @@ Array *
fnLeft(Array *left, Array *right)
{
USED(right);
+ incref(left);
return left;
}
@@ -197,6 +200,7 @@ Array *
fnRight(Array *left, Array *right)
{
USED(left);
+ incref(right);
return right;
}
@@ -204,16 +208,19 @@ Array *
fnCatenateFirst(Array *left, Array *right)
{
/* not even close to being right, but it works for stranding :) */
- if(left->rank == 0)
- left = fnRavel(left);
- if(right->rank == 0)
- right = fnRavel(right);
+ left = left->rank == 0 ? fnRavel(left) : fnSame(left);
+ right = right->rank == 0 ? fnRavel(right) : fnSame(right);
/* assume two vectors of same type for now */
- Array *res = mkarray(left->type, 1, left->size+right->size);
+ Array *res = allocarray(left->type, 1, left->size+right->size);
res->shape[0] = left->shape[0] + right->shape[0];
memcpy(res->rawdata, left->rawdata, datasizes[res->type]*left->size);
memcpy(res->rawdata+datasizes[res->type]*left->size, right->rawdata, datasizes[res->type]*right->size);
+ if(res->type == AtypeArray)
+ for(int i = 0; i < res->size; i++)
+ incref(res->arraydata[i]);
+ freearray(left);
+ freearray(right);
return res;
}
@@ -228,10 +235,13 @@ fnReshape(Array *left, Array *right)
if(left->size == 0)
size = 0;
- Array *res = mkarray(right->type, left->size, size);
+ Array *res = allocarray(right->type, left->size, size);
for(i = 0; i < left->size; i++)
res->shape[i] = left->intdata[i];
for(i = 0, p = res->rawdata; i < size; i++, p += datasizes[res->type])
memcpy(p, right->rawdata + (datasizes[res->type] * (i % right->size)), datasizes[res->type]);
+ if(res->type == AtypeArray)
+ for(i = 0; i < res->size; i++)
+ incref(res->arraydata[i]);
return res;
} \ No newline at end of file