diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-13 19:45:22 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-13 19:45:22 +0000 |
commit | 50d6dd8b50958271bf1ff13f99dc21d4cd8431f7 (patch) | |
tree | 504f2a16f29fefedc7ff0a326475f122d018590a /functions.c | |
parent | b1b55e907a5aaf177344769d2b303351ba936bff (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.c | 30 |
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 |