[pure-lang-svn] SF.net SVN: pure-lang:[813] pure/trunk/runtime.cc
Status: Beta
Brought to you by:
agraef
|
From: <ag...@us...> - 2008-09-20 20:53:12
|
Revision: 813
http://pure-lang.svn.sourceforge.net/pure-lang/?rev=813&view=rev
Author: agraef
Date: 2008-09-20 20:53:03 +0000 (Sat, 20 Sep 2008)
Log Message:
-----------
Bugfixes.
Modified Paths:
--------------
pure/trunk/runtime.cc
Modified: pure/trunk/runtime.cc
===================================================================
--- pure/trunk/runtime.cc 2008-09-20 20:33:16 UTC (rev 812)
+++ pure/trunk/runtime.cc 2008-09-20 20:53:03 UTC (rev 813)
@@ -375,6 +375,12 @@
switch (x->tag) {
case EXPR::MATRIX: {
gsl_matrix_symbolic *m = (gsl_matrix_symbolic*)x->data.mat.p;
+ if (owner) {
+ const size_t k = m->size1, l = m->size2, tda = m->tda;;
+ for (size_t i = 0; i < k; i++)
+ for (size_t j = 0; j < l; j++)
+ pure_free(m->data[i*tda+j]);
+ }
m->owner = owner;
gsl_matrix_symbolic_free(m);
break;
@@ -756,6 +762,11 @@
pure_expr *x = new_expr();
x->tag = EXPR::MATRIX;
x->data.mat.p = p;
+ // count references
+ const size_t k = m->size1, l = m->size2, tda = m->tda;;
+ for (size_t i = 0; i < k; i++)
+ for (size_t j = 0; j < l; j++)
+ pure_new_internal(m->data[i*tda+j]);
x->data.mat.refc = new uint32_t;
*x->data.mat.refc = 1;
MEMDEBUG_NEW(x)
@@ -1348,13 +1359,14 @@
break;
}
default:
- data[i++*tda] = pure_new_internal(x);
+ data[i++*tda] = x;
break;
}
}
+ pure_expr *ret = pure_symbolic_matrix(mat);
for (size_t i = 0; i < n; i++)
pure_free_internal(xs[i]);
- return pure_symbolic_matrix(mat);
+ return ret;
}
static pure_expr*
@@ -1411,13 +1423,14 @@
break;
}
default:
- data[i++] = pure_new_internal(x);
+ data[i++] = x;
break;
}
}
+ pure_expr *ret = pure_symbolic_matrix(mat);
for (size_t i = 0; i < n; i++)
pure_free_internal(xs[i]);
- return pure_symbolic_matrix(mat);
+ return ret;
}
static inline void set_target_type(int32_t& target, int32_t t)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|