[Python-Dev] [win32] Killing MSVC's _alloca

Gerhard Haering haering_python@gmx.de
Fri, 4 Oct 2002 22:23:48 +0200


* Guido van Rossum <guido@python.org> [2002-10-04 15:40 -0400]:
> > Trying to get around to my mingw32 port again. I currently don't
> > have Visual C++ installed, but why is this nonstandard _alloca
> > needed? Can't it simply be replaced by alloca? Doesn't MSVC have
> > alloca?
> 
> It seems that it does.  But I guess _alloca is more politically
> correct, since alloca is not standard C.

I don't see how this applies, as neither form is standard C, but in practise,
alloca is supported by all compilers I use, be it Windows or Linux. And I don't
care about P. C. ;-)

> > For the moment, I'm as far as building posixmodule.c, which I
> > succeeded by doing a
> > 
> > #define _alloca alloca
> > 
> > If there's a way to kill MSVC peculiarities, could this please be done?
> 
> I'd be happy to do a global subst of _alloca -> alloca.
> 
> Mark, do you see any reason why this might *not* work?
> 
> Could it break other compilers?

No, as it's only used in platform-specific code as seen below:

$ find . -name *.[ch]|xargs grep -w _alloca
./Modules/posixmodule.c:		s1 = (char *)_alloca(i);
./Modules/posixmodule.c:			s2 = (char *)_alloca(x);
./Modules/posixmodule.c:			s2 = (char *)_alloca(x);
./Python/pythonrun.c:		/* _alloca throws a stack overflow exception if there's
./Python/pythonrun.c:		_alloca(PYOS_STACK_MARGIN * sizeof(void*));

$ find . -name *.[ch]|xargs grep -w alloca
./Modules/mpzmodule.c:** 			alloca with arg < 0 (when casted to a signed
./PC/_winreg.c:#include "malloc.h" /* for alloca */
./PC/_winreg.c:	retBuf = (char *)alloca(len);
./PC/_winreg.c:	retValueBuf = (char *)alloca(retValueSize);
./PC/_winreg.c:	retDataBuf = (char *)alloca(retDataSize);
./PC/_winreg.c:	retBuf = (char *)alloca(bufSize);
./PC/_winreg.c:	retBuf = (char *)alloca(bufSize);
./PC/import_nt.c:#include "malloc.h" /* for alloca */
./PC/import_nt.c:	/* alloca == no free required, but memory only local to fn,
./PC/import_nt.c:	moduleKey = alloca(bufSize); 
./PC/os2vacpp/getpathp.c:#include "malloc.h" // for alloca - see comments below!
./PC/os2vacpp/getpathp.c:	// alloca == no free required, but memory only local to fn.
./PC/os2vacpp/getpathp.c:	keyBuf = alloca(sizeof(keyPrefix)-1 + versionLen + sizeof(keySuffix)); // chars only, plus 1 NULL.

So, alloca and _alloca are only used in platform specific Windows and OS/2
code. The MSVC specific code is a little inconsistent, it uses both _alloca and
alloca forms depending on the source file.

> A conservative approach would be to add #ifdef CYGWIN around the
> #define you propose.

Not even more #ifdefs, please. I'd suggest the global replace _alloca ->
alloca.

-- Gerhard