Patch by Mark Hammond to support 64-bit ints on MS platforms.

The MS compiler doesn't call it 'long long', it uses __int64,
so a new #define, LONG_LONG, has been added and all occurrences
of 'long long' are replaced with it.
This commit is contained in:
Guido van Rossum 1998-08-25 16:07:15 +00:00
parent 859b407cf1
commit 3293b07df5
5 changed files with 38 additions and 33 deletions

View File

@ -51,11 +51,14 @@ extern unsigned long PyLong_AsUnsignedLong Py_PROTO((PyObject *));
extern double PyLong_AsDouble Py_PROTO((PyObject *)); extern double PyLong_AsDouble Py_PROTO((PyObject *));
#ifdef HAVE_LONG_LONG #ifdef HAVE_LONG_LONG
extern PyObject *PyLong_FromLongLong Py_PROTO((long long )); #ifndef LONG_LONG
extern PyObject *PyLong_FromUnsignedLongLong Py_PROTO((unsigned long long)); #define LONG_LONG long long
extern long long PyLong_AsLongLong Py_PROTO((PyObject *));
extern unsigned long long PyLong_AsUnsignedLongLong Py_PROTO((PyObject *));
#endif #endif
extern PyObject *PyLong_FromLongLong Py_PROTO((LONG_LONG));
extern PyObject *PyLong_FromUnsignedLongLong Py_PROTO((unsigned LONG_LONG));
extern LONG_LONG PyLong_AsLongLong Py_PROTO((PyObject *));
extern unsigned LONG_LONG PyLong_AsUnsignedLongLong Py_PROTO((PyObject *));
#endif /* HAVE_LONG_LONG */
PyObject *PyLong_FromString Py_PROTO((char *, char **, int)); PyObject *PyLong_FromString Py_PROTO((char *, char **, int));

View File

