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