MonetDB: Dec2016 - Fix memory leaks.

2017-04-20 Thread Sjoerd Mullender
Changeset: 6ad9bee88bec for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6ad9bee88bec
Modified Files:
sql/backends/monet5/UDF/pyapi/pyapi.c
Branch: Dec2016
Log Message:

Fix memory leaks.


diffs (49 lines):

diff --git a/sql/backends/monet5/UDF/pyapi/pyapi.c 
b/sql/backends/monet5/UDF/pyapi/pyapi.c
--- a/sql/backends/monet5/UDF/pyapi/pyapi.c
+++ b/sql/backends/monet5/UDF/pyapi/pyapi.c
@@ -1321,13 +1321,16 @@ str
 MT_lock_set();
 if (!pyapiInitialized) {
 str msg = MAL_SUCCEED;
+PyObject *tmp;
 Py_Initialize();
 if (PyRun_SimpleString("import numpy") != 0 || _import_array() < 
0) {
 return PyError_CreateException("Failed to initialize embedded 
python", NULL);
 }
 msg = _connection_init();
 _loader_init();
-marshal_module = PyImport_Import(PyString_FromString("marshal"));
+tmp = PyString_FromString("marshal");
+marshal_module = PyImport_Import(tmp);
+Py_DECREF(tmp);
 if (marshal_module == NULL) {
 return createException(MAL, "pyapi.eval", "Failed to load 
Marshal module.");
 }
@@ -1359,9 +1362,12 @@ str
 #else
 if (!pyapiInitialized) {
 char* iar = NULL;
+PyObject *tmp;
 import_array1(iar);
 pyapiInitialized++;
-marshal_module = PyImport_Import(PyString_FromString("marshal"));
+tmp = PyString_FromString("marshal");
+marshal_module = PyImport_Import(tmp);
+Py_DECREF(tmp);
 if (marshal_module == NULL) {
 return createException(MAL, "pyapi.eval", "Failed to load Marshal 
module.");
 }
@@ -1549,10 +1555,12 @@ PyObject *PyMaskedArray_FromBAT(PyInput 
 if (!(b->tnil == 0 && b->tnonil == 1))
 {
 PyObject *mask;
-PyObject *mafunc = 
PyObject_GetAttrString(PyImport_Import(PyString_FromString("numpy.ma")), 
"masked_array");
+PyObject *tmp = PyString_FromString("numpy.ma");
+PyObject *mafunc = PyObject_GetAttrString(PyImport_Import(tmp), 
"masked_array");
 PyObject *maargs;
 PyObject *nullmask = PyNullMask_FromBAT(b, t_start, t_end);
 
+Py_DECREF(tmp);
 if (nullmask == Py_None) {
 maargs = PyTuple_New(1);
 PyTuple_SetItem(maargs, 0, vararray);
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Dec2016 - Fix memory leaks.

2016-11-02 Thread Sjoerd Mullender
Changeset: a66d641b35f2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a66d641b35f2
Modified Files:
clients/Tests/exports.stable.out
monetdb5/mal/mal_instruction.c
monetdb5/mal/mal_instruction.h
monetdb5/mal/mal_type.c
monetdb5/mal/mal_type.h
sql/backends/monet5/sql_gencode.c
Branch: Dec2016
Log Message:

Fix memory leaks.
pushArgumentId no longer sometimes gobbles up the reference to name argument.


diffs (161 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -2067,7 +2067,7 @@ str generatorRef;
 MALfcn getAddress(stream *out, str filename, str fcnname, int silent);
 str getArgDefault(MalBlkPtr mb, InstrPtr p, int idx);
 ptr getArgReference(MalStkPtr stk, InstrPtr pci, int k);
-int getAtomIndex(str nme, int len, int deftpe);
+int getAtomIndex(const char *nme, int len, int deftpe);
 lng getBatSpace(BAT *b);
 int getBitConstant(MalBlkPtr mb, bit val);
 int getBlockBegin(MalBlkPtr mb, int pc);
@@ -2345,7 +2345,7 @@ str projectionRef;
 str projectionpathRef;
 void promptInstruction(stream *fd, MalBlkPtr mb, MalStkPtr stk, InstrPtr p, 
int flg);
 InstrPtr pushArgument(MalBlkPtr mb, InstrPtr p, int varid);
-InstrPtr pushArgumentId(MalBlkPtr mb, InstrPtr p, str name);
+InstrPtr pushArgumentId(MalBlkPtr mb, InstrPtr p, const char *name);
 InstrPtr pushBit(MalBlkPtr mb, InstrPtr q, bit val);
 InstrPtr pushBte(MalBlkPtr mb, InstrPtr q, bte val);
 InstrPtr pushDbl(MalBlkPtr mb, InstrPtr q, dbl val);
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -1372,22 +1372,19 @@ pushReturn(MalBlkPtr mb, InstrPtr p, int
  * TODO */
 /* swallows name argument */
 InstrPtr
-pushArgumentId(MalBlkPtr mb, InstrPtr p, str name)
+pushArgumentId(MalBlkPtr mb, InstrPtr p, const char *name)
 {
int v;
 
-   if (p == NULL) {
-   GDKfree(name);
+   if (p == NULL)
return NULL;
-   }
v = findVariable(mb, name);
if (v < 0) {
if ((v = newVariable(mb, name, strlen(name), getAtomIndex(name, 
-1, TYPE_any))) < 0) {
freeInstruction(p);
return NULL;
}
-   } else
-   GDKfree(name);
+   }
return pushArgument(mb, p, v);
 }
 
diff --git a/monetdb5/mal/mal_instruction.h b/monetdb5/mal/mal_instruction.h
--- a/monetdb5/mal/mal_instruction.h
+++ b/monetdb5/mal/mal_instruction.h
@@ -164,7 +164,7 @@ mal_export void pushInstruction(MalBlkPt
 mal_export InstrPtr pushArgument(MalBlkPtr mb, InstrPtr p, int varid);
 mal_export InstrPtr setArgument(MalBlkPtr mb, InstrPtr p, int idx, int varid);
 mal_export InstrPtr pushReturn(MalBlkPtr mb, InstrPtr p, int varid);
-mal_export InstrPtr pushArgumentId(MalBlkPtr mb, InstrPtr p, str name);
+mal_export InstrPtr pushArgumentId(MalBlkPtr mb, InstrPtr p, const char *name);
 mal_export void delArgument(InstrPtr p, int varid);
 mal_export void setVarType(MalBlkPtr mb, int i, int tpe);
 mal_export void clrAllTypes(MalBlkPtr mb);
diff --git a/monetdb5/mal/mal_type.c b/monetdb5/mal/mal_type.c
--- a/monetdb5/mal/mal_type.c
+++ b/monetdb5/mal/mal_type.c
@@ -101,11 +101,16 @@ getTypeIdentifier(malType tpe){
 #define qt(x) (nme[1]==x[1] && nme[2]==x[2] )
 
 int
-getAtomIndex(str nme, int len, int deftype)
+getAtomIndex(const char *nme, int len, int deftype)
 {
-   int i,k=0;
-   char old=0;
+   int i;
 
+   if (len < 0)
+   len = (int) strlen(nme);
+   if (len >= IDLENGTH) {
+   /* name too long: cannot match any atom name */
+   return deftype;
+   }
if (len == 3)
switch (*nme) {
case 'a':
@@ -157,20 +162,14 @@ getAtomIndex(str nme, int len, int defty
return TYPE_sht;
break;
}
-   if( nme[0]=='v' && qt("voi") && nme[3] == 'd')
-   return TYPE_void;
-   if( len > 0 ){
-   old=  nme[k = MIN(IDLENGTH, len)];
-   nme[k] = 0;
-   }
-   for(i= TYPE_str; i< GDKatomcnt; i++)
-   if( BATatoms[i].name[0]==nme[0] &&
-   strcmp(nme,BATatoms[i].name)==0) break;
-   if( len > 0)
-   nme[k]=old;
-   if (i == GDKatomcnt)
-   i = deftype;
-   return i;
+   else if (len == 4 && nme[0]=='v' && qt("voi") && nme[3] == 'd')
+   return TYPE_void;
+   for (i = TYPE_str; i < GDKatomcnt; i++)
+   if (BATatoms[i].name[0] == nme[0] &&
+   strncmp(nme, BATatoms[i].name, len) == 0 &&
+   BATatoms[i].name[len] == 0)
+   return i;
+   return deftype;
 }
 
 inline int
diff --git a/monetdb5/mal/mal_type.h