> On Mar 20, 2017, at 05:16, Ruediger Meier <sweet_...@gmx.de> wrote: > >> On Monday 20 March 2017, Andi Vajda wrote: >> On Mon, 20 Mar 2017, Ruediger Meier wrote: > >>>> Someone with access to Windows, please help test/fix/finish >>>> support for Python 3 on Windows, both with the MSVC and Mingw >>>> compilers. I have no access to Windows anymore. >>> >>> I know already about one MSVC issue: >>> https://github.com/rudimeier/jcc/issues/1 >>> >>> probably fixed by >>> https://github.com/rudimeier/jcc/commit/764ed0dc1f77c68e4a6998688d2 >>> e8340704fd237 (But this fix is also not tested yet.) >> >> I changed strhash to use Py_hash_t. > > This is now wrong and I could reproduce a segfault on OSX 10.11, xcode > 8. The buffersize "hexdig + 1" has to match the type we are printing. > We can't calculate the size from Py_hash_t but print ulong.
Ah yes, good point. Sorry for the mess up. > > Most safely and without precision loss we could do it like the patch > below. > > Notes: > 1. "static const" was required to actually fix MSVC's VLA issue. Yes, but that's not reentrant, thus we need to switch back to a constant size for the array, like [20] we had before, or [40] now. > 2. The macro PRIxMAX is the same as "%jx". I've choosed the macro > because it should be compatible to Visual Studio >=2013 while "%jx" > would need Visual Studio >=2015. Moreover when using incompatible > compilers the macro would give an error at compile time rather > than "%jx" would just crash at runtime. What's wring with %lx ? Andi.. > > > -------- > diff --git a/jcc3/sources/jcc.cpp b/jcc3/sources/jcc.cpp > index 8c12f00..90baa8b 100644 > --- a/jcc3/sources/jcc.cpp > +++ b/jcc3/sources/jcc.cpp > @@ -15,6 +15,7 @@ > #include <stdio.h> > #include <stdlib.h> > #include <string.h> > +#include <inttypes.h> > #include <jni.h> > > #ifdef linux > @@ -194,11 +195,11 @@ static PyObject *t_jccenv_isShared(PyObject *self) > > static PyObject *t_jccenv_strhash(PyObject *self, PyObject *arg) > { > - Py_hash_t hash = PyObject_Hash(arg); > - size_t hexdig = sizeof(Py_hash_t) * 2; > + uintmax_t hash = (uintmax_t) PyObject_Hash(arg); > + static const size_t hexdig = sizeof(hash) * 2; > char buffer[hexdig + 1]; > > - sprintf(buffer, "%0*lx", (int) hexdig, (unsigned long) hash); > + sprintf(buffer, "%0*"PRIxMAX, (int) hexdig, hash); > return PyUnicode_FromStringAndSize(buffer, hexdig); > } > -------------- > > cu, > Rudi