mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03:00
merge in bad ways, so I'll have to merge that extra-carefully (probably manually.)
Merged revisions 46495-46605 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r46495 | tim.peters | 2006-05-28 03:52:38 +0200 (Sun, 28 May 2006) | 2 lines
Added missing svn:eol-style property to text files.
........
r46497 | tim.peters | 2006-05-28 12:41:29 +0200 (Sun, 28 May 2006) | 3 lines
PyErr_Display(), PyErr_WriteUnraisable(): Coverity found a cut-and-paste
bug in both: `className` was referenced before being checked for NULL.
........
r46499 | fredrik.lundh | 2006-05-28 14:06:46 +0200 (Sun, 28 May 2006) | 5 lines
needforspeed: added Py_MEMCPY macro (currently tuned for Visual C only),
and use it for string copy operations. this gives a 20% speedup on some
string benchmarks.
........
r46501 | michael.hudson | 2006-05-28 17:51:40 +0200 (Sun, 28 May 2006) | 26 lines
Quality control, meet exceptions.c.
Fix a number of problems with the need for speed code:
One is doing this sort of thing:
Py_DECREF(self->field);
self->field = newval;
Py_INCREF(self->field);
without being very sure that self->field doesn't start with a
value that has a __del__, because that almost certainly can lead
to segfaults.
As self->args is constrained to be an exact tuple we may as well
exploit this fact consistently. This leads to quite a lot of
simplification (and, hey, probably better performance).
Add some error checking in places lacking it.
Fix some rather strange indentation in the Unicode code.
Delete some trailing whitespace.
More to come, I haven't fixed all the reference leaks yet...
........
r46502 | george.yoshida | 2006-05-28 18:39:09 +0200 (Sun, 28 May 2006) | 3 lines
Patch #1080727: add "encoding" parameter to doctest.DocFileSuite
Contributed by Bjorn Tillenius.
........
r46503 | martin.v.loewis | 2006-05-28 18:57:38 +0200 (Sun, 28 May 2006) | 4 lines
Rest of patch #1490384: Commit icon source, remove
claim that Erik von Blokland is the author of the
installer picture.
........
r46504 | michael.hudson | 2006-05-28 19:40:29 +0200 (Sun, 28 May 2006) | 16 lines
Quality control, meet exceptions.c, round two.
Make some functions that should have been static static.
Fix a bunch of refleaks by fixing the definition of
MiddlingExtendsException.
Remove all the __new__ implementations apart from
BaseException_new. Rewrite most code that needs it to cope with
NULL fields (such code could get excercised anyway, the
__new__-removal just makes it more likely). This involved
editing the code for WindowsError, which I can't test.
This fixes all the refleaks in at least the start of a regrtest
-R :: run.
........
r46505 | marc-andre.lemburg | 2006-05-28 19:46:58 +0200 (Sun, 28 May 2006) | 10 lines
Initial version of systimes - a module to provide platform dependent
performance measurements.
The module is currently just a proof-of-concept implementation, but
will integrated into pybench once it is stable enough.
License: pybench license.
Author: Marc-Andre Lemburg.
........
r46507 | armin.rigo | 2006-05-28 21:13:17 +0200 (Sun, 28 May 2006) | 15 lines
("Forward-port" of r46506)
Remove various dependencies on dictionary order in the standard library
tests, and one (clearly an oversight, potentially critical) in the
standard library itself - base64.py.
Remaining open issues:
* test_extcall is an output test, messy to make robust
* tarfile.py has a potential bug here, but I'm not familiar
enough with this code. Filed in as SF bug #1496501.
* urllib2.HTTPPasswordMgr() returns a random result if there is more
than one matching root path. I'm asking python-dev for
clarification...
........
r46508 | georg.brandl | 2006-05-28 22:11:45 +0200 (Sun, 28 May 2006) | 4 lines
The empty string is a valid import path.
(fixes #1496539)
........
r46509 | georg.brandl | 2006-05-28 22:23:12 +0200 (Sun, 28 May 2006) | 3 lines
Patch #1496206: urllib2 PasswordMgr ./. default ports
........
r46510 | georg.brandl | 2006-05-28 22:57:09 +0200 (Sun, 28 May 2006) | 3 lines
Fix refleaks in UnicodeError get and set methods.
........
r46511 | michael.hudson | 2006-05-28 23:19:03 +0200 (Sun, 28 May 2006) | 3 lines
use the UnicodeError traversal and clearing functions in UnicodeError
subclasses.
........
r46512 | thomas.wouters | 2006-05-28 23:32:12 +0200 (Sun, 28 May 2006) | 4 lines
Make last patch valid C89 so Windows compilers can deal with it.
........
r46513 | georg.brandl | 2006-05-28 23:42:54 +0200 (Sun, 28 May 2006) | 3 lines
Fix ref-antileak in _struct.c which eventually lead to deallocating None.
........
r46514 | georg.brandl | 2006-05-28 23:57:35 +0200 (Sun, 28 May 2006) | 4 lines
Correct None refcount issue in Mac modules. (Are they
still used?)
........
r46515 | armin.rigo | 2006-05-29 00:07:08 +0200 (Mon, 29 May 2006) | 3 lines
A clearer error message when passing -R to regrtest.py with
release builds of Python.
........
r46516 | georg.brandl | 2006-05-29 00:14:04 +0200 (Mon, 29 May 2006) | 3 lines
Fix C function calling conventions in _sre module.
........
r46517 | georg.brandl | 2006-05-29 00:34:51 +0200 (Mon, 29 May 2006) | 3 lines
Convert audioop over to METH_VARARGS.
........
r46518 | georg.brandl | 2006-05-29 00:38:57 +0200 (Mon, 29 May 2006) | 3 lines
METH_NOARGS functions do get called with two args.
........
r46519 | georg.brandl | 2006-05-29 11:46:51 +0200 (Mon, 29 May 2006) | 4 lines
Fix refleak in socketmodule. Replace bogus Py_BuildValue calls.
Fix refleak in exceptions.
........
r46520 | nick.coghlan | 2006-05-29 14:43:05 +0200 (Mon, 29 May 2006) | 7 lines
Apply modified version of Collin Winter's patch #1478788
Renames functional extension module to _functools and adds a Python
functools module so that utility functions like update_wrapper can be
added easily.
........
r46522 | georg.brandl | 2006-05-29 15:53:16 +0200 (Mon, 29 May 2006) | 3 lines
Convert fmmodule to METH_VARARGS.
........
r46523 | georg.brandl | 2006-05-29 16:13:21 +0200 (Mon, 29 May 2006) | 3 lines
Fix #1494605.
........
r46524 | georg.brandl | 2006-05-29 16:28:05 +0200 (Mon, 29 May 2006) | 3 lines
Handle PyMem_Malloc failure in pystrtod.c. Closes #1494671.
........
r46525 | georg.brandl | 2006-05-29 16:33:55 +0200 (Mon, 29 May 2006) | 3 lines
Fix compiler warning.
........
r46526 | georg.brandl | 2006-05-29 16:39:00 +0200 (Mon, 29 May 2006) | 3 lines
Fix #1494787 (pyclbr counts whitespace as superclass name)
........
r46527 | bob.ippolito | 2006-05-29 17:47:29 +0200 (Mon, 29 May 2006) | 1 line
simplify the struct code a bit (no functional changes)
........
r46528 | armin.rigo | 2006-05-29 19:59:47 +0200 (Mon, 29 May 2006) | 2 lines
Silence a warning.
........
r46529 | georg.brandl | 2006-05-29 21:39:45 +0200 (Mon, 29 May 2006) | 3 lines
Correct some value converting strangenesses.
........
r46530 | nick.coghlan | 2006-05-29 22:27:44 +0200 (Mon, 29 May 2006) | 1 line
When adding a module like functools, it helps to let SVN know about the file.
........
r46531 | georg.brandl | 2006-05-29 22:52:54 +0200 (Mon, 29 May 2006) | 4 lines
Patches #1497027 and #972322: try HTTP digest auth first,
and watch out for handler name collisions.
........
r46532 | georg.brandl | 2006-05-29 22:57:01 +0200 (Mon, 29 May 2006) | 3 lines
Add News entry for last commit.
........
r46533 | georg.brandl | 2006-05-29 23:04:52 +0200 (Mon, 29 May 2006) | 4 lines
Make use of METH_O and METH_NOARGS where possible.
Use Py_UnpackTuple instead of PyArg_ParseTuple where possible.
........
r46534 | georg.brandl | 2006-05-29 23:58:42 +0200 (Mon, 29 May 2006) | 3 lines
Convert more modules to METH_VARARGS.
........
r46535 | georg.brandl | 2006-05-30 00:00:30 +0200 (Tue, 30 May 2006) | 3 lines
Whoops.
........
r46536 | fredrik.lundh | 2006-05-30 00:42:07 +0200 (Tue, 30 May 2006) | 4 lines
fixed "abc".count("", 100) == -96 error (hopefully, nobody's relying on
the current behaviour ;-)
........
r46537 | bob.ippolito | 2006-05-30 00:55:48 +0200 (Tue, 30 May 2006) | 1 line
struct: modulo math plus warning on all endian-explicit formats for compatibility with older struct usage (ugly)
........
r46539 | bob.ippolito | 2006-05-30 02:26:01 +0200 (Tue, 30 May 2006) | 1 line
Add a length check to aifc to ensure it doesn't write a bogus file
........
r46540 | tim.peters | 2006-05-30 04:25:25 +0200 (Tue, 30 May 2006) | 10 lines
deprecated_err(): Stop bizarre warning messages when the tests
are run in the order:
test_genexps (or any other doctest-based test)
test_struct
test_doctest
The `warnings` module needs an advertised way to save/restore
its internal filter list.
........
r46541 | tim.peters | 2006-05-30 04:26:46 +0200 (Tue, 30 May 2006) | 2 lines
Whitespace normalization.
........
r46542 | tim.peters | 2006-05-30 04:30:30 +0200 (Tue, 30 May 2006) | 2 lines
Set a binary svn:mime-type property on this UTF-8 encoded file.
........
r46543 | neal.norwitz | 2006-05-30 05:18:50 +0200 (Tue, 30 May 2006) | 1 line
Simplify further by using AddStringConstant
........
r46544 | tim.peters | 2006-05-30 06:16:25 +0200 (Tue, 30 May 2006) | 6 lines
Convert relevant dict internals to Py_ssize_t.
I don't have a box with nearly enough RAM, or an OS,
that could get close to tickling this, though (requires
a dict w/ at least 2**31 entries).
........
r46545 | neal.norwitz | 2006-05-30 06:19:21 +0200 (Tue, 30 May 2006) | 1 line
Remove stray | in comment
........
r46546 | neal.norwitz | 2006-05-30 06:25:05 +0200 (Tue, 30 May 2006) | 1 line
Use Py_SAFE_DOWNCAST for safety. Fix format strings. Remove 2 more stray | in comment
........
r46547 | neal.norwitz | 2006-05-30 06:43:23 +0200 (Tue, 30 May 2006) | 1 line
No DOWNCAST is required since sizeof(Py_ssize_t) >= sizeof(int) and Py_ReprEntr returns an int
........
r46548 | tim.peters | 2006-05-30 07:04:59 +0200 (Tue, 30 May 2006) | 3 lines
dict_print(): Explicitly narrow the return value
from a (possibly) wider variable.
........
r46549 | tim.peters | 2006-05-30 07:23:59 +0200 (Tue, 30 May 2006) | 5 lines
dict_print(): So that Neal & I don't spend the rest of
our lives taking turns rewriting code that works ;-),
get rid of casting illusions by declaring a new variable
with the obvious type.
........
r46550 | georg.brandl | 2006-05-30 09:04:55 +0200 (Tue, 30 May 2006) | 3 lines
Restore exception pickle support. #1497319.
........
r46551 | georg.brandl | 2006-05-30 09:13:29 +0200 (Tue, 30 May 2006) | 3 lines
Add a test case for exception pickling. args is never NULL.
........
r46552 | neal.norwitz | 2006-05-30 09:21:10 +0200 (Tue, 30 May 2006) | 1 line
Don't fail if the (sub)pkgname already exist.
........
r46553 | georg.brandl | 2006-05-30 09:34:45 +0200 (Tue, 30 May 2006) | 3 lines
Disallow keyword args for exceptions.
........
r46554 | neal.norwitz | 2006-05-30 09:36:54 +0200 (Tue, 30 May 2006) | 5 lines
I'm impatient. I think this will fix a few more problems with the buildbots.
I'm not sure this is the best approach, but I can't think of anything better.
If this creates problems, feel free to revert, but I think it's safe and
should make things a little better.
........
r46555 | georg.brandl | 2006-05-30 10:17:00 +0200 (Tue, 30 May 2006) | 4 lines
Do the check for no keyword arguments in __init__ so that
subclasses of Exception can be supplied keyword args
........
r46556 | georg.brandl | 2006-05-30 10:47:19 +0200 (Tue, 30 May 2006) | 3 lines
Convert test_exceptions to unittest.
........
r46557 | andrew.kuchling | 2006-05-30 14:52:01 +0200 (Tue, 30 May 2006) | 1 line
Add SoC name, and reorganize this section a bit
........
r46559 | tim.peters | 2006-05-30 17:53:34 +0200 (Tue, 30 May 2006) | 11 lines
PyLong_FromString(): Continued fraction analysis (explained in
a new comment) suggests there are almost certainly large input
integers in all non-binary input bases for which one Python digit
too few is initally allocated to hold the final result. Instead
of assert-failing when that happens, allocate more space. Alas,
I estimate it would take a few days to find a specific such case,
so this isn't backed up by a new test (not to mention that such
a case may take hours to run, since conversion time is quadratic
in the number of digits, and preliminary attempts suggested that
the smallest such inputs contain at least a million digits).
........
r46560 | fredrik.lundh | 2006-05-30 19:11:48 +0200 (Tue, 30 May 2006) | 3 lines
changed find/rfind to return -1 for matches outside the source string
........
r46561 | bob.ippolito | 2006-05-30 19:37:54 +0200 (Tue, 30 May 2006) | 1 line
Change wrapping terminology to overflow masking
........
r46562 | fredrik.lundh | 2006-05-30 19:39:58 +0200 (Tue, 30 May 2006) | 3 lines
changed count to return 0 for slices outside the source string
........
r46568 | tim.peters | 2006-05-31 01:28:02 +0200 (Wed, 31 May 2006) | 2 lines
Whitespace normalization.
........
r46569 | brett.cannon | 2006-05-31 04:19:54 +0200 (Wed, 31 May 2006) | 5 lines
Clarify wording on default values for strptime(); defaults are used when better
values cannot be inferred.
Closes bug #1496315.
........
r46572 | neal.norwitz | 2006-05-31 09:43:27 +0200 (Wed, 31 May 2006) | 1 line
Calculate smallest properly (it was off by one) and use proper ssize_t types for Win64
........
r46573 | neal.norwitz | 2006-05-31 10:01:08 +0200 (Wed, 31 May 2006) | 1 line
Revert last checkin, it is better to do make distclean
........
r46574 | neal.norwitz | 2006-05-31 11:02:44 +0200 (Wed, 31 May 2006) | 3 lines
On 64-bit platforms running test_struct after test_tarfile would fail
since the deprecation warning wouldn't be raised.
........
r46575 | thomas.heller | 2006-05-31 13:37:58 +0200 (Wed, 31 May 2006) | 3 lines
PyTuple_Pack is not available in Python 2.3, but ctypes must stay
compatible with that.
........
r46576 | andrew.kuchling | 2006-05-31 15:18:56 +0200 (Wed, 31 May 2006) | 1 line
'functional' module was renamed to 'functools'
........
r46577 | kristjan.jonsson | 2006-05-31 15:35:41 +0200 (Wed, 31 May 2006) | 1 line
Fixup the PCBuild8 project directory. exceptions.c have moved to Objects, and the functionalmodule.c has been replaced with _functoolsmodule.c. Other minor changes to .vcproj files and .sln to fix compilation
........
r46578 | andrew.kuchling | 2006-05-31 16:08:48 +0200 (Wed, 31 May 2006) | 15 lines
[Bug #1473048]
SimpleXMLRPCServer and DocXMLRPCServer don't look at
the path of the HTTP request at all; you can POST or
GET from / or /RPC2 or /blahblahblah with the same results.
Security scanners that look for /cgi-bin/phf will therefore report
lots of vulnerabilities.
Fix: add a .rpc_paths attribute to the SimpleXMLRPCServer class,
and report a 404 error if the path isn't on the allowed list.
Possibly-controversial aspect of this change: the default makes only
'/' and '/RPC2' legal. Maybe this will break people's applications
(though I doubt it). We could just set the default to an empty tuple,
which would exactly match the current behaviour.
........
r46579 | andrew.kuchling | 2006-05-31 16:12:47 +0200 (Wed, 31 May 2006) | 1 line
Mention SimpleXMLRPCServer change
........
r46580 | tim.peters | 2006-05-31 16:28:07 +0200 (Wed, 31 May 2006) | 2 lines
Trimmed trailing whitespace.
........
r46581 | tim.peters | 2006-05-31 17:33:22 +0200 (Wed, 31 May 2006) | 4 lines
_range_error(): Speed and simplify (there's no real need for
loops here). Assert that size_t is actually big enough, and
that f->size is at least one. Wrap a long line.
........
r46582 | tim.peters | 2006-05-31 17:34:37 +0200 (Wed, 31 May 2006) | 2 lines
Repaired error in new comment.
........
r46584 | neal.norwitz | 2006-06-01 07:32:49 +0200 (Thu, 01 Jun 2006) | 4 lines
Remove ; at end of macro. There was a compiler recently that warned
about extra semi-colons. It may have been the HP C compiler.
This file will trigger a bunch of those warnings now.
........
r46585 | georg.brandl | 2006-06-01 08:39:19 +0200 (Thu, 01 Jun 2006) | 3 lines
Correctly unpickle 2.4 exceptions via __setstate__ (patch #1498571)
........
r46586 | georg.brandl | 2006-06-01 10:27:32 +0200 (Thu, 01 Jun 2006) | 3 lines
Correctly allocate complex types with tp_alloc. (bug #1498638)
........
r46587 | georg.brandl | 2006-06-01 14:30:46 +0200 (Thu, 01 Jun 2006) | 2 lines
Correctly dispatch Faults in loads (patch #1498627)
........
r46588 | georg.brandl | 2006-06-01 15:00:49 +0200 (Thu, 01 Jun 2006) | 3 lines
Some code style tweaks, and remove apply.
........
r46589 | armin.rigo | 2006-06-01 15:19:12 +0200 (Thu, 01 Jun 2006) | 5 lines
[ 1497053 ] Let dicts propagate the exceptions in user __eq__().
[ 1456209 ] dictresize() vulnerability ( <- backport candidate ).
........
r46590 | tim.peters | 2006-06-01 15:41:46 +0200 (Thu, 01 Jun 2006) | 2 lines
Whitespace normalization.
........
r46591 | tim.peters | 2006-06-01 15:49:23 +0200 (Thu, 01 Jun 2006) | 2 lines
Record bugs 1275608 and 1456209 as being fixed.
........
r46592 | tim.peters | 2006-06-01 15:56:26 +0200 (Thu, 01 Jun 2006) | 5 lines
Re-enable a new empty-string test added during the NFS sprint,
but disabled then because str and unicode strings gave different
results. The implementations were repaired later during the
sprint, but the new test remained disabled.
........
r46594 | tim.peters | 2006-06-01 17:50:44 +0200 (Thu, 01 Jun 2006) | 7 lines
Armin committed his patch while I was reviewing it (I'm sure
he didn't know this), so merged in some changes I made during
review. Nothing material apart from changing a new `mask` local
from int to Py_ssize_t. Mostly this is repairing comments that
were made incorrect, and adding new comments. Also a few
minor code rewrites for clarity or helpful succinctness.
........
r46599 | neal.norwitz | 2006-06-02 06:45:53 +0200 (Fri, 02 Jun 2006) | 1 line
Convert docstrings to comments so regrtest -v prints method names
........
r46600 | neal.norwitz | 2006-06-02 06:50:49 +0200 (Fri, 02 Jun 2006) | 2 lines
Fix memory leak found by valgrind.
........
r46601 | neal.norwitz | 2006-06-02 06:54:52 +0200 (Fri, 02 Jun 2006) | 1 line
More memory leaks from valgrind
........
r46602 | neal.norwitz | 2006-06-02 08:23:00 +0200 (Fri, 02 Jun 2006) | 11 lines
Patch #1357836:
Prevent an invalid memory read from test_coding in case the done flag is set.
In that case, the loop isn't entered. I wonder if rather than setting
the done flag in the cases before the loop, if they should just exit early.
This code looks like it should be refactored.
Backport candidate (also the early break above if decoding_fgets fails)
........
r46603 | martin.blais | 2006-06-02 15:03:43 +0200 (Fri, 02 Jun 2006) | 1 line
Fixed struct test to not use unittest.
........
r46605 | tim.peters | 2006-06-03 01:22:51 +0200 (Sat, 03 Jun 2006) | 10 lines
pprint functions used to sort a dict (by key) if and only if
the output required more than one line. "Small" dicts got
displayed in seemingly random order (the hash-induced order
produced by dict.__repr__). None of this was documented.
Now pprint functions always sort dicts by key, and the docs
promise it.
This was proposed and agreed to during the PyCon 2006 core
sprint -- I just didn't have time for it before now.
........
767 lines
24 KiB
C
767 lines
24 KiB
C
#ifndef Py_PYPORT_H
|
|
#define Py_PYPORT_H
|
|
|
|
#include "pyconfig.h" /* include for defines */
|
|
|
|
/**************************************************************************
|
|
Symbols and macros to supply platform-independent interfaces to basic
|
|
C language & library operations whose spellings vary across platforms.
|
|
|
|
Please try to make documentation here as clear as possible: by definition,
|
|
the stuff here is trying to illuminate C's darkest corners.
|
|
|
|
Config #defines referenced here:
|
|
|
|
SIGNED_RIGHT_SHIFT_ZERO_FILLS
|
|
Meaning: To be defined iff i>>j does not extend the sign bit when i is a
|
|
signed integral type and i < 0.
|
|
Used in: Py_ARITHMETIC_RIGHT_SHIFT
|
|
|
|
Py_DEBUG
|
|
Meaning: Extra checks compiled in for debug mode.
|
|
Used in: Py_SAFE_DOWNCAST
|
|
|
|
HAVE_UINTPTR_T
|
|
Meaning: The C9X type uintptr_t is supported by the compiler
|
|
Used in: Py_uintptr_t
|
|
|
|
HAVE_LONG_LONG
|
|
Meaning: The compiler supports the C type "long long"
|
|
Used in: PY_LONG_LONG
|
|
|
|
**************************************************************************/
|
|
|
|
|
|
/* For backward compatibility only. Obsolete, do not use. */
|
|
#ifdef HAVE_PROTOTYPES
|
|
#define Py_PROTO(x) x
|
|
#else
|
|
#define Py_PROTO(x) ()
|
|
#endif
|
|
#ifndef Py_FPROTO
|
|
#define Py_FPROTO(x) Py_PROTO(x)
|
|
#endif
|
|
|
|
/* typedefs for some C9X-defined synonyms for integral types.
|
|
*
|
|
* The names in Python are exactly the same as the C9X names, except with a
|
|
* Py_ prefix. Until C9X is universally implemented, this is the only way
|
|
* to ensure that Python gets reliable names that don't conflict with names
|
|
* in non-Python code that are playing their own tricks to define the C9X
|
|
* names.
|
|
*
|
|
* NOTE: don't go nuts here! Python has no use for *most* of the C9X
|
|
* integral synonyms. Only define the ones we actually need.
|
|
*/
|
|
|
|
#ifdef HAVE_LONG_LONG
|
|
#ifndef PY_LONG_LONG
|
|
#define PY_LONG_LONG long long
|
|
#endif
|
|
#endif /* HAVE_LONG_LONG */
|
|
|
|
/* uintptr_t is the C9X name for an unsigned integral type such that a
|
|
* legitimate void* can be cast to uintptr_t and then back to void* again
|
|
* without loss of information. Similarly for intptr_t, wrt a signed
|
|
* integral type.
|
|
*/
|
|
#ifdef HAVE_UINTPTR_T
|
|
typedef uintptr_t Py_uintptr_t;
|
|
typedef intptr_t Py_intptr_t;
|
|
|
|
#elif SIZEOF_VOID_P <= SIZEOF_INT
|
|
typedef unsigned int Py_uintptr_t;
|
|
typedef int Py_intptr_t;
|
|
|
|
#elif SIZEOF_VOID_P <= SIZEOF_LONG
|
|
typedef unsigned long Py_uintptr_t;
|
|
typedef long Py_intptr_t;
|
|
|
|
#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P <= SIZEOF_LONG_LONG)
|
|
typedef unsigned PY_LONG_LONG Py_uintptr_t;
|
|
typedef PY_LONG_LONG Py_intptr_t;
|
|
|
|
#else
|
|
# error "Python needs a typedef for Py_uintptr_t in pyport.h."
|
|
#endif /* HAVE_UINTPTR_T */
|
|
|
|
/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) ==
|
|
* sizeof(size_t). C99 doesn't define such a thing directly (size_t is an
|
|
* unsigned integral type). See PEP 353 for details.
|
|
*/
|
|
#ifdef HAVE_SSIZE_T
|
|
typedef ssize_t Py_ssize_t;
|
|
#elif SIZEOF_VOID_P == SIZEOF_SIZE_T
|
|
typedef Py_intptr_t Py_ssize_t;
|
|
#else
|
|
# error "Python needs a typedef for Py_ssize_t in pyport.h."
|
|
#endif
|
|
|
|
/* Largest positive value of type Py_ssize_t. */
|
|
#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1))
|
|
/* Smallest negative value of type Py_ssize_t. */
|
|
#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1)
|
|
|
|
/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf
|
|
* format to convert an argument with the width of a size_t or Py_ssize_t.
|
|
* C99 introduced "z" for this purpose, but not all platforms support that;
|
|
* e.g., MS compilers use "I" instead.
|
|
*
|
|
* These "high level" Python format functions interpret "z" correctly on
|
|
* all platforms (Python interprets the format string itself, and does whatever
|
|
* the platform C requires to convert a size_t/Py_ssize_t argument):
|
|
*
|
|
* PyString_FromFormat
|
|
* PyErr_Format
|
|
* PyString_FromFormatV
|
|
*
|
|
* Lower-level uses require that you interpolate the correct format modifier
|
|
* yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for
|
|
* example,
|
|
*
|
|
* Py_ssize_t index;
|
|
* fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index);
|
|
*
|
|
* That will expand to %ld, or %Id, or to something else correct for a
|
|
* Py_ssize_t on the platform.
|
|
*/
|
|
#ifndef PY_FORMAT_SIZE_T
|
|
# if SIZEOF_SIZE_T == SIZEOF_INT
|
|
# define PY_FORMAT_SIZE_T ""
|
|
# elif SIZEOF_SIZE_T == SIZEOF_LONG
|
|
# define PY_FORMAT_SIZE_T "l"
|
|
# elif defined(MS_WINDOWS)
|
|
# define PY_FORMAT_SIZE_T "I"
|
|
# else
|
|
# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T"
|
|
# endif
|
|
#endif
|
|
|
|
/* Py_LOCAL can be used instead of static to get the fastest possible calling
|
|
* convention for functions that are local to a given module.
|
|
*
|
|
* Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining,
|
|
* for platforms that support that.
|
|
*
|
|
* If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more
|
|
* "aggressive" inlining/optimizaion is enabled for the entire module. This
|
|
* may lead to code bloat, and may slow things down for those reasons. It may
|
|
* also lead to errors, if the code relies on pointer aliasing. Use with
|
|
* care.
|
|
*
|
|
* NOTE: You can only use this for functions that are entirely local to a
|
|
* module; functions that are exported via method tables, callbacks, etc,
|
|
* should keep using static.
|
|
*/
|
|
|
|
#undef USE_INLINE /* XXX - set via configure? */
|
|
|
|
#if defined(_MSC_VER)
|
|
#if defined(PY_LOCAL_AGGRESSIVE)
|
|
/* enable more aggressive optimization for visual studio */
|
|
#pragma optimize("agtw", on)
|
|
#endif
|
|
/* ignore warnings if the compiler decides not to inline a function */
|
|
#pragma warning(disable: 4710)
|
|
/* fastest possible local call under MSVC */
|
|
#define Py_LOCAL(type) static type __fastcall
|
|
#define Py_LOCAL_INLINE(type) static __inline type __fastcall
|
|
#elif defined(USE_INLINE)
|
|
#define Py_LOCAL(type) static type
|
|
#define Py_LOCAL_INLINE(type) static inline type
|
|
#else
|
|
#define Py_LOCAL(type) static type
|
|
#define Py_LOCAL_INLINE(type) static type
|
|
#endif
|
|
|
|
/* Py_MEMCPY can be used instead of memcpy in cases where the copied blocks
|
|
* are often very short. While most platforms have highly optimized code for
|
|
* large transfers, the setup costs for memcpy are often quite high. MEMCPY
|
|
* solves this by doing short copies "in line".
|
|
*/
|
|
|
|
#if defined(_MSC_VER)
|
|
#define Py_MEMCPY(target, source, length) do { \
|
|
size_t i_, n_ = (length); \
|
|
char *t_ = (void*) (target); \
|
|
const char *s_ = (void*) (source); \
|
|
if (n_ >= 16) \
|
|
memcpy(t_, s_, n_); \
|
|
else \
|
|
for (i_ = 0; i_ < n_; i_++) \
|
|
t_[i_] = s_[i_]; \
|
|
} while (0)
|
|
#else
|
|
#define Py_MEMCPY memcpy
|
|
#endif
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <math.h> /* Moved here from the math section, before extern "C" */
|
|
|
|
/********************************************
|
|
* WRAPPER FOR <time.h> and/or <sys/time.h> *
|
|
********************************************/
|
|
|
|
#ifdef TIME_WITH_SYS_TIME
|
|
#include <sys/time.h>
|
|
#include <time.h>
|
|
#else /* !TIME_WITH_SYS_TIME */
|
|
#ifdef HAVE_SYS_TIME_H
|
|
#include <sys/time.h>
|
|
#else /* !HAVE_SYS_TIME_H */
|
|
#include <time.h>
|
|
#endif /* !HAVE_SYS_TIME_H */
|
|
#endif /* !TIME_WITH_SYS_TIME */
|
|
|
|
|
|
/******************************
|
|
* WRAPPER FOR <sys/select.h> *
|
|
******************************/
|
|
|
|
/* NB caller must include <sys/types.h> */
|
|
|
|
#ifdef HAVE_SYS_SELECT_H
|
|
|
|
#include <sys/select.h>
|
|
|
|
#endif /* !HAVE_SYS_SELECT_H */
|
|
|
|
/*******************************
|
|
* stat() and fstat() fiddling *
|
|
*******************************/
|
|
|
|
/* We expect that stat and fstat exist on most systems.
|
|
* It's confirmed on Unix, Mac and Windows.
|
|
* If you don't have them, add
|
|
* #define DONT_HAVE_STAT
|
|
* and/or
|
|
* #define DONT_HAVE_FSTAT
|
|
* to your pyconfig.h. Python code beyond this should check HAVE_STAT and
|
|
* HAVE_FSTAT instead.
|
|
* Also
|
|
* #define DONT_HAVE_SYS_STAT_H
|
|
* if <sys/stat.h> doesn't exist on your platform, and
|
|
* #define HAVE_STAT_H
|
|
* if <stat.h> does (don't look at me -- ths mess is inherited).
|
|
*/
|
|
#ifndef DONT_HAVE_STAT
|
|
#define HAVE_STAT
|
|
#endif
|
|
|
|
#ifndef DONT_HAVE_FSTAT
|
|
#define HAVE_FSTAT
|
|
#endif
|
|
|
|
#ifdef RISCOS
|
|
#include <sys/types.h>
|
|
#include "unixstuff.h"
|
|
#endif
|
|
|
|
#ifndef DONT_HAVE_SYS_STAT_H
|
|
#if defined(PYOS_OS2) && defined(PYCC_GCC)
|
|
#include <sys/types.h>
|
|
#endif
|
|
#include <sys/stat.h>
|
|
#elif defined(HAVE_STAT_H)
|
|
#include <stat.h>
|
|
#endif
|
|
|
|
#if defined(PYCC_VACPP)
|
|
/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
|
|
#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
|
|
#endif
|
|
|
|
#ifndef S_ISREG
|
|
#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG)
|
|
#endif
|
|
|
|
#ifndef S_ISDIR
|
|
#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)
|
|
#endif
|
|
|
|
|
|
#ifdef __cplusplus
|
|
/* Move this down here since some C++ #include's don't like to be included
|
|
inside an extern "C" */
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/* Py_ARITHMETIC_RIGHT_SHIFT
|
|
* C doesn't define whether a right-shift of a signed integer sign-extends
|
|
* or zero-fills. Here a macro to force sign extension:
|
|
* Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J)
|
|
* Return I >> J, forcing sign extension.
|
|
* Requirements:
|
|
* I is of basic signed type TYPE (char, short, int, long, or long long).
|
|
* TYPE is one of char, short, int, long, or long long, although long long
|
|
* must not be used except on platforms that support it.
|
|
* J is an integer >= 0 and strictly less than the number of bits in TYPE
|
|
* (because C doesn't define what happens for J outside that range either).
|
|
* Caution:
|
|
* I may be evaluated more than once.
|
|
*/
|
|
#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS
|
|
#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \
|
|
((I) < 0 ? ~((~(unsigned TYPE)(I)) >> (J)) : (I) >> (J))
|
|
#else
|
|
#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J))
|
|
#endif
|
|
|
|
/* Py_FORCE_EXPANSION(X)
|
|
* "Simply" returns its argument. However, macro expansions within the
|
|
* argument are evaluated. This unfortunate trickery is needed to get
|
|
* token-pasting to work as desired in some cases.
|
|
*/
|
|
#define Py_FORCE_EXPANSION(X) X
|
|
|
|
/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW)
|
|
* Cast VALUE to type NARROW from type WIDE. In Py_DEBUG mode, this
|
|
* assert-fails if any information is lost.
|
|
* Caution:
|
|
* VALUE may be evaluated more than once.
|
|
*/
|
|
#ifdef Py_DEBUG
|
|
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \
|
|
(assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE))
|
|
#else
|
|
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
|
|
#endif
|
|
|
|
/* Py_IS_NAN(X)
|
|
* Return 1 if float or double arg is a NaN, else 0.
|
|
* Caution:
|
|
* X is evaluated more than once.
|
|
* This may not work on all platforms. Each platform has *some*
|
|
* way to spell this, though -- override in pyconfig.h if you have
|
|
* a platform where it doesn't work.
|
|
*/
|
|
#ifndef Py_IS_NAN
|
|
#define Py_IS_NAN(X) ((X) != (X))
|
|
#endif
|
|
|
|
/* Py_IS_INFINITY(X)
|
|
* Return 1 if float or double arg is an infinity, else 0.
|
|
* Caution:
|
|
* X is evaluated more than once.
|
|
* This implementation may set the underflow flag if |X| is very small;
|
|
* it really can't be implemented correctly (& easily) before C99.
|
|
* Override in pyconfig.h if you have a better spelling on your platform.
|
|
*/
|
|
#ifndef Py_IS_INFINITY
|
|
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
|
|
#endif
|
|
|
|
/* Py_IS_FINITE(X)
|
|
* Return 1 if float or double arg is neither infinite nor NAN, else 0.
|
|
* Some compilers (e.g. VisualStudio) have intrisics for this, so a special
|
|
* macro for this particular test is useful
|
|
*/
|
|
#ifndef Py_IS_FINITE
|
|
#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X))
|
|
#endif
|
|
|
|
/* HUGE_VAL is supposed to expand to a positive double infinity. Python
|
|
* uses Py_HUGE_VAL instead because some platforms are broken in this
|
|
* respect. We used to embed code in pyport.h to try to worm around that,
|
|
* but different platforms are broken in conflicting ways. If you're on
|
|
* a platform where HUGE_VAL is defined incorrectly, fiddle your Python
|
|
* config to #define Py_HUGE_VAL to something that works on your platform.
|
|
*/
|
|
#ifndef Py_HUGE_VAL
|
|
#define Py_HUGE_VAL HUGE_VAL
|
|
#endif
|
|
|
|
/* Py_OVERFLOWED(X)
|
|
* Return 1 iff a libm function overflowed. Set errno to 0 before calling
|
|
* a libm function, and invoke this macro after, passing the function
|
|
* result.
|
|
* Caution:
|
|
* This isn't reliable. C99 no longer requires libm to set errno under
|
|
* any exceptional condition, but does require +- HUGE_VAL return
|
|
* values on overflow. A 754 box *probably* maps HUGE_VAL to a
|
|
* double infinity, and we're cool if that's so, unless the input
|
|
* was an infinity and an infinity is the expected result. A C89
|
|
* system sets errno to ERANGE, so we check for that too. We're
|
|
* out of luck if a C99 754 box doesn't map HUGE_VAL to +Inf, or
|
|
* if the returned result is a NaN, or if a C89 box returns HUGE_VAL
|
|
* in non-overflow cases.
|
|
* X is evaluated more than once.
|
|
* Some platforms have better way to spell this, so expect some #ifdef'ery.
|
|
*
|
|
* OpenBSD uses 'isinf()' because a compiler bug on that platform causes
|
|
* the longer macro version to be mis-compiled. This isn't optimal, and
|
|
* should be removed once a newer compiler is available on that platform.
|
|
* The system that had the failure was running OpenBSD 3.2 on Intel, with
|
|
* gcc 2.95.3.
|
|
*
|
|
* According to Tim's checkin, the FreeBSD systems use isinf() to work
|
|
* around a FPE bug on that platform.
|
|
*/
|
|
#if defined(__FreeBSD__) || defined(__OpenBSD__)
|
|
#define Py_OVERFLOWED(X) isinf(X)
|
|
#else
|
|
#define Py_OVERFLOWED(X) ((X) != 0.0 && (errno == ERANGE || \
|
|
(X) == Py_HUGE_VAL || \
|
|
(X) == -Py_HUGE_VAL))
|
|
#endif
|
|
|
|
/* Py_SET_ERRNO_ON_MATH_ERROR(x)
|
|
* If a libm function did not set errno, but it looks like the result
|
|
* overflowed or not-a-number, set errno to ERANGE or EDOM. Set errno
|
|
* to 0 before calling a libm function, and invoke this macro after,
|
|
* passing the function result.
|
|
* Caution:
|
|
* This isn't reliable. See Py_OVERFLOWED comments.
|
|
* X is evaluated more than once.
|
|
*/
|
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64))
|
|
#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM;
|
|
#else
|
|
#define _Py_SET_EDOM_FOR_NAN(X) ;
|
|
#endif
|
|
#define Py_SET_ERRNO_ON_MATH_ERROR(X) \
|
|
do { \
|
|
if (errno == 0) { \
|
|
if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \
|
|
errno = ERANGE; \
|
|
else _Py_SET_EDOM_FOR_NAN(X) \
|
|
} \
|
|
} while(0)
|
|
|
|
/* Py_SET_ERANGE_ON_OVERFLOW(x)
|
|
* An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility.
|
|
*/
|
|
#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X)
|
|
|
|
/* Py_ADJUST_ERANGE1(x)
|
|
* Py_ADJUST_ERANGE2(x, y)
|
|
* Set errno to 0 before calling a libm function, and invoke one of these
|
|
* macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful
|
|
* for functions returning complex results). This makes two kinds of
|
|
* adjustments to errno: (A) If it looks like the platform libm set
|
|
* errno=ERANGE due to underflow, clear errno. (B) If it looks like the
|
|
* platform libm overflowed but didn't set errno, force errno to ERANGE. In
|
|
* effect, we're trying to force a useful implementation of C89 errno
|
|
* behavior.
|
|
* Caution:
|
|
* This isn't reliable. See Py_OVERFLOWED comments.
|
|
* X and Y may be evaluated more than once.
|
|
*/
|
|
#define Py_ADJUST_ERANGE1(X) \
|
|
do { \
|
|
if (errno == 0) { \
|
|
if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \
|
|
errno = ERANGE; \
|
|
} \
|
|
else if (errno == ERANGE && (X) == 0.0) \
|
|
errno = 0; \
|
|
} while(0)
|
|
|
|
#define Py_ADJUST_ERANGE2(X, Y) \
|
|
do { \
|
|
if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || \
|
|
(Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) { \
|
|
if (errno == 0) \
|
|
errno = ERANGE; \
|
|
} \
|
|
else if (errno == ERANGE) \
|
|
errno = 0; \
|
|
} while(0)
|
|
|
|
/* Py_DEPRECATED(version)
|
|
* Declare a variable, type, or function deprecated.
|
|
* Usage:
|
|
* extern int old_var Py_DEPRECATED(2.3);
|
|
* typedef int T1 Py_DEPRECATED(2.4);
|
|
* extern int x() Py_DEPRECATED(2.5);
|
|
*/
|
|
#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
|
|
(__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))
|
|
#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__))
|
|
#else
|
|
#define Py_DEPRECATED(VERSION_UNUSED)
|
|
#endif
|
|
|
|
/**************************************************************************
|
|
Prototypes that are missing from the standard include files on some systems
|
|
(and possibly only some versions of such systems.)
|
|
|
|
Please be conservative with adding new ones, document them and enclose them
|
|
in platform-specific #ifdefs.
|
|
**************************************************************************/
|
|
|
|
#ifdef SOLARIS
|
|
/* Unchecked */
|
|
extern int gethostname(char *, int);
|
|
#endif
|
|
|
|
#ifdef __BEOS__
|
|
/* Unchecked */
|
|
/* It's in the libs, but not the headers... - [cjh] */
|
|
int shutdown( int, int );
|
|
#endif
|
|
|
|
#ifdef HAVE__GETPTY
|
|
#include <sys/types.h> /* we need to import mode_t */
|
|
extern char * _getpty(int *, int, mode_t, int);
|
|
#endif
|
|
|
|
#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY)
|
|
#if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H)
|
|
/* BSDI does not supply a prototype for the 'openpty' and 'forkpty'
|
|
functions, even though they are included in libutil. */
|
|
#include <termios.h>
|
|
extern int openpty(int *, int *, char *, struct termios *, struct winsize *);
|
|
extern int forkpty(int *, char *, struct termios *, struct winsize *);
|
|
#endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */
|
|
#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */
|
|
|
|
|
|
/* These are pulled from various places. It isn't obvious on what platforms
|
|
they are necessary, nor what the exact prototype should look like (which
|
|
is likely to vary between platforms!) If you find you need one of these
|
|
declarations, please move them to a platform-specific block and include
|
|
proper prototypes. */
|
|
#if 0
|
|
|
|
/* From Modules/resource.c */
|
|
extern int getrusage();
|
|
extern int getpagesize();
|
|
|
|
/* From Python/sysmodule.c and Modules/posixmodule.c */
|
|
extern int fclose(FILE *);
|
|
|
|
/* From Modules/posixmodule.c */
|
|
extern int fdatasync(int);
|
|
#endif /* 0 */
|
|
|
|
|
|
/************************
|
|
* WRAPPER FOR <math.h> *
|
|
************************/
|
|
|
|
#ifndef HAVE_HYPOT
|
|
extern double hypot(double, double);
|
|
#endif
|
|
|
|
|
|
/* On 4.4BSD-descendants, ctype functions serves the whole range of
|
|
* wchar_t character set rather than single byte code points only.
|
|
* This characteristic can break some operations of string object
|
|
* including str.upper() and str.split() on UTF-8 locales. This
|
|
* workaround was provided by Tim Robbins of FreeBSD project.
|
|
*/
|
|
|
|
#ifdef __FreeBSD__
|
|
#include <osreldate.h>
|
|
#if __FreeBSD_version > 500039
|
|
#include <ctype.h>
|
|
#include <wctype.h>
|
|
#undef isalnum
|
|
#define isalnum(c) iswalnum(btowc(c))
|
|
#undef isalpha
|
|
#define isalpha(c) iswalpha(btowc(c))
|
|
#undef islower
|
|
#define islower(c) iswlower(btowc(c))
|
|
#undef isspace
|
|
#define isspace(c) iswspace(btowc(c))
|
|
#undef isupper
|
|
#define isupper(c) iswupper(btowc(c))
|
|
#undef tolower
|
|
#define tolower(c) towlower(btowc(c))
|
|
#undef toupper
|
|
#define toupper(c) towupper(btowc(c))
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/* Declarations for symbol visibility.
|
|
|
|
PyAPI_FUNC(type): Declares a public Python API function and return type
|
|
PyAPI_DATA(type): Declares public Python data and its type
|
|
PyMODINIT_FUNC: A Python module init function. If these functions are
|
|
inside the Python core, they are private to the core.
|
|
If in an extension module, it may be declared with
|
|
external linkage depending on the platform.
|
|
|
|
As a number of platforms support/require "__declspec(dllimport/dllexport)",
|
|
we support a HAVE_DECLSPEC_DLL macro to save duplication.
|
|
*/
|
|
|
|
/*
|
|
All windows ports, except cygwin, are handled in PC/pyconfig.h.
|
|
|
|
BeOS and cygwin are the only other autoconf platform requiring special
|
|
linkage handling and both of these use __declspec().
|
|
*/
|
|
#if defined(__CYGWIN__) || defined(__BEOS__)
|
|
# define HAVE_DECLSPEC_DLL
|
|
#endif
|
|
|
|
/* only get special linkage if built as shared or platform is Cygwin */
|
|
#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__)
|
|
# if defined(HAVE_DECLSPEC_DLL)
|
|
# ifdef Py_BUILD_CORE
|
|
# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE
|
|
# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE
|
|
/* module init functions inside the core need no external linkage */
|
|
/* except for Cygwin to handle embedding (FIXME: BeOS too?) */
|
|
# if defined(__CYGWIN__)
|
|
# define PyMODINIT_FUNC __declspec(dllexport) void
|
|
# else /* __CYGWIN__ */
|
|
# define PyMODINIT_FUNC void
|
|
# endif /* __CYGWIN__ */
|
|
# else /* Py_BUILD_CORE */
|
|
/* Building an extension module, or an embedded situation */
|
|
/* public Python functions and data are imported */
|
|
/* Under Cygwin, auto-import functions to prevent compilation */
|
|
/* failures similar to http://python.org/doc/FAQ.html#3.24 */
|
|
# if !defined(__CYGWIN__)
|
|
# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE
|
|
# endif /* !__CYGWIN__ */
|
|
# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE
|
|
/* module init functions outside the core must be exported */
|
|
# if defined(__cplusplus)
|
|
# define PyMODINIT_FUNC extern "C" __declspec(dllexport) void
|
|
# else /* __cplusplus */
|
|
# define PyMODINIT_FUNC __declspec(dllexport) void
|
|
# endif /* __cplusplus */
|
|
# endif /* Py_BUILD_CORE */
|
|
# endif /* HAVE_DECLSPEC */
|
|
#endif /* Py_ENABLE_SHARED */
|
|
|
|
/* If no external linkage macros defined by now, create defaults */
|
|
#ifndef PyAPI_FUNC
|
|
# define PyAPI_FUNC(RTYPE) RTYPE
|
|
#endif
|
|
#ifndef PyAPI_DATA
|
|
# define PyAPI_DATA(RTYPE) extern RTYPE
|
|
#endif
|
|
#ifndef PyMODINIT_FUNC
|
|
# if defined(__cplusplus)
|
|
# define PyMODINIT_FUNC extern "C" void
|
|
# else /* __cplusplus */
|
|
# define PyMODINIT_FUNC void
|
|
# endif /* __cplusplus */
|
|
#endif
|
|
|
|
/* Deprecated DL_IMPORT and DL_EXPORT macros */
|
|
#if defined(Py_ENABLE_SHARED) && defined (HAVE_DECLSPEC_DLL)
|
|
# if defined(Py_BUILD_CORE)
|
|
# define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE
|
|
# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE
|
|
# else
|
|
# define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE
|
|
# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE
|
|
# endif
|
|
#endif
|
|
#ifndef DL_EXPORT
|
|
# define DL_EXPORT(RTYPE) RTYPE
|
|
#endif
|
|
#ifndef DL_IMPORT
|
|
# define DL_IMPORT(RTYPE) RTYPE
|
|
#endif
|
|
/* End of deprecated DL_* macros */
|
|
|
|
/* If the fd manipulation macros aren't defined,
|
|
here is a set that should do the job */
|
|
|
|
#if 0 /* disabled and probably obsolete */
|
|
|
|
#ifndef FD_SETSIZE
|
|
#define FD_SETSIZE 256
|
|
#endif
|
|
|
|
#ifndef FD_SET
|
|
|
|
typedef long fd_mask;
|
|
|
|
#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */
|
|
#ifndef howmany
|
|
#define howmany(x, y) (((x)+((y)-1))/(y))
|
|
#endif /* howmany */
|
|
|
|
typedef struct fd_set {
|
|
fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)];
|
|
} fd_set;
|
|
|
|
#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
|
|
#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
|
|
#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
|
|
#define FD_ZERO(p) memset((char *)(p), '\0', sizeof(*(p)))
|
|
|
|
#endif /* FD_SET */
|
|
|
|
#endif /* fd manipulation macros */
|
|
|
|
|
|
/* limits.h constants that may be missing */
|
|
|
|
#ifndef INT_MAX
|
|
#define INT_MAX 2147483647
|
|
#endif
|
|
|
|
#ifndef LONG_MAX
|
|
#if SIZEOF_LONG == 4
|
|
#define LONG_MAX 0X7FFFFFFFL
|
|
#elif SIZEOF_LONG == 8
|
|
#define LONG_MAX 0X7FFFFFFFFFFFFFFFL
|
|
#else
|
|
#error "could not set LONG_MAX in pyport.h"
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef LONG_MIN
|
|
#define LONG_MIN (-LONG_MAX-1)
|
|
#endif
|
|
|
|
#ifndef LONG_BIT
|
|
#define LONG_BIT (8 * SIZEOF_LONG)
|
|
#endif
|
|
|
|
#if LONG_BIT != 8 * SIZEOF_LONG
|
|
/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent
|
|
* 32-bit platforms using gcc. We try to catch that here at compile-time
|
|
* rather than waiting for integer multiplication to trigger bogus
|
|
* overflows.
|
|
*/
|
|
#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)."
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* Hide GCC attributes from compilers that don't support them.
|
|
*/
|
|
#if (!defined(__GNUC__) || __GNUC__ < 2 || \
|
|
(__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) && \
|
|
!defined(RISCOS)
|
|
#define Py_GCC_ATTRIBUTE(x)
|
|
#else
|
|
#define Py_GCC_ATTRIBUTE(x) __attribute__(x)
|
|
#endif
|
|
|
|
/* Eliminate end-of-loop code not reached warnings from SunPro C
|
|
* when using do{...}while(0) macros
|
|
*/
|
|
#ifdef __SUNPRO_C
|
|
#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED)
|
|
#endif
|
|
|
|
/*
|
|
* Older Microsoft compilers don't support the C99 long long literal suffixes,
|
|
* so these will be defined in PC/pyconfig.h for those compilers.
|
|
*/
|
|
#ifndef Py_LL
|
|
#define Py_LL(x) x##LL
|
|
#endif
|
|
|
|
#ifndef Py_ULL
|
|
#define Py_ULL(x) Py_LL(x##U)
|
|
#endif
|
|
|
|
#endif /* Py_PYPORT_H */
|