[Python-Dev] Assign to errno allowed?
Brad Clements
bkc@murkworks.com
Tue, 24 Sep 2002 15:31:23 -0400
On 24 Sep 2002 at 14:51, Guido van Rossum wrote:
> I'm strongly against 2. 5 years from now, CE and NetWare and their
> limitations will only be a vague memory, but this convention will
> still cripple the Python source code.
No arguments about CE, anyway ..
(noting that NetWare has reached it's ten year anniversary ;-)
I guess then the best solution is a distinct CVS for "the port to oddball platforms"
or, the other option is lots of #ifdefs in the code.
The original reason I proposed the macro idea was to eliminate multiple nested
#ifdefs..
For example, I had trouble figuring out nested #ifdefs in posixmodule, as generated by
Mark in his CE port.. It's awful.
By switching to macros for "errno =" I was able to clean up a lot of the #ifdefs
If changes for CE (and other errno-less OS's) are to be kept in the core, then we'll
either have (from Modules/cpickle.c)
#ifndef WINDOWCE
errno = 0;
#else
SetLastError(0);
#endif
l = strtol(s, &endptr, 0);
#ifndef WINDOWSCE
if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
#else
if (GetLastError() || (*endptr != '\n') || (endptr[1] != '\0')) {
#endif
/* Hm, maybe we've got something long. Let's try reading
it as a Python long object. */
#ifndef WINDOWSCE
errno = 0;
#else
SetLastError(0);
#endif
--- Or ---
Py_SetErrno(0)
l = strtol(s, &endptr, 0);
if (Py_GetErrno() || (*endptr != '\n') || (endptr[1] != '\0')) {
/* Hm, maybe we've got something long. Let's try reading
it as a Python long object. */
Py_SetErrno(0);
Keeping in mind that adding NetWare or (other embedded OS or BIOS that wants to
play) then the #ifdef version gets much worse. The macro version doesn't change.
There are approximately 140 references to errno in the Modules directory alone. For
the Alpha port of Python 2.2 to CE I changed every one of them (at least for any
module that could run on CE, which is just about everything that runs on Win32)
I've already said that I've made these changes and am willing to make them all again.
Once they're in there, how difficult will it be to keep them?
New code that uses errno will fail on subsequent builds on these errno-less platforms,
but there will only be a handful of changes needed, rather than hundreds on every
release of the core.
So .. developers who just write "errno = " in the future won't be penalized, rather the
porters to errno-less platforms will just have to convert the expression to macro mode.
And that conversion process isn't a hardship if it only has to be done once for any given
line of code on any given core release.. But if we (porters) have to change 140
references every single time there's a release.. I could see enthusiasm fading away
faster than those errno-less platforms ;-)
Clearly you guys know what's best better than I do. My line of reasoning for errno
macros was:
1. on most platforms the macros compile away to what you'd write in C anyway
2. I'd generate and submit all the initial patches to the core to switch errno references
to macros, leaving the burden of review and checkin to the core team (sorry) but not
the burden of finding and changing all errno references
3. But once the patches are in-place, future releases wouldn't require nearly as much
effort for re-port's to errno-less platforms because only a few lines would need to be
"fixed up" to use macros, and only if the changed code didn't use the macros in the first
place.
4. Not using the macros in core or extension source isn't an issue for any platform,
except errno-less OS's.. at which time that code gets macro'ized at the time of the port.
5. What this does is reduces effort for future ports to crippled systems, at the expense
of many initial changes, whose subsequent maintenence shouldn't (hopefully) be a
burden, since ports to crippled systems would maintain the changes.
Though I do agree, a future mismash of macro's and direct errno references in the core
will be ugly and confusing if that occurs.
(sorry this is so long, just want to clearly state my case if I have not already done so)
Brad Clements, bkc@murkworks.com (315)268-1000
http://www.murkworks.com (315)268-9812 Fax
AOL-IM: BKClements