[Tcl] Fix handling of long long on 32-bit platforms

Fixes https://sourceforge.net/p/swig/bugs/977/ reported by Vera and
Kjell Wooding.

Closes #2331
This commit is contained in:
Olly Betts 2022-07-26 14:59:42 +12:00
commit 06d375cdab
4 changed files with 38 additions and 25 deletions

View file

@ -136,30 +136,13 @@ SWIG_From_dec(long long)(long long value)
SWIGINTERN int
SWIG_AsVal_dec(long long)(Tcl_Obj *obj, long long *val)
{
long v;
if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) {
Tcl_WideInt v;
if (Tcl_GetWideIntFromObj(0, obj, &v) == TCL_OK) {
if (sizeof(v) > sizeof(*val) && (v < LLONG_MIN || v > LLONG_MAX)) {
return SWIG_OverflowError;
}
if (val) *val = v;
return SWIG_OK;
} else {
int len = 0;
const char *nptr = Tcl_GetStringFromObj(obj, &len);
if (nptr && len > 0) {
char *endptr;
long long v;
errno = 0;
v = strtoll(nptr, &endptr,0);
if (nptr[0] == '\0' || *endptr != '\0')
return SWIG_TypeError;
if ((v == LLONG_MAX || v == LLONG_MIN) && errno == ERANGE) {
errno = 0;
return SWIG_OverflowError;
} else {
if (*endptr == '\0') {
if (val) *val = v;
return SWIG_OK;
}
}
}
}
return SWIG_TypeError;
}