From ac35a859e04861bf5dc90073f5d4f17627c8be8e Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sun, 4 Sep 2022 20:23:50 +1000 Subject: [PATCH] Fixed a leak --- scripts/small.toy | 53 +++++++++++++++++++++++++++++++++++++++++--- source/interpreter.c | 1 + 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/scripts/small.toy b/scripts/small.toy index 6c156e2..aab6c90 100644 --- a/scripts/small.toy +++ b/scripts/small.toy @@ -1,5 +1,52 @@ -for (var i = 0; i < 40; i++) { - print i; - print (string)i + " printed"; + + +//assume the args are matrices +fn matrix(first, second) { + //get the matrix size + var l1 = _length(first); //rows + var l2 = _length(_get(first, 0)); //cols + + var l3 = _length(second); //rows + var l4 = _length(_get(second, 0)); //cols + + //pre-allocate the matrix + var row = []; + for (var j = 0; j < l4; j++) { + _push(row, 0); + } + + var result = []; + for (var i = 0; i < l1; i++) { + _push(result, row); + } + + //assign the values + for (var i = 0; i < _length(first); i++) { + //select each element of "first" + var firstElement = _get(first, i); + + //for each element of second + for (var i2 = 0; i2 < _length(second); i2++) { + for (var j2 = 0; j2 < _length(_get(second, 0)); j2++) { + + var val = _get(_get(first, i), i2) * _get(_get(second, i2), j2); + + //TODO: needs better notation than this tmpRow variable + var tmpRow = _get(result, i); + _set(tmpRow, j2, val); + _set(result, i, tmpRow); + + //result[ i ][ j2 ] += first[i][i2] * second[i2][j2] + } + } + } + + return result; } + +//matrix multiply +var c = [[4], [5], [6]]; //this is a 3x1 +var d = [[1, 2, 3]]; //this is a 1x3 + +print matrix(c, d); diff --git a/source/interpreter.c b/source/interpreter.c index 392485d..a4f4927 100644 --- a/source/interpreter.c +++ b/source/interpreter.c @@ -119,6 +119,7 @@ int _set(Interpreter* interpreter, LiteralArray* arguments) { } //don't use pushLiteralArray, since we're setting + freeLiteral(AS_ARRAY(obj)->literals[AS_INTEGER(key)]); //BUGFIX: clear any existing data first AS_ARRAY(obj)->literals[AS_INTEGER(key)] = copyLiteral(val); if (!setScopeVariable(interpreter->scope, idn, obj, true)) {