[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. |