@ -279,7 +279,7 @@ PyLong_AsDouble(vv)
#ifdef HAVE_LONG_LONG #ifdef HAVE_LONG_LONG
/* /*
* long long support by Chris Herborth (chrish@qnx.com) * LONG_LONG support by Chris Herborth (chrish@qnx.com)
* *
* For better or worse :-), I tried to follow the coding style already * For better or worse :-), I tried to follow the coding style already
* here. * here.
@ -303,30 +303,30 @@ PyLong_AsDouble(vv)
#define ULONGLONG_MAX 0xffffffffffffffffULL #define ULONGLONG_MAX 0xffffffffffffffffULL
#endif #endif
/* Create a new long int object from a C long long int */ /* Create a new long int object from a C LONG_LONG int */
PyObject * PyObject *
PyLong_FromLongLong(ival) PyLong_FromLongLong(ival)
long long ival; LONG_LONG ival;
{ {
#if SIZEOF_LONG_LONG == SIZEOF_LONG #if SIZEOF_LONG_LONG == SIZEOF_LONG
/* In case the compiler is faking it. */ /* In case the compiler is faking it. */
return PyLong_FromLong( (long)ival ); return PyLong_FromLong( (long)ival );
#else #else
if( ival <= (long long)LONG_MAX ) { if( ival <= (LONG_LONG)LONG_MAX ) {
return PyLong_FromLong( (long)ival ); return PyLong_FromLong( (long)ival );
} }
else if( ival <= (unsigned long long)ULONG_MAX ) { else if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
return PyLong_FromUnsignedLong( (unsigned long)ival ); return PyLong_FromUnsignedLong( (unsigned long)ival );
} }
else { else {
/* Assume a C long long fits in at most 10 'digits'. /* Assume a C LONG_LONG fits in at most 10 'digits'.
* Should be OK if we're assuming long fits in 5. * Should be OK if we're assuming long fits in 5.
*/ */
PyLongObject *v = _PyLong_New(10); PyLongObject *v = _PyLong_New(10);
if (v != NULL) { if (v != NULL) {
unsigned long long t = ival; unsigned LONG_LONG t = ival;
int i; int i;
if (ival < 0) { if (ival < 0) {
t = -ival; t = -ival;
@ -350,16 +350,16 @@ PyLong_FromLongLong(ival)
#endif #endif
} }
/* Create a new long int object from a C unsigned long long int */ /* Create a new long int object from a C unsigned LONG_LONG int */
PyObject * PyObject *
PyLong_FromUnsignedLongLong(ival) PyLong_FromUnsignedLongLong(ival)
unsigned long long ival; unsigned LONG_LONG ival;
{ {
#if SIZEOF_LONG_LONG == SIZEOF_LONG #if SIZEOF_LONG_LONG == SIZEOF_LONG
/* In case the compiler is faking it. */ /* In case the compiler is faking it. */
return PyLong_FromUnsignedLong( (unsigned long)ival ); return PyLong_FromUnsignedLong( (unsigned long)ival );
#else #else
if( ival <= (unsigned long long)ULONG_MAX ) { if( ival <= (unsigned LONG_LONG)ULONG_MAX ) {
return PyLong_FromUnsignedLong( (unsigned long)ival ); return PyLong_FromUnsignedLong( (unsigned long)ival );
} }
else { else {
@ -367,7 +367,7 @@ PyLong_FromUnsignedLongLong(ival)
PyLongObject *v = _PyLong_New(10); PyLongObject *v = _PyLong_New(10);
if (v != NULL) { if (v != NULL) {
unsigned long long t = ival; unsigned LONG_LONG t = ival;
int i; int i;
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
v->ob_digit[i] = (digit) (t & MASK); v->ob_digit[i] = (digit) (t & MASK);
@ -386,19 +386,19 @@ PyLong_FromUnsignedLongLong(ival)
#endif #endif
} }
/* Get a C long long int from a long int object. /* Get a C LONG_LONG int from a long int object.
Returns -1 and sets an error condition if overflow occurs. */ Returns -1 and sets an error condition if overflow occurs. */
long long LONG_LONG
PyLong_AsLongLong(vv) PyLong_AsLongLong(vv)
PyObject *vv; PyObject *vv;
{ {
#if SIZEOF_LONG_LONG == SIZEOF_LONG #if SIZEOF_LONG_LONG == SIZEOF_LONG
/* In case the compiler is faking it. */ /* In case the compiler is faking it. */
return (long long)PyLong_AsLong( vv ); return (LONG_LONG)PyLong_AsLong( vv );
#else #else
register PyLongObject *v; register PyLongObject *v;
long long x, prev; LONG_LONG x, prev;
int i, sign; int i, sign;
if (vv == NULL || !PyLong_Check(vv)) { if (vv == NULL || !PyLong_Check(vv)) {
@ -430,21 +430,21 @@ PyLong_AsLongLong(vv)
#endif #endif
} }
unsigned long long unsigned LONG_LONG
PyLong_AsUnsignedLongLong(vv) PyLong_AsUnsignedLongLong(vv)
PyObject *vv; PyObject *vv;
{ {
#if SIZEOF_LONG_LONG == 4 #if SIZEOF_LONG_LONG == 4
/* In case the compiler is faking it. */ /* In case the compiler is faking it. */
return (unsigned long long)PyLong_AsUnsignedLong( vv ); return (unsigned LONG_LONG)PyLong_AsUnsignedLong( vv );
#else #else
register PyLongObject *v; register PyLongObject *v;
unsigned long long x, prev; unsigned LONG_LONG x, prev;
int i; int i;
if (vv == NULL || !PyLong_Check(vv)) { if (vv == NULL || !PyLong_Check(vv)) {
PyErr_BadInternalCall(); PyErr_BadInternalCall();
return (unsigned long long) -1; return (unsigned LONG_LONG) -1;
} }
v = (PyLongObject *)vv; v = (PyLongObject *)vv;
@ -454,7 +454,7 @@ PyLong_AsUnsignedLongLong(vv)
if (i < 0) { if (i < 0) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"can't convert negative value to unsigned long"); "can't convert negative value to unsigned long");
return (unsigned long long) -1; return (unsigned LONG_LONG) -1;
} }
while (--i >= 0) { while (--i >= 0) {
@ -463,7 +463,7 @@ PyLong_AsUnsignedLongLong(vv)
if ((x >> SHIFT) != prev) { if ((x >> SHIFT) != prev) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"long int too long to convert"); "long int too long to convert");
return (unsigned long long) -1; return (unsigned LONG_LONG) -1;
} }
} }
@ -907,7 +907,7 @@ x_divrem(v1, w1, prem)
static void long_dealloc Py_PROTO((PyObject *)); static void long_dealloc Py_PROTO((PyObject *));
static PyObject *long_repr Py_PROTO((PyObject *)); static PyObject *long_repr Py_PROTO((PyObject *));
static int long_compare Py_PROTO((PyLongObject *, PyLongObject *)); static int long_compare Py_PROTO((PyLongObject *, PyLongObject *));
static long long_hash Py_PROTO((PyLongObject *)); static LONG_LONG_hash Py_PROTO((PyLongObject *));
static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *)); static PyObject *long_add Py_PROTO((PyLongObject *, PyLongObject *));
static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *)); static PyObject *long_sub Py_PROTO((PyLongObject *, PyLongObject *));

View File

@ -85,6 +85,8 @@ typedef int pid_t;
#define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE #define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE
#endif #endif
#define HAVE_LONG_LONG 1
#define LONG_LONG __int64
#endif /* _MSC_VER && > 850 */ #endif /* _MSC_VER && > 850 */
#if defined(_MSC_VER) && _MSC_VER <= 850 #if defined(_MSC_VER) && _MSC_VER <= 850

View File

@ -500,11 +500,11 @@ convertsimple1(arg, p_format, p_va)
} }
#if HAVE_LONG_LONG #if HAVE_LONG_LONG
case 'L': /* long long */ case 'L': /* LONG_LONG */
{ {
long long *p = va_arg( *p_va, long long * ); LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
long long ival = PyLong_AsLongLong( arg ); LONG_LONG ival = PyLong_AsLongLong( arg );
if( ival == (long long)-1 && PyErr_Occurred() ) { if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
return "long<L>"; return "long<L>";
} else { } else {
*p = ival; *p = ival;
@ -1003,9 +1003,9 @@ skipitem(p_format, p_va)
} }
#if HAVE_LONG_LONG #if HAVE_LONG_LONG
case 'L': /* long long int */ case 'L': /* LONG_LONG int */
{ {
(void) va_arg(*p_va, long long *); (void) va_arg(*p_va, LONG_LONG *);
break; break;
} }
#endif #endif

View File

@ -293,7 +293,7 @@ do_mkvalue(p_format, p_va)
#if HAVE_LONG_LONG #if HAVE_LONG_LONG
case 'L': case 'L':
return PyLong_FromLongLong((long long)va_arg(*p_va, long long)); return PyLong_FromLongLong((LONG_LONG)va_arg(*p_va, LONG_LONG));
#endif #endif
case 'f': case 'f':