I have great compilation troubles with the last lesson from the master:-) The compiler doesn not know the realloc() and the malloc() function() in the current setting. When I change them into PFrealloc() and PFmalloc() it compiles. But then I still have problems with the "free(buf);" line. There is no PFfree(); and I think GDKfree() will not always work, JanF. On Tuesday 01 May 2007 17:58, Sjoerd Mullender wrote:
Update of /cvsroot/monetdb/pathfinder/compiler/mil In directory sc8-pr-cvs16:/tmp/cvs-serv17830
Modified Files: milprint_summer.c Log Message: When you want to use a library function, make sure the appropriate include file is included. For alloca there is an extra twist: for the way to include alloca.h see e.g. monet_utils.mx. Do not hide the lack of a declaration with a cast. The compiler then thinks the function returns an int which may well be smaller in space than the actual value, and hence some bytes of the value may get lost.
Having said this, alloca should *not* be used in a loop. It allocates memory in each iteration which is only freed at the end of the function. If the loop loops many times, that can be a lot of memory which is allocated on the stack (which is a very finite resource!).
Here ends today's lesson.
Index: milprint_summer.c =================================================================== RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milprint_summer.c,v retrieving revision 1.367 retrieving revision 1.368 diff -u -d -r1.367 -r1.368 --- milprint_summer.c 27 Apr 2007 18:22:40 -0000 1.367 +++ milprint_summer.c 1 May 2007 15:57:59 -0000 1.368 @@ -11140,12 +11140,18 @@ /* ============================= */ /* initialize function variables */ /* ============================= */ + size_t maxbufsize = 0; + char *buf = NULL; while (args->kind != c_nil) { /* get the type name, and assure there *is* a namespace */ char *tpe = PFty_str(TY(LR(args))); - char *buf = (char*) alloca(4+strlen(tpe)); - char *nme = buf; + char *nme; + if (maxbufsize < strlen(tpe) + 4) { + maxbufsize = strlen(tpe) + 4; + buf = buf ? realloc(buf, maxbufsize) : malloc(maxbufsize); + } + nme = buf; if (strchr(tpe, ':') == NULL) { *buf++ = 'x'; *buf++ = 's'; @@ -11171,6 +11177,8 @@
args = R(args); } + if (buf) + free(buf); /* create the full signature that also is a valid MIL identifier */ c->sem.fun->sig = PFmalloc(12+3*(strlen(sig)+strlen(p)));
------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Monetdb-pf-checkins mailing list Monetdb-pf-checkins@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins